Modellierung und Simulation - Programmstrukturen: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(32 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 4: Zeile 4:
|-
|-
| '''Termin:''' || 24.04.2025
| '''Termin:''' || 24.04.2025
|-
| '''Feedback:''' || [https://app.wooclap.com/ wooclap Ereigniscode]: JNLXEK
|}
|}
== Aufgabe 5.1 - Programmiergrundlagen - Schleifen und Bedingungen ==
= Aufgabe 5.1 - Programmiergrundlagen - Schleifen und Bedingungen =
# Schreiben Sie ein MATLAB<sup>®</sup>-Skript, das mit Hilfe einer <code>for</code> -Schleife die Summe der Zahlen von 1 bis 100000 berechnet (z.&thinsp;B. <code>n=n+1</code>).
# Schreiben Sie ein MATLAB<sup>®</sup>-Skript, das mit Hilfe einer <code>for</code> -Schleife die Summe der Zahlen von 1 bis 100000 berechnet (z.&thinsp;B. <code>n=n+1</code>).
# Schreiben Sie ein MATLAB<sup>®</sup>-Skript, das mit Hilfe einer <code>while</code>-Schleife die Summe die Zahlen von 1 bis 100000 berechnet.
# Schreiben Sie ein MATLAB<sup>®</sup>-Skript, das mit Hilfe einer <code>while</code>-Schleife die Summe die Zahlen von 1 bis 100000 berechnet.
Zeile 15: Zeile 17:


