Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 1 Einführung in MATLAB Aufgabe 1 Quadrieren Sie die Zahlen 3, pi, 1 und i mit Hilfe des Operators ^ und ziehen Sie aus den Ergebnissen jeweils die Wurzel (Funktion sqrt). Aufgabe 2 Wählen Sie unterschiedliche Winkel w zwischen 0 und Summe der Quadrate von sin(w) und cos(w). ür jeden Winkel die Aufgabe 3 Erzeugen Sie das 1x5-Array sval, das die fünf Sinus-Werte für die Bogenmaß-Winkel 0, /6, /4, /2 und enthält. Führen Sie die gleichen Rechnungen für die Grad-Winkel 0, 30°, 45°, 90° und 180° durch. Hierzu müssen Sie die Winkel ins Bogenmaß umrechnen, da die MATLAB-Funktionen sin und cos ihre Argumente im Bogenmaß erwarten – zur Erinnerung: entspricht 180°. Versuchen Sie es auch einmal mit den Funktionen sind und cosd. Aufgabe 4 Was erhalten Sie, wenn Sie den Spaltenvektor v = [2;3] mit der Matrix A = [1 0; 0 1] multiplizieren? Was ist das Ergebnis von A*A? Aufgabe 5 Erzeugen Sie einen Zeilenvektor, der als Komponenten nicht Zahlen, sondern Buchstaben enthält. Überprüfen Sie den Typ des Vektors mit der Funktion whos. Aufgabe 6 Versuchen Sie, durch bewusst falsche Anweisungen Fehlermeldungen zu erzeugen, um ein Gefühl dafür zu bekommen, wie MATLAB auf Fehler reagiert. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 1 Einführung in MATLAB Lösung Aufgabe 1 % % Aufgabe 1 % zi : Variable für die Zahl % qi : das Quadrat der Zahl % wi : die Wurzel aus dem Quadrat z1 = 3 q1 = z1^2 w1 = sqrt( q1 ) z2 = pi q2 = z2^2 w2 = sqrt( q2 ) z3 = -1 q3 = z3^2 w3 = sqrt( q3 ) z4 = i q4 = z4^2 w4 = sqrt( q4 ) % Lösung Aufgabe 2 % Aufgabe 2 % wi : verschiedene Winkel zwischen 0 und pi % ei : Summe von sin- und cos-Quadrat zu wi w1 = 0 e1 = sin(w1)^2 + cos(w1)^2 w2 = pi e2 = sin(w2)^2 + cos(w2)^2 w3 = pi/2 e3 = sin(w3)^2 + cos(w3)^2 w4 = pi/4 e4 = sin(w4)^2 + cos(w4)^2 w5 = pi/6 e5 = sin(w5)^2 + cos(w5)^2 % Lösung Aufgabe 3 % Aufgabe 3 % rval : Array mit verschiedenen Winkeln rval = [ 0, pi/6, pi/4, pi/2, pi ] sval = [ sin(0), sin(pi/6), sin(pi/4), sin(pi/2), sin(pi) ] frsin = sin( rval ) frcos = cos( rval ) Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 1 Einführung in MATLAB c = pi/180 wval = [ 0, 30, 45, 90, 180 ] cval = [ sin(0*c), sin(30*c), sin(45*c), sin(90*c), sin(180*c) ] fwsin = sin( wval * c ) dval = [ sind(0), sind(30), sind(45), sind(90), sind(180) ] fsind = sind( wval ) fcosd = cosd( wval ) % Lösung Aufgabe 4 % Aufgabe 4 v = [2;3] A = [1 0; 0 -1] A_v = A * v A_A = A * A % Lösung Aufgabe 5 % Aufgabe 5 % s = [ 'H', 'e', 'l', 'l', 'o' ] whos s % Lösung Aufgabe 6 % Aufgabe 6 % Beispiele für fehlerhafte Anweisungen e0 = 3,4 * 3 e1 = 'Hello, world' e2 = [5 2] * [3 3] Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 2 Funktionen in MATLAB Aufgabe 1 Erstellen Sie die Funktion Flaeche zur Berechnung der Kreisfläche: function F = Flaeche(r) Die Formel zur Berechnung der Kreisfläche lautet: F = * r2. Schreiben Sie auch eine sinnvolle H-Line und testen Sie sowohl die Funktion wie auch den Aufruf der H-Line. Aufgabe 2 Schreiben Sie die Funktion Kreis, die sowohl den Umfang wie auch die Fläche berechnet und die beiden Werte zurückgibt: function [umf,F] = Kreis(r) Testen Sie die Funktion und lassen Sie sich die einzelnen Rückgabeparameter im Command-Window anzeigen. Aufgabe 3 Schreiben Sie die Funktion Celsius, 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)) Aufgabe 4 Erstellen Sie die Funktion Addition, die zwei übergebene Argumente a und b addiert und deren Summe zurückgibt: function c = Addition(a,b) Testen Sie Ihre Funktion mit mehreren Zahlenpaaren. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 2 Funktionen in MATLAB Lösung Aufgabe 1 function u = Flaeche(r) % Aufgabe 1: Berechnung der Kreisfläche % u = Flaeche(r), r: Kreisradius % Berechnung der Fläche aus dem Eingangswert r erg = double ( pi * r * r ); % Zuweisung des Ergebnisses an den Rückgabewert u u = erg; Lösung Aufgabe 2 function [umf,F] = Kreis(r) % Aufgabe 2.1.2: Berechnung der Kreisdaten % [umf,F] = Kreis(r), r: Kreisradius % Berechnung F = double ( % Berechnung umf = double der Fläche aus dem Eingangswert r pi * r * r ); des Umfangs ( 2 * pi * r ); Lösung Aufgabe 3 function c = Celsius(fahr) % Aufgabe 3: Umrechung Fahrenheit nach Celsius % c = Celsius(fahr) c = (5.0/9.0) * ( fahr - 32 ); function f = Fahrenheit(c) % Aufgabe 3: Umrechung Celsius nach Fahrenheit % f = Fahrenheit(c) f = (9.0/5.0) * c + 32; Lösung Aufgabe 4 function c = Addition(a,b) % Aufgabe 4: Addition zweier Zahlen % c = Addition(ca,b) c = a + b; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 3 Ein- und Ausgabe in MATLAB Aufgabe 1 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. Aufgabe 2 Erstellen 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 zurückgegeben: function c = AdditionInput() Verwenden Sie zur Eingabe-Aufforderung einen geeigneten Prompt und testen Sie Ihre Funktion mit unterschiedlichen Zahlenpaaren. Aufgabe 3 Schreiben Sie eine Funktion, die einen Namen von der Tastatur anfordert und anschließend auf dem Bildschirm die Meldung 'Hallo ' mit dem Namen ausgibt: function NameInput() Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 3 Ein- und Ausgabe in MATLAB Lösung Aufgabe 1 function [umf,F] = KreisInput() % Aufgabe 1: 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]); Lösung Aufgabe 2 function c = AdditionInput() % Aufgabe 2: Addiert zwei Zahlen % c = AdditionInput() % Die beiden Zahlen werden von der Tastatur eingelesen. 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); Lösung Aufgabe 3 function NameInput() % Aufgabe 3: Gibt eingegeben Namen aus % NameInput() % Der Name wird von der Tastatur eingelesen. n = input('Bitte Namen eingeben: '); fprintf('Hello, %s \n',n); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 4 Verknüpfungen in MATLAB Aufgabe 1 Schreiben Sie eine Funktion, die zwei Zahlen a und b von der Tastatur einliest. Prüfen, ob b gleich null ist. In diesem Fall eine Fehlermeldung ausgeben. Ansonsten den Quotienten a/b berechnen und das Ergebnis mit fprintf ausgeben. Kommentieren Sie die Funktion im Programm-Code und vergessen Sie auch die H-Line nicht. Testen Sie die Funktion mit mehreren Zahlenwerten. Aufgabe 2 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. Aufgabe 3 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 pi*r*r berechnet. Ist c das Zeichen „q“, wird von der Tastatur die Kantenlänge a abgefragt und die Quadratfläche a*a berechnet. Ist c das Zeichen „r“, werden von der Tastatur die Länge l und die Breite b abgefragt und die Rechteckfläche l*b 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-elseAbfragen eine switch-Anweisung verwendet, und testen Sie alle möglichen Fälle. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 4 Verknüpfungen in MATLAB Lösung Aufgabe 1 function c = QuotientInput() % Aufgabe 1: Bildet den Quotienten zweier Zahlen % c = QuotientInput() % Die beiden Zahlen werden von der Tastatur eingelesen. 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); Lösung Aufgabe 2 function erg = intervall1() % Aufgabe 2a: Testet, ob eine Zahl im Intervall [10,99] liegt % erg = intervall1() % Die Zahl wird von der Tastatur eingelesen. 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; function erg = intervall2() % Aufgabe 2b: Testet, ob eine Zahl außerhalb [1,2] liegt % erg = intervall2() % Die Zahl wird von der Tastatur eingelesen. 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; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 4 Verknüpfungen in MATLAB Lösung Aufgabe 3 function Auswahl() % Aufgabe 3a: je nach Zeichen wird verschieden gehandelt % Auswahl() % Das Zeichen wird von der Tastatur eingelesen. c = input('Zeichen (k, q oder r) eingeben: '); 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 function Auswahl2() % Aufgabe 3b: je nach Zeichen wird verschieden gehandelt % Auswahl2() % Das Zeichen wird von der Tastatur eingelesen. c = input('Zeichen (k, q oder r) eingeben: '); 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; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 4 Verknüpfungen in MATLAB fprintf('Die Rechteckfläche zu %g und %g ist %g.\n', a, b, F); end otherwise fprintf('Unzulässiges Zeichen %c \n', c); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 5 Schleifen in MATLAB Aufgabe 1 Erstellen Sie eine Funktion, die mit einer Zählschleife rückwärts die Kubikwerte x3 für x=5 bis x=2 ausgibt. Formatieren Sie die Ausgabe übersichtlich und erzeugen Sie auch eine aussagekräftige Überschrift. Aufgabe 2 Erstellen Sie eine Funktion, die das große Einmaleins für m=11 bis m=20 und n=1 bis n=10 ausgibt. Formatieren Sie die Tabelle übersichtlich. Aufgabe 3 Schreiben Sie eine Funktion, die die Werte von n! für n=1 bis n=6 ausgibt. Tipp: Zur Berechnung von n! für ein festes n können Sie die bereits fertig gestellte Funktion fakultaet verwenden. Aufgabe 4 Schreiben Sie die Funktion intervall, die nur Eingabewerte im Intervall zwischen 10 und 99 akzeptiert. Testen Sie die Funktion für alle möglichen Fälle. Aufgabe 5 Schreiben Sie die Funktion sinus, die über folgende Reihenentwicklung einen Näherungswert für den Sinus: x y = sinus(x) = ( 1)( )/ , n = 1, 3, 5, 7, .. n! Die ersten Glieder der Reihe haben also die Form: y= x 1! x x + 3! 5! =x x x + 6 120 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. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 5 Schleifen in MATLAB Lösung Aufgabe 1 function kubik() % Aufgabe 1: berechnet Kubik-Zahlen % 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 Lösung Aufgabe 2 function grosses_1x1() % Aufgabe 2: berechnet das Große 1x1 % 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 Lösung Aufgabe 3 function fakListe() % Aufgabe 3: berechnet Fakultäts-Liste % 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 function erg = fakultaet(n) z = 1; for(k=2:n) z = z * k; end erg = z; % Zeile 1 % Zeile % Zeile 3 % Zeile % Zeile % Zeile 2 4 5 6 Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 5 Schleifen in MATLAB Lösung Aufgabe 4 function erg = intervall() % Aufgabe 4: Testet, ob eine Zahl im Intervall [10,99] liegt % erg = intervall() % Die Zahl wird von der Tastatur eingelesen. 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; Lösung Aufgabe 5 function y = sinus(x, epsi, ausgabe) % Aufgabe 5: berechnet den Sinus % y = sinus(x, epsi, ausgabe) % x : Winkel im Bogenmaß % epsi : Schranke zum Abbruch % ausgabe : ob Zahl der Summanden ausgegeben wird % % Verwendete Rekursionsformel für Summenglieder: % sn = - sn * x*x / (n*(n-1)) % mit Startwert: s1 = x n = 1; sn = x; z = sn; % 1 = Startnummer des Summanden % 1. Summand = x % Zwischensumme = x while(abs(sn) > epsi) % Kriterium zum Weitermachen n = n + 2; % nächste Summandennummer sn = - sn * x*x / (n *(n-1)); % aktueller Summand z = z + sn; % Summand zu Zwischensumme addieren end y = z; % Rückgabe der Summe if(ausgabe) % Kontrollausgabe, falls ausgabe == 1 fprintf('Zahl der Summanden: %g \n', n); fprintf('Wert sinus(%g) = %16.15g \n', x, y); fprintf('Differenz zu MATLAB-sin: %g \n', y - sin(x)); end Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 6 Felder in MATLAB Aufgabe 1 Schreiben Sie die Funktion res = vecAddition(v1, v2), die die beiden Spaltenvektoren v1 und v2 addiert und das Ergebnis in res zurückgibt. Testen Sie die Funktion, zum Beispiel mit den Vektoren v1 = [1;2;3] und v2 = [2;1;3]. Aufgabe 2 Schreiben Sie die Funktion A = Drehung(w), die aus dem Drehwinkel w die zugehörige zweidimensionale Drehmatrix A berechnet. Die Drehmatrix A ist wie folgt definiert: A = [cos(w), -sin(w); sin(w), cos(w)] Testen Sie die Funktion mit unterschiedlichen Winkeln. Welche Matrizen erhält man beispielsweise für die Winkel /2 (90 Grad), (180 Grad) und 2 (360 Grad)? Aufgabe 3 Schreiben Sie die Funktion fncPlot, die analog der sin-Funktion die Funktion f(x) = (x*x*x + 5*x) * cos(3*x) im Intervall x = [5,+6] zeichnet. Aufgabe 4 Erstellen Sie die Funktion d = Drehung(w, v), die den übergebenen 2D-Spaltenvektor v um den Winkel w dreht und den gedrehten Vektor d zurückgibt. Die Drehung eines Vektors v kann über die Multiplikation mit der zum Winkel w gehörenden Drehmatrix A (siehe oben) realisiert werden: d = A * v; Testen Sie die Funktion Drehung, beispielsweise für w = pi/2 und v = [1;0]. Schreiben Sie eine weitere Funktion [dx,dy] = linTransf(w, v, t), die nach einer Drehung noch eine Verschiebung um den Vektor t = [tx;ty] vornimmt: d = A * v + t; Testen Sie mit unterschiedlichen Verschiebungen, zum Beispiel für t = [0;1]. Unterscheiden sich die Ergebnisse, wenn man die Reihenfolge der Operationen vertauscht, also zuerst dreht und dann verschiebt bzw. zuerst verschiebt und dann dreht? Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 6 Felder in MATLAB Lösung Aufgabe 1 function res = vecAddition(v1, v2) % Aufgabe 1: addiert zwei Vektoren % res = vecAddition(v1, v2) res = v1 + v2; Lösung Aufgabe 2 function A = Drehung(w) % Aufgabe 2: berechnet eine Drehmatrix % A = Drehung(w) % w : Drehwinkel im Bogenmaß A(1,1) A(1,2) A(2,1) A(2,2) = cos(w); = - sin(w); = sin(w); = cos(w); Lösung Aufgabe 3 function fncPlot(anfang, ende, diff) % Aufgabe 3: Funktions-Plot % fncPlot(anfang, ende, diff) % anfang : Startpunkt, z.B. -5 % ende : Endpunkt, z.B. +6 % diff : Abstand der Stützstellen, z.B. 0.1 % 1. Berechnungspunkt: anfang akt = anfang; % 1. Element der Matrix n = 1; % Vektoren x und y berechnen, bis ende erreicht ist while (akt <= ende) % x-Matrix von anfang bis ende x(n) = akt; % y-Matrix = sin-Wert zu x y(n) = (x(n)*x(n)*x(n) + 5*x(n))*cos(3*x(n)); % nächste Vektorkomponente wählen n = n +1; % akt. Berechnungspunkt, um diff weiter akt = akt + diff; end % Daten plotten plot(x,y,'r'); % dazu Grid einschalten grid on; title('Funktion: (x*x*x + 5*x)*cos(3*x)'); xlabel('x-Achse'); ylabel('y-Achse'); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 6 Felder in MATLAB Lösung Aufgabe 4 function d = VecDrehung(w, v) % Aufgabe 4a: dreht einen Vektor um Winkel % d = VecDrehung(w, v) % w : Drehwinkel im Bogenmaß % v : der zu drehende Vektor A(1,1) A(1,2) A(2,1) A(2,2) = cos(w); = - sin(w); = sin(w); = cos(w); d = A * v; function [dx,dy] = linTransf(w, v, t) % Aufgabe 4b: Lineare Transformation % [dx,dy] = linTransf(w, v, t) % w : Drehwinkel im Bogenmaß % v : der zu drehende Vektor % t : Verschiebungsvektor A(1,1) A(1,2) A(2,1) A(2,2) = cos(w); = - sin(w); = sin(w); = cos(w); d = A * v + t; dx = d(1); dy = d(2); function [dx,dy] = linTransf2(w, v, t) % Aufgabe 4c: Lineare Transformation % [dx,dy] = linTransf2(w, v, t) % w : Drehwinkel im Bogenmaß % v : der zu drehende Vektor % t : Verschiebungsvektor % 2. Variante: erst verschieben und dann drehen A(1,1) A(1,2) A(2,1) A(2,2) = cos(w); = - sin(w); = sin(w); = cos(w); % erst verschieben und dann drehen d = A * (v + t); dx = d(1); dy = d(2); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 7 Grafik in MATLAB Aufgabe 1 Erstellen Sie die Funktion polyPlot, die folgende Funktionen zusammen in einem Grafikfenster ausgibt, für x im Intervall [2,2]: y1 = x; y2 = x2; y3 = x3; y4 = x4 ; Bringen Sie auch eine Überschrift und entsprechende Beschriftungen (Legende) an. Versuchen Sie, auch andere Funktionen zu plotten. Aufgabe 2 Erstellen Sie die Funktion dataPlot, die eine gewisse Menge von Zahlen (zum Beispiel zehn Zahlen) über eine Schleife von der Tastatur einliest und diesen Datensatz in einer 2D-Grafik ausgibt. Testen Sie die Funktion und stellen Sie im Programm sicher, dass von der Tastatur auch wirklich nur Zahlenwerte eingelesen werden. Aufgabe 3 Erstellen Sie die Funktion flaeche3d, die mit der Funktion surf eine 3D-Fläche zeichnet, wobei die Höhe z über der x-y-Ebene durch folgende Punkte (y,x) definiert ist: z = 0 2 3 0 0 2 3 0 Erweitern Sie die Funktion, indem Sie die z-Werte für die Höhe über die Tastatur einlesen (mittels einer verschachtelten Zählschleife!). Stellen Sie im Programm sicher, dass von der Tastatur auch wirklich nur Zahlenwerte eingelesen werden. Aufgabe 4 Erstellen Sie die Funktion multPlot, die mit Hilfe der Funktion subplot die Fläche aus der vorherigen Aufgabe vierfach in einem einzigen Fenster darstellt. Wählen Sie für die einzelnen Plots unterschiedliche Ansichten mittels der Funktion view(Azimuth, Elevation), zum Beispiel die Standardansichten einer Fertigungszeichnung. Speichern Sie die Zeichnung im bmp-, jpg- oder tif-Format ab. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 7 Grafik in MATLAB Lösung Aufgabe 1 function polyPlot() % Aufgabe 1: Funktions-Plot % polyPlot() x = [-2:0.1:2]; y1 y2 y3 y4 = = = = x; x.*x; x.*x.*x; x.*x.*x.*x; hold on plot(x,y1,'r-'); plot(x,y2,'g:'); plot(x,y3,'b.-'); plot(x,y4,'m--'); legend('x','x*x','x*x*x','x*x*x*x'); hold off Lösung Aufgabe 2 function dataPlot(num) % Aufgabe 2: Daten-Plot % dataPlot() % num : Zahl der zu plottenden Daten fprintf('%g Daten werden eingelesen: \n', num); % Vektoren x und y belegen for (n = 1:num) % x-Vektor von 1 bis num x(n) = n; % nächste Zahl von Tastatur holen zahl = 0; % Vorbelegung: keine Zahl % innere Schleife, bis wirklich auch Zahl eingegeben while(zahl == 0) next = input('nächste Zahl: '); % Check, ob Eingabe einen Zahl ist zahl = isnumeric(next); % keine Zahl, d.h. nochmal nachfragen if(zahl == 0) fprintf('Eingabe war keine Zahl - '); end end % y-Vektor = eingelesener Wert zu x y(n) = next; end % Daten plotten plot(x,y,'k:s'); % dazu Grid einschalten grid on; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 7 Grafik in MATLAB title('Daten-Plot'); xlabel('x-Achse'); ylabel('y-Achse'); Lösung Aufgabe 3 function flaeche3d() % Aufgabe 3a: Flächen-Plot % flaeche3d() % Definition der Fläche z = [ 0 2 3 0; 0 2 3 0 ]; surf(z); xlabel('x-Achse') ylabel('y-Achse') zlabel('z-Achse') function flaecheInput() % Aufgabe 3b: Flächen-Plot % flaecheInput() % Definition der Fläche % Daten werden von Tastatur gelesen for(m=1:2) % 2 Zeilen for(n=1:4) % 4 Spalten % innere Schleife, bis wirklich auch Zahl eingegeben zahl = 0; while(zahl == 0) next = input('nächster Höhenwert: '); % Check, ob Eingabe einen Zahl ist zahl = isnumeric(next); % keine Zahl, d.h. nochmal nachfragen if(zahl == 0) fprintf('Eingabe war keine Zahl - '); end end % Zahl in Array übernehmen z(m,n) = next; end end surf(z); xlabel('x-Achse') ylabel('y-Achse') zlabel('z-Achse') Lösung Aufgabe 4 function multPlot() % Aufgabe 4: Flächen-Plot % flaeche3d() % Definition der Fläche z = [ 0 2 3 0; 0 2 3 0 ]; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 7 Grafik in MATLAB figure subplot(2,2,1); mesh(z); view(0, 90) axis square subplot(2,2,2); mesh(z); view(90, 0) axis square subplot(2,2,3); mesh(z); view(0, 0) axis square subplot(2,2,4); mesh(z); view(-45, 45) axis square xlabel('x-Achse') ylabel('y-Achse') zlabel('z-Achse') Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 8 Strukturen in MATLAB Aufgabe 1 Erweitern Sie die Funktion print_person, indem Sie zum struct person folgende weitere Komponenten hinzufügen, die Sie ebenfalls von der Tastatur einlesen lassen: • Straße • Hausnummer • Postleitzahl • Ort • Geburtsdatum [Array aus 3 Zahlen] Aufgabe 2 Erstellen Sie die Funktion find_person, die den struct person verwendet, um eine Liste mit Personendaten zu erstellen. Nach der Tastaturabfrage einer Telefonnummer soll die Funktion die zu dieser Nummer gehörende Person in der Liste identifizieren und deren Daten auf dem Bildschirm ausgeben. Aufgabe 3 Erweitern Sie die Funktion pyramide dahingehend, dass sie andere 3D-Körper mit geraden Linien darstellt, beispielsweise einen Quader, eine Pyramide mit dreieckiger Basis, ein Prisma etc. Die Parameter und der Typ der Körper werden über die Tastatur eingegeben. Mit einer switch-Anweisung schalten Sie dann zur Berechnung der Körperlinien. Aufgabe 4 Erweitern Sie das OOP-Beispiel drahtmodell um folgende Methoden: • function d = addPt( d, x, y, z ) fügt einen weiteren Punkt zur Datenbasis hinzu. • function d = addLn( d, n1, n2 ) fügt eine weitere Linie zur Datenbasis hinzu. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 8 Strukturen in MATLAB Lösung Aufgabe 1 function print_person2( num_pers ) % Aufgabe 1: struct-Erzeugung % print_person2( num_pers ) % struct person definieren person = struct( 'name', '', 'telnr', 0, ... 'str', '', 'nr', 0, ... 'plz', '', 'ort', '', ... 'geb', [] ); fprintf( 'Bitte die Daten von %g Personen eingeben: \n', num_pers ); % Einleseschleife: von n=1 bis n=num_pers for( n = 1:num_pers ) person(n).name = input( 'Name: ' ); person(n).telnr = input( 'Tel.-Nr.: ' ); person(n).str = input( 'Straße: ' ); person(n).nr = input( 'Hausnummer: ' ); person(n).plz = input( 'Postleitzahl: ' ); person(n).ort = input( 'Ort: ' ); fprintf( 'nun der Geburtstag, nacheinander Tag, Monat, Jahr\n'); person(n).geb(1) = input( 'Geburtstag: ' ); person(n).geb(2) = input( 'Geburtsmonat: ' ); person(n).geb(3) = input( 'Geburtsjahr: ' ); fprintf( '\n' ); end % Überschrift ausgeben fprintf( '\nMeine Freunde : \n' ); fprintf( '---------------\n' ); % Ausgabeschleife for( n = 1:num_pers ) fprintf( 'Name: %s, Tel.Nr.: %g \n', ... person(n).name, person(n).telnr ); fprintf( 'Adresse: %s %g \n', ... person(n).str, person(n).nr ); fprintf( '%g %s \n', ... person(n).plz, person(n).ort ); fprintf( 'Geburtstag: %g.%g.%g \n\n', ... person(n).geb(1), person(n).geb(2), person(n).geb(3) ); end Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 8 Strukturen in MATLAB Lösung Aufgabe 2 function find_person( num_pers ) % Aufgabe 2: Suche in struct % find_person( num_pers ) % struct person definieren person = struct( 'name', '', 'telnr', 0 ); fprintf( 'Bitte die Daten von %g Personen eingeben: \n', num_pers ); % Einleseschleife: von n=1 bis n=num_pers for n = 1:num_pers person(n).name = input( 'Name: ' ); person(n).telnr = input( 'Tel.-Nr.: ' ); fprintf( '\n' ); end telNr = input( 'Gesuchte Telefonnummer: ' ); telGefunden = 0; % Flag, ob Tel-Nr. gefunden wurde % Suche in struct-Array for n = 1:num_pers if( telNr == person(n).telnr ) fprintf( 'Gefunden: %s hat die Tel.Nr.: %g \n', ... person(n).name, person(n).telnr ); telGefunden = 1; end end % Meldung, falls keine Person gefunden wurde if( telGefunden == 0 ) fprintf( 'Es wurde keine Person mit Tel-Nr. %g gefunden. \n', ... telNr ); end Lösung Aufgabe 3 function koerper() % Aufgabe 3: zeichnet verschiedene 3D-Körper % koerper() pt = struct( 'x', 0, 'y', 0, 'z', 0 ); ln = struct( 'p1', [], 'p2', [] ); typ = input( 'Körper-Typ (´p´=Pyramide, ´q´=Quader): ' ); % Unterschiedliche Geometrien je nach Körpertyp: anzLn = 0; laenge = 0; hoehe = 0; switch( typ ) case 'p' anzLn = 8; laenge = input( 'Seitenlänge der Pyramide: ' ); hoehe = input( 'Höhe der Pyramide: ' ); % Definition der Punkte des Körpers Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 8 Strukturen in MATLAB pt(1).x pt(2).x pt(3).x pt(4).x pt(5).x = = = = = 0; laenge; laenge; 0; laenge/2; pt(1).y pt(2).y pt(3).y pt(4).y pt(5).y = = = = = 0; 0; laenge; laenge; laenge/2; pt(1).z pt(2).z pt(3).z pt(4).z pt(5).z % Definition der Linien des Körpers über ln(1) = struct( 'p1', pt(1), 'p2', pt(2) ln(2) = struct( 'p1', pt(2), 'p2', pt(3) ln(3) = struct( 'p1', pt(3), 'p2', pt(4) ln(4) = struct( 'p1', pt(4), 'p2', pt(1) Punkte ); ); ); ); ln(5) ln(6) ln(7) ln(8) ); ); ); ); = = = = struct( struct( struct( struct( 'p1', 'p1', 'p1', 'p1', pt(1), pt(2), pt(3), pt(4), 'p2', 'p2', 'p2', 'p2', pt(5) pt(5) pt(5) pt(5) = = = = = 0; 0; 0; 0; hoehe; = = = = = = = = 0; 0; 0; 0; hoehe; hoehe; hoehe; hoehe; case 'q' anzLn = 12; laenge = input( 'Seitenlänge des Quaders: ' ); hoehe = input( 'Höhe des Quaders: ' ); % Definition der Punkte des pt(1).x = 0; pt(1).y pt(2).x = laenge; pt(2).y pt(3).x = laenge; pt(3).y pt(4).x = 0; pt(4).y pt(5).x = 0; pt(5).y pt(6).x = laenge; pt(6).y pt(7).x = laenge; pt(7).y pt(8).x = 0; pt(8).y Körpers = 0; = 0; = laenge; = laenge; = 0; = 0; = laenge; = laenge; pt(1).z pt(2).z pt(3).z pt(4).z pt(5).z pt(6).z pt(7).z pt(8).z % Definition der Linien des Körpers über ln(1) = struct( 'p1', pt(1), 'p2', pt(2) ln(2) = struct( 'p1', pt(2), 'p2', pt(3) ln(3) = struct( 'p1', pt(3), 'p2', pt(4) ln(4) = struct( 'p1', pt(4), 'p2', pt(1) Punkte ); ); ); ); ln(5) ln(6) ln(7) ln(8) ); ); ); ); ln(9) ln(10) ln(11) ln(12) = = = = struct( struct( struct( struct( = = = = struct( struct( struct( struct( 'p1', 'p1', 'p1', 'p1', pt(1), pt(2), pt(3), pt(4), 'p1', 'p1', 'p1', 'p1', pt(5), pt(6), pt(7), pt(8), 'p2', 'p2', 'p2', 'p2', 'p2', 'p2', 'p2', 'p2', pt(5) pt(6) pt(7) pt(8) pt(6) pt(7) pt(8) pt(5) ); ); ); ); otherwise fprintf( 'Unbekannter Typ! \n' ); return; end % Aufruf der Zeichen-Funktion drawLines( ln, anzLn ); % Ansicht und Bildgröße bestimmen view( 30, 20 ); axis( [-2, laenge+2, -2, laenge+2, -2, hoehe+2] ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 8 Strukturen in MATLAB return; function drawLines( line, nmax ) figure; hold on; for n = 1:nmax x(1) = line(n).p1.x; y(1) = line(n).p1.y; z(1) = line(n).p1.z; x(2) = line(n).p2.x; y(2) = line(n).p2.y; z(2) = line(n).p2.z; end plot3( x,y,z, '-s' ); hold off; return; Lösung Aufgabe 4 function d = addLn( d, n1, n2 ) d.anz_ln = d.anz_ln + 1; d.ln( d.anz_ln ) = struct( 'p1', n1, 'p2', n2 ); drawLines( d ); return; function d = addPt( d, x, y, z ) d.anz_pt = d.anz_pt + 1; d.pt( d.anz_pt ).x = x; d.pt( d.anz_pt ).y = y; d.pt( d.anz_pt ).z = z; return; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 9 Dateien in MATLAB Aufgabe 1 Schreiben Sie eine Funktion, die testet, ob eine Datei existiert: function res = fileExists( filename ) Die Funktion gibt 0 zurück, wenn die Datei mit dem Name filename nicht existiert, und 1, wenn sie gefunden wurde. Tipp: Versuchen Sie als Test, die Datei zum Lesen zu öffnen. Ein ungültiger File-Identifier liefert die Information, ob das geklappt hat. Aufgabe 2 Schreiben Sie eine Funktion, die zwei Textdateien zu einer einzigen zusammenfügt: function res = filesAdd( file1, file2, new_file ) Als Argumente werden jeweils die Dateinamen der beiden bestehenden Dateien und der Name der neu zu erstellenden Datei übergeben. Testen Sie die Funktion mit verschiedenen Dateien und überprüfen Sie das Ergebnis! Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 9 Dateien in MATLAB Lösung Aufgabe 1 function res = fileExists( filename ) % Aufgabe 1: testet, ob die Datei mit filename existiert % res = fileExists( filename ) % Datei zu filename testweise zum Lesen (read) öffnen fid = fopen( filename, 'r' ); % Check, ob fid gültig ist if( fid < 0 ) res = 0; % ungültig, deshalb eine 0 else res = 1; % gültig, die Datei gibt es % offene Datei wieder schließen fclose( fid ); end Lösung Aufgabe 2 function res = filesAdd( file1, file2, new_file ) % Aufgabe 2: addiert den Inhalt zweier Dateien % res = filesAdd( file1, file2, new_file ) res = 0; % Vorbelegung, noch nichts OK % Datei zu filename testweise zum Lesen (read) öffnen fid1 = fopen( file1, 'r' ); if( fid1 < 0 ) % Check, ob fid gültig ist return; end fid2 = fopen( file2, 'r' ); if( fid2 < 0 ) % Check, ob fid gültig ist fclose( fid1 ); return; end fidNew = fopen( new_file, 'w' ); if( new_file < 0 ) % Check, ob fid gültig ist fclose( fid1 ); fclose( fid2 ); return; end % so lange weiter, bis Ende der ersten Datei erreicht ist weiter = 1; % Flag als Merker, ob Datei-Ende erreicht ist while( weiter ) % nächste Zeile einlesen tline = fgetl( fid1 ); if( tline == -1 ) % Datei-Ende erreicht, falls tline = -1 weiter = 0; % Flag zum Beenden setzen else % Text in die neue Datei schreiben fprintf( fidNew, '%s \n', tline ); end end fclose( fid1 ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 9 Dateien in MATLAB weiter = 1; % Flag als Merker, ob Datei-Ende erreicht ist while( weiter ) % nächste Zeile einlesen tline = fgetl( fid2 ); if( tline == -1 ) % Datei-Ende erreicht, falls tline = -1 weiter = 0; % Flag zum Beenden setzen else % Text in die neue Datei schreiben fprintf( fidNew, '%s \n', tline ); end end fclose( fid2 ); fclose( fidNew ); res = 1; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 10 Strings in MATLAB Aufgabe 1 Schreiben Sie die Abfragefunktion function erg = frage( txt ); die einen übergebenen Fragetext txt auf den Bildschirm schreibt und als Tastatur-Eingabe eine Antwort erwartet. Kommt als Antwort der String „Ja“, dann gibt die Funktion den Wert 1 zurück. Für jede andere Antwort ist der Rückgabewert 0. Aufgabe 2 Schreiben Sie eine Funktion, die eine txt-Datei in eine HTML-Datei umwandelt. Die HTMLDatei hat den gleichen Namen wie die txt-Datei, nur die andere Extension „.html“. Zum Beispiel wird aus myFile.txt die Datei myFile.html. Am Anfang der neuen HTML-Datei steht zum Beispiel folgender Text: <HTML> <HEAD> <TITLE>Von txt zu html</TITLE> </HEAD> <BODY> Dann wird die txt-Datei eingelesen. Die Zeichen der einzelnen Zeilen werden analysiert und gegebenenfalls in das HTML-Format konvertiert. Die meisten Zeichen können unverändert in die HTML-Datei übernommen werden. Nur folgende Zeichen werden ersetzt: \n <br> ä &auml; Ä &Auml; ö &ouml; Ö &Ouml; ü &uuml; Ü &Uuml; ß &szlig; Am Ende der HTML-Datei kommen als Abschluss noch die beiden Zeilen: </BODY> </HTML> Erzeugen Sie eine Textdatei. Konvertieren Sie diese mit Ihrer Funktion nach HTML und überprüfen Sie das Ergebnis, die neu erzeugte HTML-Datei, in Ihrem Web-Browser. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 10 Strings in MATLAB Lösung Aufgabe 1 function erg = frage( txt ) % Aufgabe 1: fragt nach 'Ja' % erg = frage( txt ) % Antwort von der Tastatur holen antw = input( txt ); % Vergleich der Antwort mit dem Text 'Ja' if( strcmp( antw, 'Ja' ) ) erg = 1; else erg = 0; end Lösung Aufgabe 2 function erg = txt2html( txtFile, htmlFile ) % Aufgabe 2: wandelt einen Text- in einen HTML-File % erg = txt2html( txtFile, htmlFile ) erg = 0; fid1 = fopen( txtFile, 'r' ); if( fid1 < 0 ) % Check, ob fid gültig ist return; end fid2 = fopen( htmlFile, 'w' ); if( fid2 < 0 ) % Check, ob fid gültig ist fclose( fid1 ); return; end fprintf( fid2, '<HTML> \n' ); fprintf( fid2, '<HEAD> <TITLE>Von txt zu html</TITLE> </HEAD> \n' ); fprintf( fid2, '<BODY> \n' ); % so lange weiter, bis Ende der Text-Datei erreicht ist weiter = 1; % Flag als Merker, ob Datei-Ende erreicht ist while( weiter ) % nächste Zeile einlesen tline = fgetl( fid1 ); if( tline == -1 ) % Datei-Ende erreicht, falls tline = -1 weiter = 0; % Flag zum Beenden setzen else % Zahl der Zeichen in der Zeile len = length( tline ); % alle Zeichen untersuchen for( n=1:len ) z = ''; % n. Zeichen der Zeile checken switch( tline( n ) ) case 'ä' z = '&auml;'; case 'ö' z = '&ouml;'; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 10 Strings in MATLAB case 'ü' z = '&uuml;'; case 'Ä' z = '&Auml;'; case 'Ö' z = '&Ouml;'; case 'Ü' z = '&Uuml;'; case 'ß' z = '&szlig'; % normales Zeichen otherwise z = tline( n ); end % evtl. gewandeltes Zeichen in Datei schreiben fprintf( fid2, '%s', z ); end % Zeilenende in die neue Datei schreiben fprintf( fid2, '<br> \n' ); end end fprintf( fid2, '</BODY> \n' ); fprintf( fid2, '</HTML> \n' ); fclose( fid1 ); fclose( fid2 ); erg = 1; Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 11 Anwendungen in MATLAB Aufgabe 1 Die Seile 1 und 2 sollen in unserer Konstruktion durch Stäbe ersetzt werden. Die zusätzliche äußere Kraft F2 sei nicht vorhanden. Stellen Sie für diesen Fall das lineare Gleichungssystem auf und berechnen Sie die Kräfte in den Stäben. Was fällt Ihnen beim Stab 2 auf? Aufgabe 2: Wo schneiden sich zwei Geraden in der Ebene? Auch diese Aufgabe führt auf ein lineares Gleichungssystem. Die Gleichungen für die beiden Geraden y1(x) und y2(x) lauten: y1 = a * x + b y2 = c * x + d a, b, c und d sind vorgegebene, reelle Zahlen. Der Schnittpunkt der Geraden P = (x,y) ist dadurch definiert, dass dort die x- und die y-Werte der beiden Geraden übereinstimmen, speziell ist y1 = y2 = y. Etwas umgeschrieben erhält man so die Gleichungen: - a * x + y = b - c * x + y = d oder als Matrix-Gleichung: A · P = r mit: = 1 , 1 = , = Die Determinante von A liefert die Information, ob es für eine bestimmte Wahl von a, b, c, d überhaupt einen Schnittpunkt gibt. Berechnen Sie die Schnittpunkte für verschiedene Werte von a, b, c, d – beispielsweise: a = 1, b = 0, c = -1, d = 0 a = 2, b = 3, c = 5, d = -3 a = 3, b = 0, c = 3, d = 1 Erstellen Sie jeweils eine Skizze mit den Geraden und verifizieren Sie die gefundenen Schnittpunkte. In ähnlicher Weise können Sie übrigens auch den Schnittpunkt einer Geraden mit einer Ebene im dreidimensionalen Raum berechnen – nur dass Sie dann drei Gleichungen mit drei Unbekannten (x, y, z) haben. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 11 Anwendungen in MATLAB Lösung Aufgabe 1 % % function tm_stabsystem() % Kraftsystem mit Stäben % function tm_stabsystem() % Konstante Variable belegen a1 = 70; a2 = 40; b = 70; F1 = 80; A = [ -cosd(a1), -cosd(a2); sind(a1), -sind(a2) ]; % äußere Kraft berechnen (F2 = 0) r = [ 0; F1 ]; % Aufgabe lösen Fs = A \ r; % Ausgabe der Daten fprintf( 'Stabkraft Fs1 = %g N \n', Fs(1) ); fprintf( 'Stabkraft Fs2 = %g N \n', Fs(2) ); % Fs2 wird negativ, d.h. der Stab wird auf Druck belastet Lösung Aufgabe 2 % % function schnittpunkt( a, b, c, d ) % Berechnung von Geraden-Schnittpunkten % y1 = a * x + b % y2 = c * x + d % % Testaufrufe: % schnittpunkt( 1, 0, -1, 0 ); % schnittpunkt( 2, 3, 5, -3 ); % schnittpunkt( 3, 0, 3, 1 ); % function schnittpunkt( a, b, c, d ) % A % r A * P = r, P = [x;y] : Schnittpunkt = [ -a, 1; -c, 1 ]; rechte Seite berechnen = [ b; d ]; % Test auf Lösbarkeit dA = det( A ); if( abs( dA ) < eps ) fprintf( 'Geraden sind parallel, kein Schnittpunkt \n' ); return; end % Aufgabe lösen P = A \ r; % Ausgabe des Schnittpunkts fprintf( 'Schnittpunkt P = (%g,%g) \n', P(1), P(2) ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 12 Anwendungen in MATLAB Aufgabe 1 Schreiben Sie eine MATLAB-Funktion, die folgende periodische Funktion für die Grundfrequenz f = 220 Hz im Intervall t = [0, 2s] grafisch darstellt und das zugehörige Frequenzspektrum berechnet und anzeigt: y = sin(2*pi*f*t) - 1/9 * sin(2*pi*3*f*t) + ... 1/25 * sin(2*pi*5*f*t) - 1/49 * sin(2*pi*7*f*t); Spielen Sie den Ton mit der Funktion wavplay ab. Aufgabe 2: Schreiben Sie eine MATLAB-Funktion, die die folgenden vier Funktionen zur Grundfrequenz f = 440 Hz im Intervall t = [0, 2s] grafisch darstellt und jeweils das zugehörige Frequenzspektrum berechnet und anzeigt: y1 = sin( 2*pi*f*t ); y2 = cos( 2*pi*f*t ); y3 = sin( 2*pi*f*t + pi/6 ); y4 = ( sin( 2*pi*f*t ) + cos( 2*pi*f*t ) ) / sqrt(2); Zusätzlich zum Betrag der Frequenzamplituden soll zu jeder Funktion auch noch der Phasenwinkel der Frequenzen berechnet und dargestellt werden. Wodurch unterscheiden sich die Frequenzspektren? Hinweis: Den Phasenwinkel w zu einer komplexen Zahl erhalten Sie mit Hilfe der MATLABFunktion angle, also beispielsweise w = angle(c) für den Frequenzvektor c. Aufgabe 3: Schreiben Sie eine MATLAB-Funktion, die folgende periodische Funktion für die Grundfrequenz f = 220 Hz im Intervall t = [0, 2s] grafisch darstellt und das zugehörige Frequenzspektrum berechnet und anzeigt: y = sign( sin(2*pi*f*t) ); Hinweis: Die MATLAB-Funktion sign berechnet das Vorzeichen der übergebenen Zahl, also beispielsweise: sign( 2 ) = +1, sign( 7 ) = 1. Spielen Sie den Ton mit der Funktion wavplay ab. Aufgabe 4: Schreiben Sie eine MATLAB-Funktion, die folgende periodische Funktion für die Grundfrequenz f = 220 Hz im Intervall t = [0, 2s] grafisch darstellt und das zugehörige Frequenzspektrum berechnet und anzeigt: y = sign( sin(2*pi*f*t) ) - sin(2*pi*f*t); Spielen Sie den Ton mit der Funktion wavplay ab. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 12 Anwendungen in MATLAB Lösung Aufagbe 1 function spektrum3() % Aufgabe 1: Zeitverlauf und Spektrum anzeigen % spektrum3() % Zeitintervall von 0 bis 2 s % Array mit Stützpunkten im Abstand 1/40000 s t = 0 : 1/40000 : 2; f = 220; % Grundfrequenz 220 Hz H = 1; % 1 als Maximalamplitude % Array y mit Funktionswerten an den t-Stützpunkten y = H * ( sin(2*pi*f*t) - 1/9 * sin(2*pi*3*f*t) + ... 1/25 * sin(2*pi*5*f*t) - 1/49 * sin(2*pi*7*f*t) ); % Ausgabe der Funktion als 2D-Plot subplot(2,1,1) plot( t, y ); axis( [0 1/10 -4 4] ) % fester Ausgabebereich % Fourier-Transformation c = fft( y ); % Betrag der Frequenzamplituden A = abs( c ); % Array der Frequenzen, normiert auf 40000 Hz f = (0:length(c)-1).*40000/length(c); % 2D-Plot der Frequenzamplituden über den Frequenzen subplot(2,1,2) plot( f, A ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 2000 -1 50000] ) % Abspielen wavplay( y, 40000 ); Lösung Aufagbe 2 function spektrum4() % Aufgabe 2: Zeitverlauf und Spektrum anzeigen % spektrum4() % % t f Zeitintervall von 0 bis 1/20 s Array mit Stützpunkten im Abstand 1/40000 s = 0 : 1/40000 : 1/20; = 440; % Grundfrequenz 440 Hz % Array y mit Funktionswerten an den t-Stützpunkten y1 = sin(2*pi*f*t); plotSpektrum( y1, 1, t, f ) y2 = cos(2*pi*f*t); plotSpektrum( y2, 2, t, f ) y2 = cos(2*pi*f*t + pi/6 ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 12 Anwendungen in MATLAB plotSpektrum( y2, 3, t, f ) y2 = ( sin( 2*pi*f*t ) + cos( 2*pi*f*t ) ) / sqrt(2); plotSpektrum( y2, 4, t, f ) % gemeinsame Plot-Funktion function plotSpektrum( y, nr, t, f ) % Ausgabe der Funktion als 2D-Plot subplot( 4, 3, (nr-1)*3+1 ), plot( t, y ); axis( [0 1/100 -1.5 1.5] ) % fester Ausgabebereich c = fft( y ); A = abs( c ); w = angle( c ); % Fourier-Transformation % Betrag der Frequenzamplituden % Phasenwinkel % Array der Frequenzen, normiert auf 40000 Hz f = (0:length(c)-1).*40000/length(c); % 2D-Plot der Frequenzamplituden über den Frequenzen subplot( 4, 3, (nr-1)*3+2 ) plot( f, A ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 1500 -1 1200] ) % 2D-Plot der Phasen % Unterschiede nur in der Phasenlage, nicht im Frequenzbetrag subplot( 4, 3, (nr-1)*3+3 ) plot( f, w ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 1500 -4 4] ) Lösung Aufgabe 3 function spektrumSign() % Aufgabe 3: Zeitverlauf und Spektrum anzeigen % spektrumSign() % Zeitintervall von 0 bis 2 s % Array mit Stützpunkten im Abstand 1/40000 s t = 0 : 1/40000 : 2; f = 220; % Grundfrequenz 220 Hz % Array y mit Funktionswerten an den t-Stützpunkten y = sign( sin(2*pi*f*t) ); % Ausgabe der Funktion als 2D-Plot subplot(2,1,1), plot( t, y ); axis( [0 1/20 -2 2] ) % fester Ausgabebereich % c % A Fourier-Transformation = fft( y ); Betrag der Frequenzamplituden = abs( c ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 12 Anwendungen in MATLAB % Array der Frequenzen, normiert auf 40000 Hz f = (0:length(c)-1).*40000/length(c); % 2D-Plot der Frequenzamplituden über den Frequenzen subplot(2,1,2) plot( f, A ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 4000 -1 60000] ) % Abspielen wavplay( y, 40000 ); function spektrumSign() % Aufgabe 4.1.3: Zeitverlauf und Spektrum anzeigen % spektrumSign() % Zeitintervall von 0 bis 2 s % Array mit Stützpunkten im Abstand 1/40000 s t = 0 : 1/40000 : 2; f = 220; % Grundfrequenz 220 Hz % Array y mit Funktionswerten an den t-Stützpunkten y = sign( sin(2*pi*f*t) ); % Ausgabe der Funktion als 2D-Plot subplot(2,1,1), plot( t, y ); axis( [0 1/20 -2 2] ) % fester Ausgabebereich % c % A Fourier-Transformation = fft( y ); Betrag der Frequenzamplituden = abs( c ); % Array der Frequenzen, normiert auf 40000 Hz f = (0:length(c)-1).*40000/length(c); % 2D-Plot der Frequenzamplituden über den Frequenzen subplot(2,1,2) plot( f, A ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 4000 -1 60000] ) % Abspielen wavplay( y, 40000 ); Lösung Aufgabe 4 function spektrumSign2() % Aufgabe 4: Zeitverlauf und Spektrum anzeigen % spektrumSign2() % Zeitintervall von 0 bis 2 s % Array mit Stützpunkten im Abstand 1/40000 s t = 0 : 1/40000 : 2; f = 220; % Grundfrequenz 220 Hz % Array y mit Funktionswerten an den t-Stützpunkten Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 12 Anwendungen in MATLAB y = sign( sin(2*pi*f*t) ) - sin(2*pi*f*t); % Ausgabe der Funktion als 2D-Plot subplot(2,1,1), plot( t, y ); axis( [0 1/20 -2 2] ) % fester Ausgabebereich % c % A Fourier-Transformation = fft( y ); Betrag der Frequenzamplituden = abs( c ); % Array der Frequenzen, normiert auf 40000 Hz f = (0:length(c)-1).*40000/length(c); % 2D-Plot der Frequenzamplituden über den Frequenzen subplot(2,1,2) plot( f, A ) % Frequenzbereich: 0 Hz bis 4000 Hz axis( [0 8000 -1 20000] ) % Abspielen wavplay( y, 40000 ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 13 Anwendungen in MATLAB Aufgabe 1 Diskutieren Sie folgende Funktion: y(x) = x4 - 5·x3 + 2·x - 2 Verwenden Sie zur Ausgabe das Intervall x = [-1, +5] und als x-Schrittweite den Wert 0.1. Aufgabe 2 Lösen Sie folgende Gleichungen: • 4 20 + 25 = 0 • • • • • 3 + +7=0 5 2 +3=0 +3 10 =0 6 + 11 6=0 2 +1=0 Aufgabe 3 Legen Sie durch folgende Temperatur-Messwerte eine Ausgleichsgerade und stellen Sie die Messwerte und die Gerade grafisch dar: 16.2, 15.8, 17.6, 19.1, 19.2, 21.0, 20.9, 22.5, 23.1, 23.7 Aufgabe 4 Erzeugen Sie mit Hilfe des MATLAB-Aufrufs w = rand(100,1) ein Datenfeld mit 100 gleichmäßig im Intervall [0,1] verteilten Werten. Berechnen Sie dazu den Mittelwert und die Standardabweichung. Wiederholen Sie die Auswertung für den Aufruf w = randn(100,1), durch den normalverteilte Daten um den Ursprung erzeugt werden. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 13 Anwendungen in MATLAB Lösung Aufgabe 1 function kurvendisk() % Aufgabe 1: Kurvendiskussiom % kurvendisk() % Funktion: y(x) = x^4 - 5*x^3 + 2*x - 2 % als Polynom-Vektor: fprintf( 'Funktions-Polynom: ' ); pol = [1,-5,0,2,-2] % x-Werte zur Anzeige x = [-1:0.1:5]; % Funktionswerte berechnen und plotten y = polyval( pol, x ); plot(x,y); grid on % Kurvendiskussion % Nullstellen fprintf( 'Nullstellen: ' ); nullst = roots( pol ) % Ableitungs-Funktion bzw. Polynom fprintf( 'Ableitungs-Polynom: ' ); d1 = polyder( pol ) fprintf( 'Extremwerte: ' ); extr = roots( d1 ) % 2. Ableitung: fprintf( '2. Ableitung: ' ); d2 = polyder( d1 ) fprintf( 'Wendepunkte: ' ); wendep = roots( d2 ) fprintf( 'Krümmung an den Extremwerten: \n' ); kr1 = polyval( d2, extr(1) ) if( kr1 > 0 ) fprintf( '-> Minimum bei x=%g \n', extr(1) ); elseif( kr1 < 0 ) fprintf( '-> Maximum bei x=%g \n', extr(1) ); else fprintf( '-> Sattelpunkt bei x=%g \n', extr(1) ); end kr2 = polyval( d2, extr(2) ) if( kr2 > 0 ) fprintf( '-> Minimum bei x=%g \n', extr(2) ); elseif( kr2 < 0 ) fprintf( '-> Maximum bei x=%g \n', extr(2) ); else fprintf( '-> Sattelpunkt bei x=%g \n', extr(2) ); end kr3 = polyval( d2, extr(3) ) Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 13 Anwendungen in MATLAB if( kr3 > 0 fprintf( elseif( kr3 fprintf( else fprintf( end ) '-> Minimum bei x=%g \n', extr(3) ); < 0 ) '-> Maximum bei x=%g \n', extr(3) ); '-> Sattelpunkt bei x=%g \n', extr(3) ); Lösung Aufgabe 2 function gleichungen() % Aufgabe 2: Gleichungen % gleichungen() % 1. Gleichung: 4 * x^2 - 20 * x + 25 = 0 % als Polynom-Vektor: fprintf( '1. Gleichung: ' ); g1 = [4,-20,25] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L1 = roots( g1 ) % 2. Gleichung: -3 * x^2 + x + 7 = 0 fprintf( '2. Gleichung: ' ); g2 = [-3,1,7] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L2 = roots( g2 ) % 3. Gleichung: 5 * x^2 - 2 * x + 3 = 0 fprintf( '3. Gleichung: ' ); g3 = [5,-2,3] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L3 = roots( g3 ) % 4. Gleichung: x^3 + 3 * x^2 - 10 * x = 0 fprintf( '4. Gleichung: ' ); g4 = [1,3,-10,0] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L4 = roots( g4 ) % 5. Gleichung: x^3 - 6 * x^2 + 11 * x - 6 = 0 fprintf( '5. Gleichung: ' ); g5 = [1,-6,11,-6] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L5 = roots( g5 ) % 6. Gleichung: x^4 - 2 * x^2 + 1 = 0 fprintf( '6. Gleichung: ' ); g6 = [1,0,-2,1] % Nullstellen fprintf( 'Lösung d.h. Nullstellen: ' ); L6 = roots( g6 ) Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 13 Anwendungen in MATLAB Lösung Aufgabe 3 function temperaturen() % Aufgabe 3: Ausgleichgerade % temperaturen() % Messwerte: werte = [16.2, 15.8, 17.6, 19.1, 19.2, 21.0, 20.9, 22.5, 23.1, 23.7]; % Messzeiten t = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % Ausgleichgerade bestimmen p = polyfit( t, werte, 1 ); w = polyval( p, t ); hold on % Ausgleichgerade zeichnen plot(t,w); % Messpunkte zeichnen plot(t,werte,'s'); axis([0 11 15 25]) ylabel( 'Temperatur / °C' ); xlabel( 'Zeit / min' ); hold off Lösung Aufgabe 4 function statistik() % Aufgabe 4: Statistik-Aufrufe % statistik() % gleichverteilte Messwerte we=rand(100,1); % Mittelwert me = mean( we ); % Standard-Abweichung se = std( we ); fprintf( 'Gleichverteilung: \n' ); fprintf( ' Mittelwert = %g, Standardabw. = %g \n', me, se ); wn=randn(100,1); % Mittelwert mn = mean( wn ); % Standard-Abweichung sn = std( wn ); fprintf( 'Normalverteilung: \n' ); fprintf( ' Mittelwert = %g, Standardabw. = %g \n', mn, sn ); figure subplot(1,2,1) plot( we, 'x' ); ylabel( 'gleichverteilt' ); subplot(1,2,2) plot( wn, 'x' ); ylabel( 'normalverteilt' ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 14 Anwendungen in MATLAB Aufgabe 1 Lösen Sie die Bewegungsgleichung für das ungedämpfte Fadenpendel, das mit einem Winkel w um die Senkrechte schwingen kann. Die Differentialgleichung für die Winkelfunktion w(t) lautet: ( ) sin( ) = 0 + L: Fadenlänge, z. B. 0.5 m, g = 9.81 m/s : Erdbeschleunigung Oft verwendet man folgende Näherung der DGL für kleine Winkel: ( ) + w=0 Lösen Sie mit MATLAB die DGL sowohl für die Version A als auch für Version B. Stellen Sie die Lösung für unterschiedliche Anfangsbedingungen (Anfangswinkel w und Anfangswinkelgeschwindigkeit dw/dt) grafisch dar. Warum unterscheiden sich die Lösungen von A und B für große Anfangswinkelgeschwindigkeiten? Diskutieren Sie für diesen Fall die Lösung von A. Bauen Sie in die linke Seite der DGL auch noch folgenden Reibungsterm ein: +2 Aufgabe 2 Lösen Sie die Bewegungsgleichung für den senkrechten Fall. Die DGL für die Ortsfunktion z(t) lautet: g = 9.81 m/s: Erdbeschleunigung + =0 Lösen Sie mit MATLAB die DGL und stellen Sie die Lösung für unterschiedliche Anfangsbedingungen (Anfangsort z und Anfangsgeschwindigkeit dz/dt) grafisch dar. Bauen Sie in die linke Seite der DGL auch noch folgenden Reibungsterm ein: +2 Stellen Sie hierfür sowohl die Ortsfunktion z(t) als auch die Geschwindigkeitsfunktion dz/dt(t) grafisch dar. Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 14 Anwendungen in MATLAB Lösung Aufgabe 1 % % function Pendel_1( w0, v0, tm ) % Pendel-Schwingung, vollständig % w0 : Anfangswinkel in Radiant % v0 : Anfangswinkelgeschwindigkeit % tm : Länge des Zeitintervalls in Sekunden % % Beispiel-Aufrufe: % Pendel_1( 0.1, 0, 10 ) - sinus-ähnlich % Pendel_1( 2.8, 0, 10 ) - noch periodisch, andere Frequenz % Pendel_1( 2.8, -2, 3 ) - durchschlagend % % zugehörige DGL-Funktion: Pendel_1_Fun.m % function Pendel_1( w0, v0, tm ) % Pendel-Konstanten L = 0.5; % Fadenlänge, 0.5 m, g = 9.81; % 9.81 m/s2: Erdbeschleunigung % globale Variable für die DGL-Funktion global gVar; gVar = g / L; % Anfangswerte y0 = [ w0, v0 ]; % Zeit-Intervall tspan = [0,tm]; % Lösung des Anfangswert-Problems [t,y] = ode45( 'Pendel_1_Fun', tspan, y0 ); % daraus den Funktionswert - 1. Komponente z = y( :, 1 ); % alles plotten plot( t, z ); grid on; % DGL-Funktion für ode45: % für Pendel_1 % function dy_dt = Pendel_1_Fun( t, y ) % t : Zeitvariable, y : Vektor aus z und v function dy_dt = Pendel_1_Fun( t, y ) global gVar; % global: Quadrat der Kreisfrequenz % dy_dt(1) dy_dt(1,1) % dy_dt(2) dy_dt(2,1) = = = = Ableitung von z = y(1) ist v = y(2) : y(2); Ableitung von v = y(2): DGL - gVar * sin( y(1) ); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 14 Anwendungen in MATLAB % % function Pendel_2( w0, v0, tm ) % Pendel-Schwingung, linearisiert % w0 : Anfangswinkel in Radiant % v0 : Anfangswinkelgeschwindigkeit % tm : Länge des Zeitintervalls in Sekunden % % Beispiel-Aufrufe: % Pendel_2( 0.1, 0, 10 ) - sinus-ähnlich % Pendel_2( 2.8, 0, 10 ) - Frequenz bleibt gleich % Pendel_2( 2.8, -2, 3 ) - nicht durchschlagend % % zugehörige DGL-Funktion: Pendel_2_Fun.m % function Pendel_2( w0, v0, tm ) % Pendel-Konstanten L = 0.5; % Fadenlänge, 0.5 m, g = 9.81; % 9.81 m/s2: Erdbeschleunigung % globale Variable für die DGL-Funktion global gVar; gVar = g / L; % Anfangswerte y0 = [ w0, v0 ]; % Zeit-Intervall tspan = [0,tm]; % Lösung des Anfangswert-Problems [t,y] = ode45( 'Pendel_2_Fun', tspan, y0 ); % daraus den Funktionswert - 1. Komponente z = y( :, 1 ); % alles plotten plot( t, z ); grid on; % Linearisierte DGL-Funktion für ode45: % für Pendel_2 % function dy_dt = Pendel_2_Fun( t, y ) % t : Zeitvariable, y : Vektor aus z und v function dy_dt = Pendel_2_Fun( t, y ) global gVar; % global: Quadrat der Kreisfrequenz % dy_dt(1) dy_dt(1,1) % dy_dt(2) dy_dt(2,1) = = = = Ableitung von z = y(1) ist v = y(2) : y(2); Ableitung von v = y(2): DGL - gVar * y(1); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 14 Anwendungen in MATLAB % % function Pendel_3( w0, v0, tm, d ) % Pendel-Schwingung, vollständig, mit Reibung % w0 : Anfangswinkel in Radiant % v0 : Anfangswinkelgeschwindigkeit % tm : Länge des Zeitintervalls in Sekunden % d : Reibungskoeffizient % % Beispiel-Aufrufe: % Pendel_3( 0.1, 0, 10, 0.1 ) - schwache Dämpfung % Pendel_3( 0.1, 0, 10, 1 ) - starke Dämpfung % Pendel_3( 2.8, -2, 5, 0 ) - durchschlagend % Pendel_3( 2.8, -2, 5, 0.1 ) - periodisch mit Dämpfung % Pendel_3( 2.8, -5, 5, 0.1 ) - ein Durchschlag % % zugehörige DGL-Funktion: Pendel_3_Fun.m % function Pendel_3( w0, v0, tm, d ) % Pendel-Konstanten L = 0.5; % Fadenlänge, 0.5 m, g = 9.81; % 9.81 m/s2: Erdbeschleunigung % globale Variable für die DGL-Funktion global gVar; gVar = g / L; global delta; delta = 2 * d; % Anfangswerte y0 = [ w0, v0 ]; % Zeit-Intervall tspan = [0,tm]; % Lösung des Anfangswert-Problems [t,y] = ode45( 'Pendel_3_Fun', tspan, y0 ); % daraus den Funktionswert - 1. Komponente z = y( :, 1 ); % alles plotten plot( t, z ); grid on; % DGL-Funktion für ode45: % für Pendel_3 % function dy_dt = Pendel_3_Fun( t, y ) % t : Zeitvariable, y : Vektor aus z und v function dy_dt = Pendel_3_Fun( t, y ) global gVar; % global: Quadrat der Kreisfrequenz global delta; % Reibungsterm % dy_dt(1) dy_dt(1,1) % dy_dt(2) dy_dt(2,1) = = = = Ableitung von z = y(1) ist v = y(2): y(2); Ableitung von v = y(2): DGL - gVar * sin( y(1) ) - delta * y(2); Prof. Dr. A. Karbach und Prof. Dr. G. Manthei Aufgabenblatt 14 Anwendungen in MATLAB Lösung Aufgabe 2 % % function SenkrFall( x0, v0, tm, d ) % Senkrechter Fall mit Reibung % x0 : Anfangsort % v0 : Anfangsgeschwindigkeit % tm : Länge des Zeitintervalls in Sekunden % d : Reibungskoeffizient % % Beispiel-Aufrufe: % SenkrFall( 0, 0, 3, 0 ) - ungebremster Fall % SenkrFall( 0, 10, 3, 0 ) - Wurf nach oben, ungebremst % SenkrFall( 0, 0, 3, 1 ) - Fall mit Reibung, v -> const % SenkrFall( 0,-10, 3, 1 ) - abgebremster Wurf nach unten % % zugehörige DGL-Funktion: SenkrFall_Fun.m % function SenkrFall( x0, v0, tm, d ) % globale Variable für die DGL-Funktion global delta; delta = 2 * d; % Anfangswerte y0 = [ x0, v0 ]; % Zeit-Intervall tspan = [0,tm]; % Lösung des Anfangswert-Problems [t,y] = ode45( 'SenkrFall_Fun', tspan, y0 ); % daraus den Funktionswert - 1. Komponente z = y( :, 1 ); v = y( :, 2 ); % alles plotten plot( t, z, t, v ); xlabel( 't / s' ); ylabel( 'x/m | v/(m/s)' ); legend( 'Ort', 'Geschwindigkeit' ); grid on; % DGL-Funktion für ode45: % für SenkrFall % function dy_dt = SenkrFall_Fun( t, y ) % t : Zeitvariable, y : Vektor aus z und v function dy_dt = SenkrFall_Fun( t, y ) global delta; % global: Reibungsterm g = 9.81; % Erdbeschleunigung % dy_dt(1) dy_dt(1,1) % dy_dt(2) dy_dt(2,1) = = = = Ableitung von z = y(1) ist v = y(2) : y(2); Ableitung von v = y(2): DGL - g - delta * y(2);