Modellierung und Simulation - Programmstrukturen: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
| Zeile 5: | Zeile 5: | ||
| '''Termin:''' || 24.04.2025 | | '''Termin:''' || 24.04.2025 | ||
|- | |- | ||
| '''Feedback:''' || [https://app.wooclap.com/ wooclap | | '''Feedback:''' || [https://app.wooclap.com/ wooclap Ereigniscode]: JNLXEK | ||
|} | |} | ||
== Aufgabe 5.1 - Programmiergrundlagen - Schleifen und Bedingungen == | == Aufgabe 5.1 - Programmiergrundlagen - Schleifen und Bedingungen == | ||
Version vom 24. April 2026, 07:06 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
- Recherchieren Sie den Begriff „MATLAB function" und informieren Sie sich, was man darunter versteht.
- 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 4.4.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, mit dem Sie die Funktion
analyseaufrufen. Springen Sie dabei mit einem Breakpoint in die Funktion.
Nützliche Befehle: function
| Musterlösung 5.2.1 - Funktion |
%% 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.4 - Startskript |
%% 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')
|
→ MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26