Modellierung und Simulation - Wiederholung 1-6
| Autor: | Prof. Dr.-Ing. Schneider |
| Termin: | 11.04.2025 |
Aufgabe 7.1 - Funktionen
Schreiben Sie die Funktion Celsius im m-File Celsius.m, die eine übergebene Fahrenheit-Temperatur in den zugehörigen Celsius-Wert umrechnet und diesen zurückgibt:
function c = Celsius(fahr)
Zur Umrechnung von Grad Fahrenheit in Grad Celsius dient die Formel:
c = (5.0/9.0) * (fahr − 32)
Testen Sie Ihre Funktion mit mehreren Temperaturen.
Schreiben Sie eine weitere Funktion Fahrenheit, die eine übergebene Celsius-Temperatur in den Fahrenheit-Wert umrechnet:
function f = Fahrenheit(c)
Rufen Sie die beiden Funktionen auch hintereinander auf, also beispielsweise
>> f = Fahrenheit( Celsius( fahr ) )
| Musterlösung 7.1 |
% Aufgabe 7.1.1: Umrechung Fahrenheit nach Celsius
% c = Celsius( fahr )
function c = Celsius( fahr )
c = (5.0/9.0) * ( fahr - 32 );
end
% Aufgabe 7.1.2: Umrechung Celsius nach Fahrenheit
% f = Fahrenheit(c)
function f = Fahrenheit( c )
f = (9.0/5.0) * c + 32;
end
|
Aufgabe 7.2 - Funktionen
Erstellen Sie die Funktion Pythagoras im m-File Pythagoras.m, die aus den zwei
übergebenen Argumenten a und b die Zahl c nach dem Satz von Pythagoras berechnet,
also . Vor der Zuweisung des Rückgabewerts müssen Sie natürlich
noch die Wurzel aus ziehen:
function c = Pythagoras(a, b)
Testen Sie Ihre Funktion mit mehreren Zahlenpaaren.
| Musterlösung 7.2 |
%% Musterlösung Aufgabe 7.2 - Ein- und Ausgaben
function c = Pythagoras( a, b )
c_2 = a^2 + b^2;
c = sqrt( c_2 );
end);
|
Aufgabe 7.3 - Ein- und Ausgabe
Schreiben Sie die Funktion function u = UmfangInput(prompt). Die Daten für den Radius sollen über input von der Tastatur abgefragt werden. Die neue Funktion mit dem Namen UmfangInput muss in dem neuen m-File UmfangInput.m abgespeichert werden.
Als Eingabe-Aufforderung für den Radius dient der an die Funktion übergebene Text, der im Parameter prompt abgelegt ist. Nach der Berechnung des Umfangs werden der Radius und der Umfang mithilfe der Funktion fprintf ausgegeben.
| Musterlösung 7.3 |
%% Musterlösung Aufgabe 7.3 - Ein- und Ausgaben
function u = UmfangInput( prompt )
r = input( prompt ); % Radius von Tastatur einlesen
u = 2 * pi * r; % u enthält berechneten Umfang
fprintf( 'Der Umfang zum Radius %g ist: %g \n', r,u );
end
|
Aufgabe 7.4 - Ein- und Ausgabe
Erweitern Sie die Funktion UmfangInput, damit sie außer dem Umfang auch noch
die Kreisfläche berechnet. Die beiden Ergebnisse sollen sowohl mit fprintf ausgegeben als auch von der Funktion zurückgegeben werden.
Experimentieren Sie mit unterschiedlichen Formatanweisungen bei der Ausgabe mit fprintf, beispielsweise durch eine Variation der Zahl der Nachkommastellen.
| Musterlösung 7.4 |
function [umf, F] = KreisInput()
% Aufgabe 7.4: berechnet Kreisumfang und -fläche
% [umf, F] = KreisInput()
% Radius wird von der Tastatur eingelesen
% Einlesen des Radius von der Tastatur
r = input( 'Bitte Radius eingeben: ' );
% Berechnung des Umfangs aus dem Eingabewert und Rückgabe
umf = 2 * pi * r;
F = pi * r * r;
% Ausgabe des Ergebnisses auf dem Bildschirm
fprintf( 'Der Umfang zum Radius %g ist: %g \n', [r, umf] );
fprintf( 'Die Fläche zum Radius %g ist: %g \n', [r, F] );
end
|
Aufgabe 7.5 - Ein- und Ausgabe
rstellen Sie die Funktion AdditionInput, die nacheinander zwei Zahlen über den Aufruf von input anfordert und in den Variablen a und b speichert. Diese Zahlen werden danach addiert. Ihre Summe wird in der Variablen c zurückgegeben:
function c = AdditionInput()
Verwenden Sie zur Eingabe-Aufforderung einen geeigneten Prompt und testen Sie Ihre Funktion mit unterschiedlichen Zahlenpaaren.
Schreiben Sie eine zweite Funktion zur Addition, die analog UmfangVar mit einer variablen Übergabeliste arbeitet:
function c = AdditionVar(varargin)
| Musterlösung 7.4 |
% Aufgabe 7.5.1: Addiert zwei Zahlen
% c = AdditionInput()
% Die beiden Zahlen werden von der Tastatur eingelesen.
function c = AdditionInput()
fprintf( 'Die Funktion addiert zwei Zahlen: \n' );
% Einlesen der Zahlen von der Tastatur
a = input( 'Bitte 1. Zahl eingeben: ' );
b = input( 'Bitte 2. Zahl eingeben: ' );
% Berechnung der Summe
c = a + b;
% Ausgabe des Ergebnisses auf dem Bildschirm
fprintf( 'Die Summe von %g + %g ist %g \n', a, b, c );
end
% Aufgabe 7.5.2: Addiert zwei Zahlen, mit varargs
% c = AdditionVar(varargin)
% Die beiden Zahlen werden von der Tastatur eingelesen oder übergeben.
function c = AdditionVar(varargin)
fprintf( 'Die Funktion addiert zwei Zahlen: \n' );
% Test der Zahl der übergebenen Werte
if(nargin < 2)
% Einlesen der Zahlen von der Tastatur
a = input( 'Bitte 1. Zahl eingeben: ' );
b = input( 'Bitte 2. Zahl eingeben: ' );
else
a = varargin{1};
b = varargin{2};
end
% Berechnung der Summe
c = a + b;
% Ausgabe des Ergebnisses auf dem Bildschirm
fprintf( 'Die Summe von %g + %g ist %g \n', a, b, c );
end
|
Aufgabe 7.6 - Verzweigung
Schreiben Sie eine Funktion QuotientInput, die zwei Zahlen a und b von der Tastatur einliest.
Prüfen Sie, ob b gleich null ist. Geben Sie in diesem Fall eine Fehlermeldung aus.
Berechnen Sie ansonsten den Quotienten a/b und geben Sie das Ergebnis mit
fprintf aus. Testen Sie die Funktion mit mehreren Zahlenwerten.
| Musterlösung 7.6 |
% Aufgabe 7.6: Bildet den Quotienten zweier Zahlen
% c = QuotientInput()
% Die beiden Zahlen werden von der Tastatur eingelesen.
function c = QuotientInput()
fprintf( 'Die Funktion bildet den Quotienten zweier Zahlen: \n' );
% Einlesen der Zahlen von der Tastatur
a = input( 'Bitte 1. Zahl eingeben: ' );
b = input( 'Bitte 2. Zahl eingeben: ' );
if( b == 0 )
fprintf( 'Division durch Null! \n' );
c = Inf;
return;
end
% Berechnung des Quotienten
c = a / b;
% Ausgabe des Ergebnisses auf dem Bildschirm
fprintf( '%g / %g = %g \n', a, b, c );
end
|
Aufgabe 7.7 - Verzweigung
Schreiben Sie die Funktion intervall, die von der Tastatur eine Zahl einliest. Liegt diese Zahl im Intervall zwischen 10 und 99, wird sie zurückgegeben. Anderenfalls
erfolgt eine Fehlermeldung. Testen Sie die drei möglichen Fälle mit mehreren Zahlenwerten.
Schreiben Sie die weitere Funktion intervall2, die analog nur Eingabewerte außerhalb des Intervalls von 1 und 2 bearbeitet. Testen Sie die Funktion.
| Musterlösung 7.7 |
% Aufgabe 7.7.1: Testet, ob eine Zahl im Intervall [10,99] liegt
% erg = intervall1()
% Die Zahl wird von der Tastatur eingelesen.
function erg = intervall1()
z = input( 'Bitte Zahl eingeben: ' );
if( z < 10 || z > 99 )
fprintf( 'Zahl liegt außerhalb von [10,99] ! \n' );
erg = 0;
return;
end
% korrekte Zahl wird zurückgegeben
erg = z;
end
% Aufgabe 7.7.2: Testet, ob eine Zahl außerhalb [1,2] liegt
% erg = intervall2()
% Die Zahl wird von der Tastatur eingelesen.
function erg = intervall2()
z = input( 'Bitte Zahl eingeben: ' );
if( z >= 1 && z <= 2 )
fprintf( 'Zahl liegt innerhalb von [1,2] ! \n' );
erg = 0;
return;
end
% korrekte Zahl wird zurückgegeben
erg = z;
end
|
Aufgabe 7.8 - Verzweigung
Erstellen Sie die Funktion Auswahl, die als Erstes von der Tastatur ein Zeichen c einliest. Mit einer verschachtelten if-else-Abfrage soll dann in Abhängigkeit von c
wie folgt verfahren werden: Ist c das Zeichen „k“, wird von der Tastatur ein Radiuswert r abgefragt und die Kreisfläche berechnet. Ist c das Zeichen „q“, wird von der Tastatur die Kantenlänge a abgefragt und die Quadratfläche berechnet. Ist c das Zeichen „r“,
werden von der Tastatur die Länge l und die Breite b abgefragt und die Rechteckfläche berechnet. Kommt ein anderes Zeichen, wird eine Fehlermeldung ausgegeben. Zu jedem der regulären Fälle sollen die Lösung und der Flächentyp mit fprintf ausgegeben werden.
Schreiben Sie eine weitere Funktion Auswahl2, die anstelle der verschachtelten if-else-Abfragen eine switch-Anweisung verwendet, und testen Sie alle möglichen Fälle.
| Musterlösung 7.8 |
function Auswahl()
% Aufgabe 7.8.1: je nach Zeichen wird verschieden gehandelt
% Auswahl()
% Das Zeichen wird von der Tastatur eingelesen.
c = input( 'Zeichen (k, q oder r) eingeben: ', 's' );
if( c == 'k' )
fprintf( 'Berechnung der Kreisfläche: \n' );
r = input( 'Bitte Radius eingeben: ');
F = pi * r * r;
fprintf( 'Die Kreisfläche zum Radius %g ist %g.\n', r, F );
elseif( c == 'q' )
fprintf( 'Berechnung der Quadratfläche: \n' );
a = input( 'Bitte Kantenlänge eingeben: ');
F = a * a;
fprintf( 'Die Quadratfläche zur Kante %g ist %g.\n', a, F );
elseif( c == 'r' )
fprintf( 'Berechnung der Rechteckfläche: \n' );
a = input( 'Bitte Länge eingeben: ');
b = input( 'Bitte Breite eingeben: ');
F = a * b;
fprintf( 'Die Rechteckfläche zu %g und %g ist %g.\n', a, b, F );
else
fprintf( 'Unzulässiges Zeichen %c \n', c );
end
end
% Aufgabe 7.8.2: je nach Zeichen wird verschieden gehandelt
% Auswahl2()
% Das Zeichen wird von der Tastatur eingelesen.
function Auswahl2()
c = input( 'Zeichen (k, q oder r) eingeben: ', 's' );
switch( c )
case 'k'
fprintf( 'Berechnung der Kreisfläche: \n' );
r = input( 'Bitte Radius eingeben: ');
F = pi * r * r;
fprintf( 'Die Kreisfläche zum Radius %g ist %g.\n', r, F );
case 'q'
fprintf( 'Berechnung der Quadratfläche: \n' );
a = input( 'Bitte Kantenlänge eingeben: ');
F = a * a;
fprintf( 'Die Quadratfläche zur Kante %g ist %g.\n', a, F );
case 'r'
fprintf( 'Berechnung der Rechteckfläche: \n' );
a = input( 'Bitte Länge eingeben: ');
b = input( 'Bitte Breite eingeben: ');
F = a * b;
fprintf( 'Die Rechteckfläche zu %g und %g ist %g.\n', a, b, F );
otherwise
fprintf( 'Unzulässiges Zeichen %c \n', c );
end
end
|
Aufgabe 7.9 - Verzweigung
Erstellen Sie die Funktion Umfangsprache, die wie UmfangInput aus Aufgabe 7.4 arbeitet, die jedoch einen Eingabeparameter besitzt, mit dem man für die Aufforde
rung zur Radiuseingabe unterschiedliche Sprachen wählen kann, zum Beispiel mit „g“ für Deutsch: „Bitte Radius eingeben: “, mit „e“ für Englisch: „Please type in radius value: “ etc.
| Musterlösung 7.9 |
% function UmfangSprache( sprache ):
% Sprachabhängige Ausgaben
% sprache = 'g', 'e', 'f, 's', etc.
function UmfangSprache( sprache )
switch( sprache )
case 'g'
prompt = 'Bitte Radius eingeben: ';
pText = 'Der Umfang zum Radius %g ist %g. \n';
case 'e'
prompt = 'Please type in radius value: ';
pText = 'The circumsphere for radius %g is %g. \n';
case 'f'
prompt = 'Le rayon, s.v.p.: ';
pText = 'La circonference pour le rayon %g est %g \n';
case 's'
prompt = 'Indique el radio, por favor: ';
pText = 'La circunferencia del radio %g es %g \n';
otherwise
prompt = 'Bitte Radius eingaben: ';
pText = 'Der Umfang zum Radius %g ist %g. \n';
end
r = input( prompt );
u = 2 * pi * r;
fprintf( pText, r, u );
end
|
Aufgabe 7.10 - Schleifen
Erstellen Sie eine Funktion kubik, die mit einer Zählschleife rückwärts die Kubikwerte für x = 5 bis x = 2 ausgibt. Formatieren Sie die Ausgabe übersichtlich und erzeugen
Sie auch eine aussagekräftige Überschrift.
| Musterlösung 7.10 |
% Aufgabe 7.10: berechnet Kubik-Zahlen
% kubik()
function kubik()
fprintf( 'Kubik-Zahlen: \n' );
fprintf( ' n | n^3 \n' );
fprintf( '---------------\n' );
for( n=5:-1:2 )
q = n * n * n;
fprintf( ' %3d | %3d \n', n, q );
end
end
|
Aufgabe 7.11 - Schleifen
Erstellen Sie eine Funktion grosses_1x1, die das große Einmaleins für m = 11 bis m = 20 und n = 1 bis n = 10 ausgibt. Formatieren Sie die Tabelle übersichtlich.
| Musterlösung 7.11 |
% Aufgabe 2.5.2: berechnet das Große 1x1
% grosses_1x1()
function grosses_1x1()
fprintf( '\n');
fprintf( ' ---------- Grosses 1x1 ---------- \n' );
fprintf( '\n');
for( m=11:20 )
for( n=1:10 )
erg = m*n;
fprintf( ' %3.0f ', erg );
end
fprintf( '\n');
end
end
|
Aufgabe 7.12 - Schleifen
Schreiben Sie eine Funktion fakListe, die die Werte von n! für n = 1 bis n = 6 ausgibt. Zur Berechnung von n! für ein festes n können Sie die Funktion fakultaet verwenden.
| Musterlösung 7.12 |
% Aufgabe 7.12: berechnet Fakultäts-Liste
% fakListe()
function fakListe()
fprintf( 'Fakultäts-Liste: \n' );
fprintf( ' n | n! \n' );
fprintf( '---------------\n' );
for( n=1:6 )
% Aufruf der vorher geschriebenen Funktion fakultaet,
% deren M-File am besten im selben Verzeichnis liegt
f = fakultaet( n );
fprintf( ' %3d | %3d \n', n, f );
end
end
function erg = fakultaet( n ) % Zeile 1
z = 1; % Zeile 2
for( k=2:n ) % Zeile 3
z = z * k; % Zeile 4
end % Zeile 5
erg = z; % Zeile 6
end
|
Aufgabe 7.13 - Schleifen
Schreiben Sie die Funktion intervall, die nur Eingabewerte im Intervall zwischen 10 und 99 akzeptiert und ansonsten eine neue Zahl anfordert. Testen Sie die Funktion für alle möglichen Fälle.
| Musterlösung 7.13 |
% Aufgabe 7.13: Testet, ob eine Zahl im Intervall [10,99] liegt
% erg = intervall()
% Die Zahl wird von der Tastatur eingelesen.
function erg = intervall()
z = 0; % Start mit nicht akzeptabler Zahl
while( z < 10 || z > 99 )
z = input( 'Bitte Zahl eingeben: ' );
if( z < 10 || z > 99 )
fprintf( 'Zahl liegt außerhalb von [10,99] ! \n' );
end
end
% korrekte Zahl wird zurückgegeben
fprintf( 'Zahl %g war korrekt \n', z );
erg = z;
end
|
Aufgabe 7.14 - Schleifen
Schreiben Sie die Funktion Pytha(n), die unter den Zahlen von 1 bis n ganzzahlige Zahlen-Tripel a, b und c sucht, für die der Satz von Pythagoras gilt: a 2 + b 2 = c 2, wie beispielsweise für die Zahlen 3, 4, und 5, mit 32 + 42 = 52. Um zu testen, ob eine Zahl c ganzzahlig ist, können Sie c runden und das Ergebnis mit der ursprünglichen, nicht gerundeten Zahl c vergleichen. Das Runden erreichen Sie mit einem Cast auf int32, zum Beispiel g = int32( c ). Bei Gleichheit sollte die Differenz von g und c im Betrag kleiner sein als die MATLAB-Genauigkeit eps, also abs( g – c ) < eps.
| Musterlösung 7.14 |
function Pytha( nMax )
fprintf( 'a^2 + b^2 = c^2: ganzzahlig \n' );
fprintf( ' a | b | c \n' );
fprintf( '----------------------\n' );
for( a = 1:nMax )
bMax = sqrt( nMax^2 - a^2 );
for( b = a:bMax )
c = sqrt( a^2 + b^2 );
% c ist ganzzahlig
if( (c - floor(c)) < eps )
fprintf( ' %3d | %3d | %3d \n', a, b, int32(c) );
end
end
end
end
|
Aufgabe 7.15 - Schleifen
Schreiben Sie die Funktion sinus, die über folgende Taylorreihenentwicklung einen Näherungswert für den Sinus berechnet:
Die ersten Glieder der Reihe haben also die Form: Wählen Sie wie im Beispiel efunktion eine sinnvolle Schranke für den Abbruch der Summe. Testen Sie die Funktion mit mehreren Winkelwerten und vergleichen Sie die Ergebnisse mit den Werten der MATLAB-Funktion sin.
| Musterlösung 7.15 |
→ MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe25