Modellierung und Simulation - Programmiertechniken: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 164: Zeile 164:
end
end
</syntaxhighlight>
</syntaxhighlight>
'''Aufgaben<br>'''
# Nutzen Sie die Funktionen <code>arguments</code> und <code>arguments</code>, um das Rauschen zu entfernen.
# Nutzen Sie die Funktionen <code>arguments</code> und <code>arguments</code>, um das Rauschen zu entfernen.
# Prüfen Sie mit <code>arguments</code>, dass der Übergabewert positiv ist.
# Prüfen Sie mit <code>arguments</code>, dass der Übergabewert positiv ist.

Version vom 3. Juli 2026, 06:29 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,
  • ihren Code dokumentieren und debuggen.

1. Programmierrichtlinien

Aufgaben

  1. Analysieren Sie den nachfolgenden Quelltext unter Berücksichtigung der Programmierrichtlinien für MATLAB®.
  2. Optimieren Sie den Quelltext.
a=5;
b=3;
c=a*b;
disp(c)

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.

3. Vektorisierung

Der folgende Code berechnet y=3x2+2x5 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

  1. Ersetzen Sie die Schleife durch eine vektorisierte Berechnung.
  2. Messen Sie die Zeitersparnis mittels tic und toc.

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.

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:

  • neuen Speicher reservieren,
  • die bisherigen Daten in den neuen Speicher kopieren,
  • den alten Speicher freigeben.

Dieser Vorgang kostet Zeit und wird bei großen Arrays sehr ineffizient.

for i=1:10000
    y(i)=i^2;
end

Aufgaben

  1. Optimieren Sie den Quelltext mit Vorallokation.
  2. Messen Sie die Zeitersparnis mittels tic und toc.

Erkenntnisse

Vorallokation ist besonders sinnvoll, wenn

  • die Größe des Arrays bereits bekannt ist,
  • Werte innerhalb einer Schleife berechnet werden,
  • große Datenmengen verarbeitet werden,
  • Echtzeitanwendungen oder effiziente Algorithmen entwickelt werden.
  • Ein Array sollte möglichst nie innerhalb einer Schleife wachsen. Reserviere den benötigten Speicher vorher mit zeros, ones, nan, cell oder einer passenden Vorallokationsfunktion.

6. Eingaben prüfen

Aufgaben

  1. Schreiben Sie eine Funktion Wurzel, die die Wurzel berechnet.
  2. Prüfen Sie mit arguments, dass der Übergabewert positiv ist.

7. Rauschen entfernen

x = x + 0.3*randn(size(x));
end

Aufgaben

  1. Nutzen Sie die Funktionen arguments und arguments, um das Rauschen zu entfernen.
  2. Prüfen Sie mit arguments, dass der Übergabewert positiv ist.

8. FTF eines Signals

Gegeben:

signal = randn(5000,1);
signal = signal + sin(2*pi*40*(0:4999)'/1000);

Erstellen Sie ein Programm mit folgenden Funktionen:

  • main.m
  • generateSignal()
  • filterSignal()
  • calculateFFT()
  • plotResults()

Bestimmen Sie folgende Werte und stellen Sie diese dar

  • Signalenergie berechnen
  • Spitzenwert bestimmen
  • Ereignisse oberhalb eines Schwellwerts markieren
  • dominante Frequenz bestimmen
  • Ergebnisse grafisch darstellen

9. Quelltext optimieren

Gegeben 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

Optimieren Sie den Quelltext.

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
  1. Optimieren Sie den Code.
  2. Verwenden Sie den @-Operator.
  3. Definieren Sie eine anonyme Funktion.
  4. Der Code soll auch für andere Eingangsvektoren funktionieren.

11. Function Handle mehrfach verwenden

Gegeben 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
  1. Verwenden Sie einen Function Handle.
  2. Berechnen Sie beliebige Harmonische.

12. Mehrfaches Kopieren vermeiden

Gegeben 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)
  1. Optimieren Sie den Code mit einer Schleife.

13. Objektorientierung

Gegeben ist folgender Quelltext:

radius = 5;

A = pi*radius^2;
U = 2*pi*radius;

fprintf("Fläche %.2f\n",A)
fprintf("Umfang %.2f\n",U)

Erstellen Sie eine Klasse

Circle

mit

  • Radius
  • Fläche
  • Umfang

14. Modultests

Gegeben ist folgender Quelltext:

function y = add(a,b)
y = a+b;
end

Es existieren keine Tests.

Aufgabe

Schreiben Sie eine MATLAB-Testklasse.

Ausführung:

runtests

15. Grafische Benutzeroberfläche

Gegeben ist folgender Quelltext:

x = 0:0.01:10;
plot(x,sin(x))

Aufgabe

Erweitern Sie das Programm um einen Schieberegler, mit dem die Frequenz des Sinussignals verändert werden kann.

Nützliche MATLAB-Befehle: uifigure, uislider, Callback-Funktionen, Function Handles (@) Schreiben Sie eine MATLAB-Testklasse.

16. Profiling

Gegeben ist folgender Quelltext:

for i=1:10000
    A = rand(100);
    B = inv(A);
end

Aufgabe

Analysieren Sie den Code mit dem MATLAB-Profiler und optimieren Sie ihn.

Nützliche MATLAB-Befehle: profile on, profile viewer Schreiben Sie eine MATLAB-Testklasse.

17. Struktur statt vieler Variablen

Gegeben ist folgender Quelltext:

xMean = mean(x);
xStd = std(x);
xMax = max(x);
xMin = min(x);

Aufgabe
Fassen Sie alle Ergebnisse in einer Struktur zusammen.



MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26