Modellierung und Simulation - Programmstrukturen: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
| (21 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 = | |||
# 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. 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. 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 77: | Zeile 79: | ||
|} | |} | ||
= Aufgabe 5.2 - Programmiergrundlagen - Funktionen = | |||
# 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 | ## 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 </strong> | | <strong>Musterlösung 5.2.1 - Funktion <code>analyse.m</code> </strong> | ||
|- | |- | ||
| <source line lang="matlab" style="font-size:medium">%% Aufgabe 5.2 - Funktionen | | <source line lang="matlab" style="font-size:medium">%% Aufgabe 5.2 - Funktionen | ||
| Zeile 129: | Zeile 131: | ||
|} | |} | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Musterlösung 5.2. | | <strong>Musterlösung 5.2.2 - Startskript <code>start.m</code> </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 136: | Zeile 138: | ||
%dbstop in analyse | %dbstop in analyse | ||
[x1 x2 x3] = analyse(n) | [x1 x2 x3] = analyse(n) | ||
</source> | </source> | ||
|} | |} | ||
= Aufgabe 5.3 - Programmiergrundlagen - Messdaten simulieren = | |||
[[Datei:MuS findeAusreisser.jpg|thumb|rigth|450px|Abb. 1: Ausreisser in einer verrauschten Messung]] | [[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 V, Standardabweichung: 5 V) simuliert. | # Schreiben Sie das Skript <code>simuliereAussreisser.m</code>, welche normalverteilte Spannungen (Mittelwert: 10 V, Standardabweichung: 5 V) simuliert. | ||
| Zeile 150: | Zeile 152: | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Musterlösung: simuliereAussreisser.m </strong> | | <strong>Musterlösung: simuliereAussreisser.m </strong> | ||
|- | |- | ||
| <source line lang="matlab" style="font-size:medium">clear all; close all; clc | | <source line lang="matlab" style="font-size:medium">clear all; close all; clc | ||
| Zeile 174: | Zeile 176: | ||
|} | |} | ||
== | = 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 </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 </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> | |||
|} | |||
= 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 </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
- 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). - Schreiben Sie ein MATLAB®-Skript, das mit Hilfe einer
while-Schleife die Summe die Zahlen von 1 bis 100000 berechnet. - Schreiben Sie ein MATLAB®-Skript, das
- Einen Vektor X mit 10000 Zufallszahlen zwischen 0 und 1 erzeugt.
- 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 speichert. - 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 speichert.
- 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 speichert.
Nützliche Befehle: for, if, while, break
| Musterlösung 5.1 |
%% Aufgabe 5.1 - Schleifen und Bedingungens
clear all
%(a)
Summe1 = 0;
for i=0:1:100000
Summe1 = Summe1+i;
end
%(b)
Summe2 = 0;
i = 0;
while i<=100000
Summe2 = Summe2+i;
i = i+1;
end
clear all
%(c)
VektorX = rand(1,10000);
%Element finden, welches >0.9 ist
for i=1:1:10000
if(VektorX(i)>0.9)
x1 = i;
break;
end
end
%Element finden, welches <0.1 ist
i=1;
while i<=10000
if(VektorX(i)<0.1)
x2 = i;
break;
end
i = i+1;
end
%Element finden, welches zwischen 0.5 und 0.55 liegt
%% Möglichkeit 1: Schleife
for i=1:1:10000
if(VektorX(i)>=0.50 && VektorX(i)<=0.55)
x3 = i;
break;
end
end
%% Möglichkeit 2: logical indexing
Logic_Vek = VektorX >= 0.50 & VektorX <= 0.55;
x3_new = find(Logic_Vek,1);
|
Aufgabe 5.2 - Programmiergrundlagen - Funktionen
- Schreiben Sie das MATLAB®-Skript aus Aufgabe 5.1.3 zu einer MATLAB®-Function mit dem Namen
analyseum, die- als Eingabeargument die Zahl n bekommt und dann
- einen Vektor mit n Zufallszahlen zwischen 0 und 1 erzeugt
- Anschließend soll die Funktion genau die Werte und wie in Aufgabe 5.1.3 berechnen und diese als Rückgabewerte zurückliefern.
- Machen Sie sich anhand der Funktion
analysemit dem Setzen von „Breakpoints" und dem MATLAB®-Debugger vertraut.
- Schreiben Sie ein kurzes Matlab Skript
start.m, mit dem Sie die Funktionanalyseaufrufen. Springen Sie dabei mit einem Breakpoint in die Funktion.
Nützliche Befehle: function
Nützlicher Artikel: MATLAB function
Musterlösung 5.2.1 - Funktion analyse.m
|
%% Aufgabe 5.2 - Funktionen
function[x1 x2 x3] = analyse(n)
VektorX = rand(1,n);
%Element finden, welches >0.9 ist
for i=1:1:10000
if(VektorX(i)>0.9)
x1 = i;
break;
end
end
%Element finden, welches <0.1 ist
i=1;
while i<=10000
if(VektorX(i)<0.1)
x2 = i;
break;
end
i = i+1;
end
%Element finden, welches zwischen 0.5 und 0.55 liegt
Logic_Vek = VektorX >= 0.50 & VektorX <= 0.55;
x3 = find(Logic_Vek);
if ~isempty(x3)
x3 = x3(1);
else
x3 = 0;
end
end
|
Musterlösung 5.2.2 - Startskript start.m
|
%% Skript testAnalyse ruft die Funktion auf.
n = 1000;
%dbstop in analyse
[x1 x2 x3] = analyse(n)
|
Aufgabe 5.3 - Programmiergrundlagen - Messdaten simulieren

- Schreiben Sie das Skript
simuliereAussreisser.m, welche normalverteilte Spannungen (Mittelwert: 10 V, Standardabweichung: 5 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 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
ZeitundSpannungin der DateiMessdaten.mat. - Werten Sie den Quelltext mit Header, Kommentaren und Hilfe auf.
Nützliche Befehle: randn, randi, save
| Musterlösung: simuliereAussreisser.m |
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")
|
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: magic, for, if
Nützlicher Artikel: Matrix Indexing in MATLAB®
| Musterlösung: startLogicalIndexing.m |
%% 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
|
Aufgabe 5.5 Finde Ausreisser
- Schreiben Sie das Skript
findeAusreisser.mwelches die MessdatenMessdaten.mataus Aufgabe 5.3 lädt. - Nutzen Sie Logische Indizierung, um die Außreißer zu finden.
- Nutzen Sie als zweiten Ansatz
Index = find(Spannung > 10) - Zeichnen Sie das Ergebnis gemäß Abb. 1.
| Musterlösung: findeAusreisser.m |
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')
|
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: disp, fprintf
| Musterlösung 5.3 |
%% 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
|
→ Termine 1 2 3 4 5 6
→ MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26