'''Nützliche Befehle:''' [https://de.mathworks.com/help/matlab/ref/for.html <code>for</code>], [https://de.mathworks.com/help/matlab/ref/if.html <code>if</code>], [https://de.mathworks.com/help/matlab/ref/while.html <code>while</code>], [https://de.mathworks.com/help/matlab/ref/break.html <code>break</code>]
'''Nützliche Befehle:''' [https://de.mathworks.com/help/matlab/ref/for.html <code>for</code>], [https://de.mathworks.com/help/matlab/ref/if.html <code>if</code>], [https://de.mathworks.com/help/matlab/ref/while.html <code>while</code>], [https://de.mathworks.com/help/matlab/ref/break.html <code>break</code>]


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
Zeile 78: Zeile 79:
|}
|}


 
= Aufgabe 5.2 - Programmiergrundlagen - Funktionen =
== Aufgabe 5.2 - Programmiergrundlagen - Funktionen ==
# Recherchieren Sie den Begriff [https://www.mathworks.com/help/matlab/ref/function.html „MATLAB function"] und informieren Sie sich, was man darunter versteht.
# Schreiben Sie das MATLAB<sup>®</sup>-Skript aus Aufgabe 5.1.3 zu einer MATLAB<sup>®</sup>-Function mit dem Namen <code>analyse</code> um, die
# Schreiben Sie das MATLAB<sup>®</sup>-Skript aus Aufgabe 5.1.3 zu einer MATLAB<sup>®</sup>-Function mit dem Namen <code>analyse</code> um, die
## als Eingabeargument die Zahl n bekommt und dann
## als Eingabeargument die Zahl n bekommt und dann
## einen Vektor mit n Zufallszahlen zwischen 0 und 1 erzeugt
## einen Vektor mit n Zufallszahlen zwischen 0 und 1 erzeugt
## Anschließend soll die Funktion genau die Werte <math>x_1, x_2</math> und <math>x_3</math> wie in Aufgabe 4.4.3 berechnen und diese als Rückgabewerte zurückliefern.
## Anschließend soll die Funktion genau die Werte <math>x_1, x_2</math> und <math>x_3</math> wie in Aufgabe 5.1.3 berechnen und diese als Rückgabewerte zurückliefern.
## Machen Sie sich anhand der Funktion <code>analyse</code> mit dem Setzen von „Breakpoints" und dem MATLAB<sup>®</sup>-Debugger vertraut.
## Machen Sie sich anhand der Funktion <code>analyse</code> mit dem Setzen von „Breakpoints" und dem MATLAB<sup>®</sup>-Debugger vertraut.
# Schreiben Sie ein kurzes Matlab Skript, mit dem Sie die Funktion <code>analyse</code> aufrufen. Springen Sie dabei mit einem Breakpoint in die Funktion.
# Schreiben Sie ein kurzes Matlab Skript <code>start.m</code>, mit dem Sie die Funktion <code>analyse</code> aufrufen. Springen Sie dabei mit einem Breakpoint in die Funktion.
'''Nützliche Befehle:''' [https://de.mathworks.com/help/matlab/ref/function.html <code>function</code>]
'''Nützliche Befehle:''' [https://de.mathworks.com/help/matlab/ref/function.html <code>function</code>]
'''Nützlicher Artikel:''' [https://www.mathworks.com/help/matlab/ref/function.html MATLAB function]


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 5.2.1 - Funktion&thinsp;</strong>
| <strong>Musterlösung 5.2.1 - Funktion <code>analyse.m</code>&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%% Aufgabe 4.5 - Funktionen
| <source line lang="matlab" style="font-size:medium">%% Aufgabe 5.2 - Funktionen
function[x1 x2 x3] = analyse(n)
function[x1 x2 x3] = analyse(n)


Zeile 130: Zeile 131:
|}
|}
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 5.2.4 - Startskript&thinsp;</strong>
| <strong>Musterlösung 5.2.2 - Startskript <code>start.m</code>&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%% Skript testAnalyse ruft die Funktion auf.
| <source line lang="matlab" style="font-size:medium">%% Skript testAnalyse ruft die Funktion auf.
Zeile 137: Zeile 138:
%dbstop in analyse
%dbstop in analyse
[x1 x2 x3] = analyse(n)
[x1 x2 x3] = analyse(n)
</source>
|}
= Aufgabe 5.3 - Programmiergrundlagen - Messdaten simulieren =
[[Datei:MuS findeAusreisser.jpg|thumb|rigth|450px|Abb. 1:  Ausreisser in einer verrauschten Messung]]
# Schreiben Sie das Skript <code>simuliereAussreisser.m</code>, welche normalverteilte Spannungen (Mittelwert: 10&thinsp;V, Standardabweichung: 5&thinsp;V) simuliert.
# Die x-Achse Bildet die Zeit. Nehmen Sie den Index (1, 2, 3,...) in s.
# Bauen Sie zufällig einen Ausreißer in das Datenarray Spannung von 20&thinsp;V ein.
# Zeigen Sie das Ergebnis entsprechend Abb. 1. Eine graue Gerade bildet den Mittelwert, die Messwerte sind tote Punkte und der Ausreißer ist blau eingekreist.
# Speichern Sie die Variablen <code>Zeit</code> und <code>Spannung</code> in der Datei <code>Messdaten.mat</code>.
# Werten Sie den Quelltext mit Header, Kommentaren und Hilfe auf.
'''Nützliche Befehle:''' <code>randn, randi, save</code>
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung: simuliereAussreisser.m&thinsp;</strong>
|-
| <source line lang="matlab" style="font-size:medium">clear all; close all; clc
Messwerte  = randn(5)+10 % Zufallszahlen mit dem Mittelwert 10
Spannung = Messwerte(:)'
Zeit = 1:length(Spannung)
%% Ausreisser einbauen
Index = randi(length(Spannung))
Spannung(Index)=20;
plot(Zeit, Spannung,'r.')
hold on
ylim([0,20])
yline(10) % Wahrer Wert
plot(Zeit(Index),Spannung(Index),'bo')
legend('Messwerte','Wahrer Wert','Ausreisser')
save('Messdaten','Zeit',"Spannung")
</source>
|}
= Aufgabe 5.4 Logische Indizierung =
# Erzeugen Sie eine 5x5 Matrix mit 1²..5² als Inhalt so sortiert, dass die Summe in den Zeilen und spalten immer gleich sind.
# Finden Sie die Einträge > 20 über zwei verschachtelte Schleifen.
# Finden Sie die Einträge > 20 über zwei über Logische Indizierung.
'''Nützliche Befehle:''' <code>magic, for, if</code>
'''Nützlicher Artikel:''' [https://de.mathworks.com/company/technical-articles/matrix-indexing-in-matlab.html Matrix Indexing in MATLAB<sup>®</sup>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung: startLogicalIndexing.m&thinsp;</strong>
|-
| <source line lang="matlab" style="font-size:medium">%% Eingangsdaten erzeugen
m = magic(5) % 5x5 Matrix mit 1..5^2 als Inhalt so sortiert, dass die Summe in den Zeilen und spalten immer gleich sind
Zeile = m(1,:)
sum(Zeile)
Spalte = m(:,3)
sum(Spalte)
%% Aufgabe 1: Welche Matrixelemente sind >20?
%% Ansatz 1: 2 Schleifen
k=0;
for i=1:5
    for j=1:5
        if m(i,j)>20
            k=k+1;
            Ergebnis(k)=m(i,j)
        end
    end
end
%% Ansatz 2: Logical Indexing
aPositionGrosserZahlen = m > 20 % Array in dem für jede Zahl größer 20 eine 1 steht
m(aPositionGrosserZahlen)      % Darstellung der Werte als 1D Vektor
</source>
|}
= Aufgabe 5.5 Finde Ausreisser =
# Schreiben Sie das Skript <code>findeAusreisser.m</code> welches die Messdaten <code>Messdaten.mat</code> aus Aufgabe 5.3 lädt.
# Nutzen Sie Logische Indizierung, um die Außreißer zu finden.
# Nutzen Sie als zweiten Ansatz <code>Index = find(Spannung > 10)</code>
# Zeichnen Sie das Ergebnis gemäß Abb. 1.
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung: findeAusreisser.m&thinsp;</strong>
|-
| <source line lang="matlab" style="font-size:medium">load('Messdaten.mat')
%% Finde den Ausreißer
% Ansatz 1: Logical Indexing
Index = Spannung > 15
% Ansatz 2: find
Index = find(Spannung > 10)


