Modellierung und Simulation - Programmiertechniken: Unterschied zwischen den Versionen
| Zeile 116: | Zeile 116: | ||
xPos = x(positive); | xPos = x(positive); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Erkenntnis''' | |||
Die Verwendung logischer Indizes beschleunigt die Programmlaufzeit und macht den Quelltext lesbarer. | |||
= 5. Vorallokation (Preallocation) = | = 5. Vorallokation (Preallocation) = | ||
Version vom 3. Juli 2026, 07:09 Uhr
| Autor: | Prof. Dr.-Ing. Schneider |
| Lektion: | 12 |
| Termin: | 03.07.2026 |
Einleitung
MATLAB® ist eines der wichtigsten Werkzeuge für die numerische Berechnung, Datenanalyse und Simulation in den Ingenieur- und Naturwissenschaften. Neben der korrekten Umsetzung eines Algorithmus spielt dabei auch die Qualität des Programmcodes eine entscheidende Rolle. Gut strukturierter, effizienter und wartbarer Code erleichtert nicht nur die Fehlersuche und Weiterentwicklung, sondern verbessert häufig auch die Ausführungsgeschwindigkeit. In diesem Kurs lernen die Studierenden grundlegende und fortgeschrittene Programmiertechniken in MATLAB® kennen. Anhand praxisnaher Beispiele und Optimierungsaufgaben werden typische Programmierfehler identifiziert und bestehender Code schrittweise verbessert. Ziel ist es, moderne MATLAB®-Programme zu entwickeln, die übersichtlich, leistungsfähig und leicht wiederverwendbar sind.
Lernziele
Nach dem Kurs können die Teilnehmenden:
- effizienten und gut lesbaren MATLAB®-Code schreiben,
- Funktionen und Skripte sinnvoll einsetzen,
- Vektorisierung anstelle unnötiger Schleifen verwenden,
- Eingaben überprüfen,
- Code modular strukturieren,
- typische MATLAB®-Funktionen zur Datenverarbeitung anwenden,
- Programme lesbar, wartbar und wiederverwendbar strukturieren,
- ihren Code dokumentieren und debuggen.
1. Programmierrichtlinien
Aufgaben
- Analysieren Sie den nachfolgenden Quelltext unter Berücksichtigung der Programmierrichtlinien für MATLAB®.
- Optimieren Sie den Quelltext.
a=5;
b=3;
c=a*b;
disp(c)
| Lesbarkeit.m |
nLaenge = 5; % Verwenden Sie lesbare Variablennamen.
nBreite = 3;
nFlaeche = nLaenge * nBreite; % Rücken Sie Quelltext zur besseren Lesbarkeit ein.
fprintf('Fläche = %.2d\n', nFlaeche); % Verwenden Sie hilfreiche Kommentare.
|
Erkenntnisse
- Kommentare und Lesbare Variablen machen Quelltext verständlicher.
- Das Einrücken verbessert die Lesbarkeit.
2. Skripte und Funktionen
Ein Skript
- arbeitet im Workspace.
- ist leicht zu schreiben.
- ist schlecht wiederverwendbar.
radius = 3;
A = pi*radius^2;
Die Vorteile eine Funktion sind
- Wiederverwendbarkeit
- eigener Workspace
- einfach testbar
Aufgabe
Wandeln Sie das Skript in die Funktion berechneKreis um und starten Sie diese mit der Funktion testBerechneKreis.
| berechneKreis.m |
function [fA,fU] = berechneKreis(fRadius)
fA = pi*fRadius.^2;
fU = 2*pi*fRadius;
end
|
Erkenntnisse
- Wiederkehrende Berechnungen sollten in Funktionen ausgelagert werden.
- Funktionen fördern die Wiederverwendbarkeit und Wartbarkeit des Codes.
- Ein- und Ausgabeparameter strukturieren den Datenaustausch.
3. Vektorisierung
Der folgende Code berechnet mittels einer Schleife.
x=-10:0.1:10
for i=1:length(x)
y(i)=3*x(i)^2+2*x(i)-5;
end
Aufgabe
- Ersetzen Sie die Schleife durch eine vektorisierte Berechnung.
- Messen Sie die Zeitersparnis mittels
ticundtoc.
| Vektorisierung.m |
y=3.*x.^2+2.*x-5;
|
Erkenntnisse
- MATLAB® ist für Vektor- und Matrixoperationen optimiert.
- Schleifen können häufig durch elementweise Operationen ersetzt werden.
- Vektorisierter Code ist meist kürzer, besser lesbar und schneller.
- Elementweise Operatoren (
.*, ./, .^) sind sicher anzuwenden.
4. Logische Indizes
Der Quelltext sucht ineffizient alle Werte > 0.
x = randn(1000,1);
j=0;
for i=1:length(x)
if x>0
j=j+1;
xPos(j)=i;
end
end
Aufgabe
Optimieren Sie den Quelltext mit logischer Indizierung.
| LogischeIndizes.m | ||||||||||||||||||||||||||||||||||||||||||||||||||||
positive = x>0;
xPos = x(positive);
Erkenntnis Die Verwendung logischer Indizes beschleunigt die Programmlaufzeit und macht den Quelltext lesbarer. 5. Vorallokation (Preallocation)Eine Vorallokation (Preallocation) in MATLAB bedeutet, dass der benötigte Speicher für ein Array bereits vor einer Schleife reserviert wird. Dies ist eine der wichtigsten Maßnahmen zur Optimierung der Laufzeit von MATLAB-Programmen. Wenn ein Array innerhalb einer Schleife schrittweise wächst, muss MATLAB bei jeder Vergrößerung:
Dieser Vorgang kostet Zeit und wird bei großen Arrays sehr ineffizient. for i=1:10000
y(i)=i^2;
end
Aufgaben
Erkenntnisse
6. Eingaben prüfenAufgaben
7. Rauschen entfernenx = x + 0.3*randn(size(x));
end
Aufgabe
8. FTF eines SignalsGegeben: signal = randn(5000,1);
signal = signal + sin(2*pi*40*(0:4999)'/1000);
Aufgaben
Bestimmen Sie folgende Werte und stellen Sie diese dar
Erkenntnisse
9. Quelltext optimierenGegeben ist folgender Quelltext: x = rand(1,100000);
for i = 1:length(x)
if x(i) < 0.5
y(i) = 0;
else
y(i) = sqrt(x(i));
end
end
Aufgabe
10. Anonyme Funktionen (@-Operator)Gegeben ist folgender Quelltext: clear
clc
x = 0:0.01:10;
for i = 1:length(x)
y(i) = sin(x(i)) + cos(x(i));
end
plot(x,y)
grid on
Aufgaben
Erkentnisse
11. Function Handle mehrfach verwendenGegeben ist folgender Quelltext: x = linspace(0,2*pi,500);
y1 = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);
plot(x,y1)
hold on
plot(x,y2)
plot(x,y3)
grid on
Erkenntnisse 12. Mehrfaches Kopieren vermeidenGegeben ist folgender Quelltext: figure
subplot(2,2,1)
plot(x1,y1)
subplot(2,2,2)
plot(x2,y2)
subplot(2,2,3)
plot(x3,y3)
subplot(2,2,4)
plot(x4,y4)
Aufgabe
13. ObjektorientierungGegeben ist folgender Quelltext: radius = 5;
A = pi*radius^2;
U = 2*pi*radius;
fprintf("Fläche %.2f\n",A)
fprintf("Umfang %.2f\n",U)
Aufgabe Circle mit
14. ModultestsGegeben ist folgender Quelltext: function y = add(a,b)
y = a+b;
end
Es existieren keine Tests. Aufgabe
Ausführung: runtests 15. Grafische BenutzeroberflächeGegeben ist folgender Quelltext: x = 0:0.01:10;
plot(x,sin(x))
Aufgabe Nützliche MATLAB-Befehle:
16. ProfilingGegeben ist folgender Quelltext: for i=1:10000
A = rand(100);
B = inv(A);
end
Aufgabe Nützliche MATLAB-Befehle:
17. Struktur statt vieler VariablenGegeben ist folgender Quelltext: xMean = mean(x);
xStd = std(x);
xMax = max(x);
xMin = min(x);
Aufgabe
18. Tabellen statt SchleifenGegeben ist folgender Quelltext: for i=1:length(name)
fprintf("%s %.1f\n",name{i},punkte(i))
end
Aufgabe
19.
|
| vermeideSchleifen.m |
A = rand(5,8);
summe = sum(A,'all');
disp(summe)
|
Erkenntnise
length()liefert nur die größte Dimension eines Arrays und ist daher für Matrizen oft ungeeignet.- Für alle Elemente eines Arrays eignen sich Funktionen wie
numel()oder direkt MATLAB-Funktionen (sum, mean, max). - Bevorzugen Sie eingebaute MATLAB®-Funktionen gegenüber selbst geschriebenen Schleifen.
20. find vermeiden
Gegeben ist folgender Quelltext:
x = randn(1000,1);
idx = find(x > 2);
y = x(idx);
Aufgabe
Optimieren Sie den Code.
| vermeideFind.m |
x = randn(1000,1);
y = x(x>2);
|
Erkenntnis
find()wird häufig unnötig eingesetzt.- Logische Indizes sind kompakter, besser lesbar und in vielen Fällen effizienter.
- MATLAB® unterstützt logische Array-Operationen direkt.
21. Matrixmultiplikation
Gegeben ist folgender Quelltext:
A = rand(500);
B = rand(500);
for i=1:500
for j=1:500
C(i,j)=0;
for k=1:500
C(i,j)=C(i,j)+A(i,k)*B(k,j);
end
end
end
Aufgabe
Nutzen Sie MATLAB effizient.
| Matrixmultiplikation.m |
C = A*B;
|
Erkenntnis
Die eingebaute Matrixmultiplikation ist hochoptimiert.
22. Schleife durch arrayfun
Gegeben ist folgender Quelltext:
x = 1:100;
for i=1:length(x)
y(i)=factorial(x(i));
end
Aufgabe
Optimieren Sie den Quelltext.
| optimiereSchleife.m |
x = 1:100;
y = arrayfun(@factorial,x);
|
23. switch statt viele if
Gegeben ist folgender Quelltext:
mode = 2;
if mode==1
disp("Start")
elseif mode==2
disp("Stop")
elseif mode==3
disp("Pause")
elseif mode==4
disp("Reset")
end
Aufgabe
Verbessern Sie die Lesbarkeit.
| nutzeSwitchCase.m |
switch mode
case 1
disp("Start")
case 2
disp("Stop")
case 3
disp("Pause")
case 4
disp("Reset")
end
|
23. Magische Zahlen
Gegeben ist folgender Quelltext:
signal = randn(1000,1);
filtered = movmean(signal,17);
plot(filtered)
ylim([-3 3])
Aufgabe
Verbessern Sie die Wartbarkeit.
| nutzeSwitchCase.m |
windowSize = 17;
yLimit = 3;
signal = randn(1000,1);
filtered = movmean(signal,windowSize);
plot(filtered)
ylim([-yLimit yLimit])
|
→ MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26