Computational Physics 1, Seminar 02 Seite 1 Programmieren in MATLAB Mehr als nur ein Taschenrechner 1) Definition eigener Funktionen Anlegen eines neuen m-files im m-file-editor mit folgem Beispielinhalt: function summe=addi(s1,s2) % Berechnung der Summe zweier Zahlen summe=s1+s2; 1. Zeile: Keywort (function) Ausgangsargument (summe) = Funktionenname (addi) Eingangsargumente (s1 und s2) 2. Zeile: Komentar der bei help addi angezeigt wird 3. Zeile: Funktionskörper, irgwo muss dem Ausgangsargument ein Wert zugewiesen werden Abspeichern des m-files mit dem Namen addi.m im Arbeitsverzeichnis Ausprobieren: >> addi(1,2) ans = 3 2) ZUSATZ: Hilfe zu eigenen Funktionen Der help befehl druckt den ersten zusammenhängen Kommentar (%) Block >> help addi Berechnung der Summe zweier Zahlen 3) Funktionen als Argument von Funktionen Sollen Funktionen auf beliebige zu wähle Funktionen wirken, müssen diese als Argument an die Funktion übergeben werden. Übergabe erfolgt in Form von handle. >>func=@(x)(sin(x)).^2 Die Funktioneklaration muss die Übergabe des fhandle enthalten: function x=plot_funktion(fhandle,x) Innerhalb der Funktion wird die übergebene Funktion durch ihren fhandle mit feval aufgerufen. plot(x,fhandle(x)) oder: plot(x,feval(fhandle,x)) Ausprobieren: >> plot_funktion(func,-pi:0.01:pi) >> plot_funktion(@(x)sin(x),-pi:0.01:pi) Dateiname MUSS addi.m sein sonst großes Chaos Addi.m kann nur gefunden werden, wenn es im Working Directory liegt (oberhalb von command window) angezeigt! abkürze Schreibweise für: func ist eine Funktion mit einem Parameter x die sich errechnet, indem man von x den sinus nimmt und quadriert
Computational Physics 1, Seminar 02 Seite 2 Steuerung des Programmablaufes mehr als zusammengefasste Befehle 4) if - Verzweigung Auswertung eines logischen Ausdrucks und Abarbeitung einer Befehlsfolge, wenn der logische Ausdruck wahr ist, sonst Alternative if log. Ausdruck 1 elseif log. Ausdruck 2 else Befehlsfolge 3 if a>b else max=a; max=b; ACHTUNG: Unterscheidung zwischen zuweisem Ist-Gleich ( a=b sei a gleich b ) und vergleichem Ist-Gleich ( a==b. ist a gleich b?) 5) for - Schleife Wiederholung einer Befehlsfolge eine vorgegebene Anzahl mal. for Laufvariable = Startwert : Endwert Befehlsfolge fakultaet=1; for i=2:n fakultaet=fakultaet*i; Anmerkung: alle Schleifen in Matlab sind LANGSAM innere Schleifen auf Vektor/Matrix- Operationen abbilden 6) while - Schleife Wiederholung einer Befehlsfolge so lange ein logischer Ausdruck wahr ist. while logischer Ausdruck Befehlsfolge fakultaet=1; i=2 while i<=n fakultaet=fakultaet*i; i=i+1;
Computational Physics 1, Seminar 02 Seite 3 7) continue - Anweisung Sprung in nächste for- oder while-schleife unter Umgehung noch folger Befehle der in der Schleife befindlichen Befehlsfolge while logischer Ausdruck 1 if logischer Ausdruck 2 continue 8) break - Anweisung vorzeitiges Been einer for- oder while-schleife unter Umgehung noch folger Befehle der in der Schleife befindlichen Befehlsfolge while logischer Ausdruck 1 if logischer Ausdruck 2 break End 9) case Anweisung Auswahl zwischen mehreren Alternativen für den Wert eines Ausdrucks switch Ausdruck case Wert1 case Wert2... otherwise Befehlsfolge n switch day_string case Montag day_numeric = 1; case Dienstag day_numeric = 2;... otherwise day_numeric = 0;
Computational Physics 1, Seminar 02 Seite 4 Übungsaufgaben: Numerische Differentiation Aufgabe 1 Konvergenzverhalten: Untersuchen Sie das Konvergenzverhalten des rechtsseitigen Differenzenquotienten f ( xi 1) f ( xi) Dh f x. x x in Abhängigkeit von der Schrittweite h xi 1 xi für die periodische Funktion sin(x). Programmieren Sie dazu eine MatLab-Funktion zur numerischen Differentiation einer beliebigen analytischen Funktion basier auf der obigen Definition des rechtsseitigen Differenzenquotienten. Berechnen Sie unter Verwung dieser Funktion den Gesamtfehler 50 50 i 1 h h E h f x D f x h h x 50 x 50 im Intervall x = [-50,50] in Abhängigkeit von der Schrittweite. f (x) ist dabei die analytische Ableitung der zu differenzieren Funktion f. Stellen Sie (h) für Schrittweiten im Intervall h = [0,3] grafisch dar. Stellen Sie außerdem auch den lokalen Fehler E h für drei verschiedene h 0,3 im Intervall x = [-50,50] grafisch dar. Beschreiben und interpretieren Sie Ihre Ergebnisse. Ihre Funktion soll als Eingabeargumente die zu differenziere Funktion, die Intervallgrenzen a und b sowie die Schrittweite h erhalten. Sie soll die Vektoren xwerte und ableitung zurückgeben. Die Definition der zu differenzieren Funktion f(x) soll extern erfolgen. Nutzen Sie hierbei die in Matlab i
Computational Physics 1, Seminar 02 Seite 5 vorgesehene Übergabe von Funktionen mittels handles. Die grafischen Darstellungen sollen mit einem separaten MatLab-Skript erzeugt werden, dessen Struktur nicht vorgegeben ist. Funktionskopf: function [xwerte, ableitung] = diffquot(fhandle,a,b,h) % fhandle: Funktionshandle zur analytischen Funktion welche abgeleitet werden soll % a,b: untere und obere Intervallgrenzen % h: Schrittweite der Differentiation % Funktionsaufruf: [xwerte, ableitung] = diffquot(fhandle, a, b, h) % [xwerte, ableitung] = diffquot(@(x) sin(x), -10, 10, 0.1);
Computational Physics 1, Seminar 02 Seite 6 Hilfreiche Funktionen: sum(x) berechnet die Summe der Elemente des Vektors x function_handle(@) verknüpft eine Variable mit einer Funktion, z.b. fhandle = @(x) x.^2 oder fhandle = @(x) sin(x) plot(x,y) stellt y Werte über den übergebenen x Werten graphisch dar Die Lösungen sind als E-Mail-Anhang bis spätestens 12.11.2014, 24:00 Uhr an teaching-nanooptics@unijena.de zu sen. Bitte unbedingt Name, Matrikelnummer und Nummer der Übungsserie in die Betreffzeile der E-Mail schreiben. Lösungen ohne Angabe von Name und Matrikelnummer, mit Funktionsdefinitionen die von den Vorgaben abweichen oder zu spät eingereichte Lösungen können nicht berücksichtigt werden. Einzusen sind mindestens die Differentiationsfunktion diffquot.m und eine 1-2 seitige Darstellung Ihrer Ergebnisse, welche die erzeugten Bilder und deren Beschreibung sowie Interpretation beinhaltet.