plot(Zeit, Spannung,'r.')
hold on
ylim([0,20])
yline(10) % Wahrer Wert
plot(Zeit(Index),Spannung(Index),'bo')
legend('Messwerte','Wahrer Wert','Ausreisser','Location','northwest')
xlabel('Zeit in s')
ylabel('Spannung in V')
</source>
</source>
|}
|}
= Aufgabe 5.6 - Programmiergrundlagen - Systematische Programmierung =
Erzeugen Sie sich ein Framework für zukünftige Programmierarbeiten mit folgenden Ablauf:
# Header mit: Programmname, Autor, Änderungsdatum, Erstelldatum, Beschreibung, Input, Output
# Konsole löschen, Workspace bereinigen, Fenster schließen
# Initialisierung von Variablen etc.
# Simulationsschleife/Algorithmus
# Plots/Ausgabe etc.
Arbeiten Sie dabei mit Ausgaben vor und nach jedem Abschnitt. Bsp.: „Initialisation successful“.
'''Nützliche Befehle:''' [https://de.mathworks.com/help/matlab/ref/disp.html <code>disp</code>], fprintf
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 5.3&thinsp;</strong>
|-
| <source line lang="matlab" style="font-size:medium">%% Aufgabe 5.6 - Systematische Programmierung
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                        %                                                                     
% Funktion        : Framework                                            %
%                                                                        %
%                                                                        %
% Eingabe        : /                                                    %
%                                                                        %
%                                                                        %
% Ausgabe        : /                                                    %
%                                                                        %
%                                                                        %
% Autor          : Erika Musterfrau                                      %
%                                                                        %
% Implementation  : MATLAB R2016b                                        %
%                                                                        %
% Bemerkung      :                                                      %
%                                                                        %
% Änderungsdatum  : 09.03.2017                                            %
%                                                                        %
% Erstelldatum    : 09.03.2017                                            %
%                                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Matlab initialisieren
clear all;
close all;
clc;
%% Initialisierung von Variablen/Konstanten
disp('Starte Initialisierung');
%Hier kommt die Initialisierung hin
disp('Initialisation erfolgreich');
fprintf('\n');
%% Simulationsschleife/Algorithmus
disp('Programmstart');
%Hier kommen die Berechnungen hin
disp('Berechnung beendet');
fprintf('\n');
%% Plots/Ausgabe
figure(1);
%Hier kommen die Ausgabe hin
%% Fenster schließen
close 1
</source>
|}


----
----
→ Termine [[Einführung_in_MATLAB|1]] [[Modellierung_und_Simulation_-_Graphische_Darstellung|2]] [[Modellierung_und_Simulation_-_Plotten_von_symbolischen_Funktionen|3]] [[Modellierung_und_Simulation_-_Daten_%26_Dateizugriff|4]] [[Modellierung_und_Simulation_-_Programmstrukturen|5]] [[Modellierung_und_Simulation_-_Oberflächenprogrammierung|6]] <!--[[AlphaBot:_Gesteuerte_Geradeausfahrt|7]] [[AlphaBot: Geregelte Fahrt mit Linienverfolger|8]] [[AlphaBot: Parklücke suchen|10]] [[AlphaBot: Autonomes Einparken|11]] [[AlphaBot: Programmier-Challenge II SoSe26|12]]--><br>
→ [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br>
→ [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br>
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe26]]
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe26]]

Aktuelle Version vom 24. April 2026, 08:00 Uhr

Autor: Prof. Dr.-Ing. Schneider
Termin: 24.04.2025
Feedback: wooclap Ereigniscode: JNLXEK

Aufgabe 5.1 - Programmiergrundlagen - Schleifen und Bedingungen

  1. Schreiben Sie ein MATLAB®-Skript, das mit Hilfe einer for -Schleife die Summe der Zahlen von 1 bis 100000 berechnet (z. B. n=n+1).
  2. Schreiben Sie ein MATLAB®-Skript, das mit Hilfe einer while-Schleife die Summe die Zahlen von 1 bis 100000 berechnet.
  3. Schreiben Sie ein MATLAB®-Skript, das
    1. Einen Vektor X mit 10000 Zufallszahlen zwischen 0 und 1 erzeugt.
    2. Mit Hilfe einer for-Schleife den Index des ersten Elementes in X berechnet, das > 0.9 ist (falls ein solches existiert) und diesen Index in der Variablen x1 speichert.
    3. Mit Hilfe einer while-Schleife den Index des ersten Elementes in X berechnet, das< 0.1 ist (falls ein solches existiert) und diesen Index in der Variablen x2 speichert.
    4. Mit Hilfe von „ logical indexing" das erste Element findet, das echt zwischen 0.5 und 0.55 liegt (falls ein solches existiert) und diesen Index in der Variablen x3 speichert.

Nützliche Befehle: for, if, while, break

Aufgabe 5.2 - Programmiergrundlagen - Funktionen

  1. Schreiben Sie das MATLAB®-Skript aus Aufgabe 5.1.3 zu einer MATLAB®-Function mit dem Namen analyse um, die
    1. als Eingabeargument die Zahl n bekommt und dann
    2. einen Vektor mit n Zufallszahlen zwischen 0 und 1 erzeugt
    3. Anschließend soll die Funktion genau die Werte x1,x2 und x3 wie in Aufgabe 5.1.3 berechnen und diese als Rückgabewerte zurückliefern.
    4. Machen Sie sich anhand der Funktion analyse mit dem Setzen von „Breakpoints" und dem MATLAB®-Debugger vertraut.
  2. Schreiben Sie ein kurzes Matlab Skript start.m, mit dem Sie die Funktion analyse aufrufen. Springen Sie dabei mit einem Breakpoint in die Funktion.

Nützliche Befehle: function

Nützlicher Artikel: MATLAB function

Aufgabe 5.3 - Programmiergrundlagen - Messdaten simulieren

Abb. 1: Ausreisser in einer verrauschten Messung
  1. Schreiben Sie das Skript simuliereAussreisser.m, welche normalverteilte Spannungen (Mittelwert: 10 V, Standardabweichung: 5 V) simuliert.
  2. Die x-Achse Bildet die Zeit. Nehmen Sie den Index (1, 2, 3,...) in s.
  3. Bauen Sie zufällig einen Ausreißer in das Datenarray Spannung von 20 V ein.
  4. Zeigen Sie das Ergebnis entsprechend Abb. 1. Eine graue Gerade bildet den Mittelwert, die Messwerte sind tote Punkte und der Ausreißer ist blau eingekreist.
  5. Speichern Sie die Variablen Zeit und Spannung in der Datei Messdaten.mat.
  6. Werten Sie den Quelltext mit Header, Kommentaren und Hilfe auf.

Nützliche Befehle: randn, randi, save

Aufgabe 5.4 Logische Indizierung

  1. Erzeugen Sie eine 5x5 Matrix mit 1²..5² als Inhalt so sortiert, dass die Summe in den Zeilen und spalten immer gleich sind.
  2. Finden Sie die Einträge > 20 über zwei verschachtelte Schleifen.
  3. Finden Sie die Einträge > 20 über zwei über Logische Indizierung.

Nützliche Befehle: magic, for, if

Nützlicher Artikel: Matrix Indexing in MATLAB®

Aufgabe 5.5 Finde Ausreisser

  1. Schreiben Sie das Skript findeAusreisser.m welches die Messdaten Messdaten.mat aus Aufgabe 5.3 lädt.
  2. Nutzen Sie Logische Indizierung, um die Außreißer zu finden.
  3. Nutzen Sie als zweiten Ansatz Index = find(Spannung > 10)
  4. Zeichnen Sie das Ergebnis gemäß Abb. 1.

Aufgabe 5.6 - Programmiergrundlagen - Systematische Programmierung

Erzeugen Sie sich ein Framework für zukünftige Programmierarbeiten mit folgenden Ablauf:

  1. Header mit: Programmname, Autor, Änderungsdatum, Erstelldatum, Beschreibung, Input, Output
  2. Konsole löschen, Workspace bereinigen, Fenster schließen
  3. Initialisierung von Variablen etc.
  4. Simulationsschleife/Algorithmus
  5. Plots/Ausgabe etc.

Arbeiten Sie dabei mit Ausgaben vor und nach jedem Abschnitt. Bsp.: „Initialisation successful“.

Nützliche Befehle: disp, fprintf



→ Termine 1 2 3 4 5 6
MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26