Scilab-Skript Maria Magdalena Nafalska WS 09/10 Inhaltsverzeichnis 1 Über dieses Skript 3 2 Einführung 3 3 Grundlegendes 3.1 Konsole . . . . . . . . 3.2 Scipad . . . . . . . . . 3.3 Dateien einbinden . . 3.4 Wichtige Syntaxregeln 3.5 Hilfe-Browser . . . . . 3.6 Fehlermeldungen . . . 3 3 3 4 4 4 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Elementare Funktionen und Operatoren 5 5 Komplexe Zahlen 5.1 Wichtige Befehle . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Plotten von komplexen Zahlen . . . . . . . . . . . . . . . . . 5 6 6 6 Programmieren 6.1 for-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 if-then-else-Alternative . . . . . . . . . . . . . . . . . . . . . . 6.3 while-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 9 10 7 Scilab-Funktionen 12 7.1 Einbinden einer Scilab-Funktion . . . . . . . . . . . . . . . . . 12 7.2 Aufruf einer Scilab-Funktion . . . . . . . . . . . . . . . . . . . 12 8 Vektoren und Matrizen 13 8.1 Vektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.2 Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 9 Grafische Darstellung - 2D 9.1 Polygon (-züge) . . . . . . 9.2 Funktionsgraphen . . . . . 9.3 m × n - Grafik - Matrix . 9.4 2D-Kurven . . . . . . . . 9.5 Höhenlinien . . . . . . . . 9.6 2D-Vektorfelder . . . . . . 9.7 Flächen in der Ebene . . . 10 Grafische Darstellung 10.1 Funktionsgraphen . . 10.2 3D-Kurven . . . . . 10.3 Flächen im Raum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 20 22 23 24 25 3D 27 . . . . . . . . . . . . . . . . . . . . . . . 27 . . . . . . . . . . . . . . . . . . . . . . . 29 . . . . . . . . . . . . . . . . . . . . . . . 31 11 Integration 33 11.1 Integration-1D . . . . . . . . . . . . . . . . . . . . . . . . . . 33 11.2 Integration-2D . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2 1 Über dieses Skript Dieses kurze Scilab-Skript ist für die TeilnehmerInnen der Analysis I und II für Ingenieure gedacht und soll einen Überblick über die in diesen beiden Kursen benötigten Scilab-Befehle geben. Derzeit beinhaltet es noch nicht das Thema Integration, dies wird aber entsprechend dem Vorlesungsstoff ergänzt. Fehler und Verbesserungsvorschläge bitte an [email protected] schicken. 2 Einführung Scilab ist eine Programmierumgebung zur numerischen und grafischen Bearbeitung von mathematischen Aufgabenstellungen. Zudem ist sie kostenfrei, also eine gute Alternative zu MATLAB, denn Funktionalität und Syntax sind sehr ähnlich. MATLAB wird in Industrie und an Hochschulen für numerische Simulationen, Datenerfassung, Datenanalyse und -auswertung eingesetzt und ist somit praxisrelevant für den Ingenieursberuf. Die Software erhalten Sie kostenlos unter http://www.scilab.org. Wenn Sie das Betriebssystem Windows haben, dann wählen Sie den Scilab 5.1.1 Installer in der 32 bzw. 64 Bits Version aus. Welche Version sie benötigen, erfahren Sie, indem Sie sich folgendermaßen durchklicken: ”Start” → Systemsteuerung → ”System und Wartung” → ”System” → ”Systemtyp” Bei anderen Betriebssystemen bitte gogglen. 3 3.1 Grundlegendes Konsole Beim Starten des Programms Scilab öffnet sich die Konsole, in der man Befehle eingeben und durch Drücken der enter-Taste ausführen lassen kann. Durch Drücken der Pfeiltasten (↑, ↓) kann man durch die zuvor eingetippten Befehle navigieren. 3.2 Scipad Möchte man ein Scilab-Programm schreiben und nicht nur einzelne Befehl ausführen lassen, so ist es sinnvoll, den Scipad zu öffnen (in der Konsole 3 oben links auf den Notizblock klicken) und den Code dort einzutippen und abzuspeichern (File → Save as). 3.3 Dateien einbinden Möchte man eine (zuvor abgespeicherte) Datei mit Scilab ausführen oder auch einzelne Befehle, welche sich in einer bestimmten Datei befinden, verwenden, so muss man diese Datei zunächst bei Scilab einbinden: man öffnet die Datei im Scipad (”File → Open”) und bindet sie durch ”Execute → Load into Scilab” ein. 3.4 Wichtige Syntaxregeln Der Name einer Scilab-Datei endet mit .sce. Bei Dateien, welche ausschließlich Scilab-Funktionen beinhalten, verwendet man die Endung .sci. Ein Semikolon unterdrückt die Ausgabe, d.h. tippt man z.B. a=1; in die Konsole (und drückt die enter-Taste), so merkt sich Scilab zwar, dass die Variable a den Wert 1 hat, gibt dies aber nicht auf dem Bildschirm aus. Lässt man das Semikolon weg, so lautet die Ausgabe auf dem Bildschirm: a= 1. Alles was hinter // steht (sowohl in der Konsole als auch im Scipad), gilt als Kommentar und wird von Scilab nicht beachtet. Man sagt auch, der Text ist ”auskommentiert”. 3.5 Hilfe-Browser Mit dem Befehl help öffnet sich ein Hilfe-Fenster, wo Sie Informationen zu allen Scilab-Befehlen erhalten. Durch die Eingabe help plot2d kann man sich explizit über den Befehl der hinter help steht informieren, hier also plot2d. 3.6 Fehlermeldungen Es ist eher der Normalfall, dass neu geschriebene Programme nicht auf Anhieb funktionieren. Oft verursacht schon das Fehlen eines Kommas oder eine vergessene Klammer eine Fehlermeldung. Lassen Sie sich dadurch nicht entmutigen, sondern gehen Sie das Programm Schritt für Schritt durch, sofern die Fehlermeldung selbst nicht eine (eindeutige) Antwort darauf liefert, weshalb das Programm nicht das Gewünschte leistet. 4 4 Elementare Funktionen und Operatoren Addition, Subtraktion, Multiplikation und Division werden durch +, -, *, / ausgedrückt. Desweiteren gibt es bei Scilab elementare (vorprogrammierte) sowie auch benutzerdefinierte Funktionen. Auf die letzteren gehen wir in Kapitel 7 ein. Zu den elementaren Funktionen gehören z.B. die Trigonometrischen Funktionen oder aber Funktionen, welche den Absolutbetrag einer (komplexen) Zahl oder die Fakultät einer natürlichen Zahl berechnen. Im Folgenden finden Sie einige elementare Funktionen: • Betrag |x| einer Zahl x: abs(x) Z • n-te Potenz einer Zahl x (n ∈ ): x^n √ • Quadratwurzel x einer Zahl x: sqrt(x) • Sinus von x: sin(x) • Cosinus von x: cos(x) • Tangens von x: tan(x) • Kotangens von x: cotg(x) • exp(x) bzw. ex : exp(x) bzw. %e^x • der natürliche Logarithmus von x > 0: log(x) • zufällig generierte reelle Zahl: rand • n! wobei n ∈ 5 N: factorial(n) Komplexe Zahlen Scilab stellt komplexe Zahlen intern in kartesischer Form z = x + iy dar. Es ist aber auch möglich, diese in Polarform z = |z|eiϕ = |z|(cos(ϕ) + i sin(ϕ)) einzugeben. Die Ausgabe erfolgt allerdings stets in kartesischer Form. Dabei ist der Winkel in Bogenmaß einzugeben, also z.B. z=3*e^ (%i*%pi/4) oder auch z=2*(cos(0.5)+%i*sin(0.5)), wobei in diesem Fall 0.5 = 0.5 π ·π ≈ 0.5 3.14 5 · π ≈ 0.16π ≈ 16 π ist. 5.1 Wichtige Befehle Im Folgenden finden Sie einige wichtige Befehle im Zusammenhang mit komlexen Zahlen. Sei z ∈ : C • imaginäre Einheit i: %i • Realteil von z: real(z) • Imaginärteil von z: imag(z) • Konjugierte von z: conj(z) • Betrag von z: abs(z) Z • (komplexe) Zahl z n mit n ∈ : z^n • (komplexe) Zahl ez : %e^z • Polarkoordinaten von z: [r,phi]=polar(z) Da Scilab numerisch arbeitet, kann es beim letzten Befehl durchaus vorkommen, dass der Winkel eine komplexe Zahl ist (wobei der komplexe Anteil aber praktisch Null ist). Möchte man den Winkel einer komplexen Zahl ”per Hand” ausrechnen, so kann man dies mit der Eingabe atan((imag(z),real(z)) (Bogenmaß) bzw. atan((imag(z),real(z))/%pi*180 (Winkelmaß) erreichen. Der Winkel liegt dann im Bereich ±π bzw. ±180◦ . 5.2 Plotten von komplexen Zahlen Beispiel 5.1 ist ein kleines Programm, welches komplexe Zahlen als Vektoren (Pfeile) grafisch darstellt. Es ist sicher nicht perfekt, dafür aber leicht nachzuvollziehen. Informationen zu Scilab-Funktionen und zum Plotten im Allgemeinen (plot2d()) erhalten Sie in den Kapiteln 7 und 9. An dieser Stelle reicht es aber, wenn Sie sich das Programm runterladen und als Datei imagplot.sci speichern. Anschießend können Sie sich mit dem Aufruf imagplot(z) (in der Console) die komplexe Zahl z grafisch darstellen lassen. Durch mehrfachen Aufruf mit verschiedenen Zahlen z ∈ lassen sich mehrere komplexe Zahlen gleichzeitig darstellen. C 6 Beispiel 5.1. function imagplot(z) L=abs(z); plot2d([-L 0 0 0 0 L],[0 0 L -L 0 0],style=1,axesflag=5); xarrows( [0,real(z)], [0,imag(z)], L, 5 ); endfunction Die elementare Funktion xarrows() erwartet vier Argumente: einen Vektor mit x-Werten x = (x1 , x2 ), einen Vektor mit y-Werten y = (y1 , y2 ), die Größe der Pfeilspitze als Zahl und die Farbe des Pfeils als Zahl (siehe Kapitel 9). Die Punkte (x1 , y1 ) und (x2 , y2 ) werden mit einem Pfeil verbunden und in einem Koordinatenkreuz dargestellt. 2.0 1.5 1.0 0.5 0.0 -2.0-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 -0.5 -1.0 -1.5 -2.0 Diese Grafik wurde durch den Aufruf von imagplot(0.5*%i-1.5), imagplot(-1.5*%i+1), imagplot(%i+1.5) erzeugt. 6 6.1 Programmieren for-Schleifen Schleifen benötigt man, wenn Anweisungen wiederholt ausgeführt werden sollen. Die Schreibweise einer for-Schleife sieht folgendermaßen aus: 7 • Größen, die in der Schleife geändert werden, muss man vor Beginn der Schleife einen Wert zuweisen! • for k=m:(m+n) k ist eine Variable, m und n können Zahlen oder Variablen sein; k=m:(m+n) bedeutet: k = m, m + 1, ..., m + n • Anweisungen, die wiederholt ausgeführt werden sollen • end Die Schleife wird nach n + 1 Durchläufen verlassen. Beispiel 6.1. Wir berechnen die Geometrische Summe n ∑ xk = 1 + x + x2 + ... + xn k=0 für x = 1 2 und n = 10. Anschließend kontrollieren wir das Ergebnis mit Hilfe n ∑ n+1 der Formel xk = 1−x 1−x , für x ̸= 1, Analysis I Skript, Beispiel 21: k=0 n=10; S=0; x=1/2; //Initialisierung for k=0:n S=S+x^k; end //für k=0,...,n //bei jedem Durchlauf wird x^k zu S //dazuaddiert S K=(1-x^(n+1))/(1-x) //Ausgabe der Summe //Kontrolle Die Ausgabe lautet in diesem Fall: S = 1.9990234 K = 1.9990234 8 6.2 if-then-else-Alternative Diese Anweisung dient der bedingten Ausführung von alternativen Programmzweigen. Die Schreibweise dafür lautet wiefolgt: • if Bedingung then Anweisung, Anweisung,... • evtl. Zeile(n) der Form: elseif Bedingung then Anweisung, Anweisung,... • else Anweisung, Anweisung,... • end Zur Formulierung der Bedingungen gibt es mehrere Möglichkeiten: logische Operatoren: Vergleichsoperatoren: & ”und” | ”oder” == ”gleich” ~= ”ungleich” < ”kleiner als” <= ”kleiner oder gleich” > ”größer als” >= ”größer oder gleich” Beispiel 6.2. Das folgende Programm überprüft zunächst, ob die am Anfang eingegebene Zahl x gleich 2 bzw. im Intervall [1, 1.5[ liegt. Ist dies der Fall, so erscheint auf dem Bildschirm: x=2 oder x ist größer gleich 1 aber kleiner als 1.5. Ist dies nicht der Fall, wird als nächstes überprüft, ob x ∈ [1.5, ∞[ aber x ̸= 2. Der Fall x = 2 kann hier gar nicht mehr auftreten, denn das wäre 9 schon im ersten Fall aufgefallen. Von daher könnte man diese Abfrage weglassen, falsch ist sie aber nicht. Ist x also größer als 1.5, so erscheint auf dem Bildschirm: Fall 2. Ist auch dies nicht erfüllt, so wird überprüft, ob x kleiner als -1 ist, und in diesem Fall wird x<-1 ausgegeben. In allen anderen Fällen, also wenn x ∈ [−1, 1[ ist, erhalten wir die Ausgabe: sonst. Da wir am Anfang x = 3 eingegeben haben, lautet in unserem Fall die Ausgabe: Fall 2. x=3; if x==2 | (x>=1 & x<1.5) then ’’x=2 oder x ist größer gleich 1 aber kleiner als 1.5’’ elseif x>=1.5 & x~ =2 then ’’Fall 2:’’ elseif x<-1 then ’’x<-1’’ else ’’sonst’’ end 6.3 while-Schleifen Diese Anweisung dient der wiederholten Ausführung einer Anweisung in Abhängigkeit eines boolschen Ausdrucks (Aussage). Die Schreibweise dafür lautet wiefolgt: • while Bedingung then Anweisung, Anweisung,... • else Anweisung, Anweisung,... • end 10 Die Schleife wird solange durchlaufen, wie die Bedingung aus der ersten Zeile erfüllt ist. Nach jedem Durchlauf wird geprüft, ob diese Bedingung immer noch erfüllt ist. Ist dies (das erste mal) nicht der Fall, so springt das Programm zu den Anweisungen hinter else und danach wird die Schleife verlassen. Zur Formulierung der Bedingungen gibt es die gleichen Möglichkeiten, die in Kapitel 6.2 aufgeführt wurden. Beispiel 6.3. Das folgende Programm schreibt solange immer noch kleiner auf den Bildschirm, solange die zuvor eingegebene Zahl d kleiner als die Zahl f ist. Bei jedem Durchlauf der Schleife wird der Wert von d um 1 erhöht, so dass nach geügend Durchläufen endlich gleich auf dem Bildschirm erscheint. d=2; f=4; while d<f then ’’immer noch kleiner’’, d=d+1; else ’’endlich gleich’’ end Die Ausgabe lautet in diesem Fall: ans = immer noch kleiner ans = immer noch kleiner ans = endlich gleich Hätte man in diesem Beispiel die Anweisung d=d+1; vergessen, so hätte man eine Endlosschleife erzeugt, denn die Abbruchbedingung d ≥ f wäre nie erfüllt gewesen. In diesem Fall kann man in der Konsole ”Control → abort” klicken. Dies beendet die Schleife. 11 7 Scilab-Funktionen Bei Scilab hat der/die BenutzerIn auch die Möglichkeit, eigene Funktionen zu definieren. Dateien, welche nur aus einer (oder mehreren) Funktionen bestehen, bekommen dabei die Endung .sci. Die Schreibweise lautet wiefolgt: • function [y1,...,yn]=Funktionsname(x1,...,xm) wobei x1,...,xm Eingabe- und y1,...,yn Ausgabegrößen sind • Befehle zur Berechnung der Ausgabegrößen aus den Eingabegrößen • endfunction Im Fall von nur einer Ausgabegröße, können die eckigen Klammern weggelassen werden. 7.1 Einbinden einer Scilab-Funktion Die entsprechende Datei wird mit ”Execute → Load into Scilab” (im Scipad) eingebunden. Anschließend kann die Funktion in der Konsole oder innerhalb eines anderen Programms aufgerufen werden. 7.2 Aufruf einer Scilab-Funktion Dazu muss die Funktion bereits eingebunden sein! Es werden nun der Name der Funktion und die Variablen in runden Klammern eingeben, z.B. imagplot(%i+3). Möchte man auf die Ausgabegröße noch einmal zugreifen, so muss man sie in einer Variable abspeichern, z.B. w=MeineFunktion(x).1 Bei mehreren Ausgabevariablen muss man diese in eckigen Klammern auflisten, z.B. [r,phi]=polar(%i+1). Dabei müssen die Namen der Variablen nicht mit denen in der Funktion definierten übereinstimmen; nur Reihenfolge und Anzahl sind wichtig. Beispiel 7.1 (1 Eingabegröße, 1 Ausgabegröße). function [q]=quad(x) q=x*x; endfunction 1 Eine Funktion muss nicht unbedingt einen Rückgabert haben: Die Funktion imagplot() z.B. erzeugt lediglich eine Grafik. 12 Aufruf z.B. mit s=quad(7). Wie schon erwähnt, muss man nicht die gleichen Variablen wie in der Funktionsdefinition verwenden. So wäre auch der Aufruf a=quad(6) möglich. Beispiel 7.2 (2 Eingabegrößen, 1 Ausgabegröße). function [s]=summe(x,y) s=x+y; endfunction Aufruf z.B. mit s=summe(2,3). Beispiel 7.3 (2 Eingabegrößen, 2 Ausgabegrößen). function [s,p]=sumprod(x,y) s=x+y; p=x*y; endfunction Aufruf z.B. mit [s,p]=sumprod(3,4). 8 8.1 Vektoren und Matrizen Vektoren Mit Vektoren kann man mehrere Zahlen gleichzeitig erfassen. Die Eingabe eines Vektors sieht wiefolgt aus: • Komponenten zwischen eckigen Klammern eingeben [ ] • getrennt mit Kommata (oder Leerzeichen) bei Zeilenvektoren • getrennt mit Semikolons (oder Zeilenwechseln) bei Spaltenvektoren • es können auch einzelne Komponenten eingeben werden (s.u.) Die Länge des Vektors x erhält man beim Aufruf von length(x). Transponieren eines Vektors x erreicht man durch x’. Auf die k-te Komponente von x kann man mit dem Befehl x(k) zugreifen, wobei k ∈ {1,2,..., length(x)}. 13 Beispiel 8.1. Die Befehle a=[0 1 2]; b=[0;1;2]; c=[0:100]; d=[0:0.1:1]; e=sin(0:10); erzeugen die Vektoren 0 a = (0, 1, 2), b = 1 c = (0, 1, 2, ..., 99, 100), d = (0, 0.1, 0.2, ..., 0.9, 1), 2 ( ) e = sin(0), sin(1), ..., sin(9), sin(10) . Wenn wir einen Vektor mit erstem Eintrag x1 und letztem Eitrag xn und genau n Einträgen erzeugen wollen, so können wir linspace(x1,xn,n) verwenden. Beispiel 8.2. Wir berechnen die ersten 10 Glieder der Eulerfolge (an ) = (1+ k1 )n (Analysis I Skript, Beispiel 39) und speichern diese in dem Vektor a ∈ 10 . Zum Schluss lassen wir uns den Vektor a, seine Länge und zum Vergleich die Zahl e ausgeben. Wir wissen ja, dass limn→∞ an = e ist. R 8.2 for k=1:10 a(k)=(1+1/k)^ k; end //Die Glieder der Folge werden in dem //Vektor a gespeichert a length(a) %e //Ausgabe der Eulerfolge (als Vektor) //Ausgabe der Länge von a //Ausgabe der Zahl e zum Vergleich Matrizen Dieses Thema schneiden wir nur sehr kurz an, da für unsere Zwecke einige wenige Tatsachen ausreichend sind. Die Schreibweise sieht, am Beispiel, wiefolgt aus: 14 Beispiel 8.3. Die Befehle A=[0,1;1,1;2,3] B=[0 1 1 1 2 3] 0 0 erzeugen die gleiche Matrix A = 1 1 . 2 3 Die Anzahl der Elemente der Matrix A erhält man beim Aufruf von length(A). Transponieren einer Matrix A erreicht man durch A’. Auf das Element in der i-ten Zeile und j-ten Spalte von A, also auf Ai,j kann man mit dem Befehl A(i,j) zugreifen. 9 Grafische Darstellung - 2D Zunächst ein kleiner Trick: Bevor mit Scilab aufwendige Grafiken gezeichnet werden, sollte man zunächst einen einfachen Plot-Befehl ausführen lassen. Durch dieses ”Warmlaufen” können Programmabstürze verhindert werden. 9.1 Polygon (-züge) Bevor gezeichnet wird, sollten alte Grafiken gelöscht werden: xdel clf() schließt alle offenen Grafikfenster löscht die bisherige Grafik Um eine zwei-dimensionale Grafik (x-y–Grafik) zu zeichnen, müssen die gewünschten x-y–Punkte in x- und y- Vektoren eingegeben werden. Das könnte z.B. so aussehen: x=[0 1 2 0]; y=[1 0 1 1]; Diese müessen stets gleich lang sein! Der Befehl plot2d(x,y) bewirkt, dass die Punkte samt den Verbindungslinien in die x-y–Ebene gezeichnet werden: 15 1.0 0.8 0.6 0.4 0.2 0.0 0.0 0.4 0.8 1.2 1.6 2.0 Auf die weiteren Gestantungsmöglichkeiten, wie Farbe der Linien, Achseneinstellungen, etc. gehen wir im nächsten Kapitel ein. 9.2 Funktionsgraphen Um die Funktion f (x) = y grafisch darzustellen, gibt es verschiedene Vorgehensweisen: bei elementaren Funktionen kann man die x- und die entsprechenden y-Werte als Vektoren definieren und dann wieder plot2d() verwenden: Beispiel 9.1. 1.0 x=[0:0.1:2]; y=sin(x); 0.8 0.6 0.4 plot2d(x,y) 0.2 0.0 0.0 0.4 0.8 1.2 1.6 2.0 Die ersten beiden Befehle erzeugen die Vektoren x=[0, 0.1, ... , 1.9, 2] und y=[sin(0), sin(0.1), ... , sin(1.9), sin(2)]. Bei ScilabFunktionen, wie z.B. sin(), ist auch sin(x) definiert, wenn x ein Vekor ist: damit ist das Anwenden von sin() auf jede Komponente von x gemeint. Das Ergebnis ist also wieder ein Vektor. Wenn aber z.B. f (x) = x · x ist, so wird Scilab eine Fehlermeldung ausgeben, weil hier zwei Zeilenvektoren miteinander multipliziert werden müssten. 16 In so einem Fall kann man f als Scilab-Funktion f() definieren und den Befehl fplot2d() verwenden: Beispiel 9.2. x=[0:0.1:4]; 16 function [y]=f(x) y=x*x; endfunction 12 8 4 fplot2d(x,f) 0 0 1 2 3 4 Diese Prozedur hätte hier mit der Definition y=x^2 umgangen werden können, aber z.B. bei f (x) = xex hätte man wieder das oben beschriebene Problem. Auch die Operation 1/t bereitet Probleme, denn Scilab erzeugt aus dem Zeilenvektor t den Spaltenvektor 1/t mit den elementweisen Reziproken. Auch in diesem Fall empfiehlt sich die o. g. Vorgehensweise. Der Aufruf von plot2d() bzw. fplot2d() erzeugt eine Grafik, in welcher die plot-Punkte mit Linien verbunden werden. Dabei wird die Grafik desto genauer sein, je ”feiner” der Vektor x ist. Man kann das Bild durch mehrfachen Aufruf aufbauen, da die alten Grafiken nicht gelöscht werden, sofern man dies nicht expizit durch clf() fordert. Eine andere Möglichkeit, die Funktion aus Beispiel 9.2 zu plotten, wäre die Scilab-Funktionen feval() und plot2d zu verwenden: Die erstgenannte evaluiert im Fall der Eingabe von feval(x,f) eine (zuvor definierte) ScilabFunktion f an den Stellen x(j) eines Vektors x, wobei j=1,...,length(x). Das Ergebnis ist also ein Vektor der gleichen Länge wie x. Beispiel 9.3. x=[0:0.1:4]; 16 function [y]=f(x) y=x*x; endfunction 12 8 4 y=feval(x,f); plot2d(x,y) 0 0 17 1 2 3 4 Dies scheint auf den ersten Blick etwas aufwendiger als zu zuvor beschriebene Variante zu sein, hat aber den Vorteil, dass man damit Funktionenfamilien plotten kann, die formal von zwei Variablen abhängen: Beispiel 9.4. Wir möchten die Funktionenfamilie fm (x) = x sin(mx), x ∈ [−6, 6], für m ∈ {1, 3, 10} plotten. 6 function y=f(x,m) y=x*(sin(m*x)) endfunction 4 x=[-6:0.1:6]; 2 m=1; y1=feval(x,f); m=3; y2=feval(x,f); 0 m=10; y3=feval(x,f); -2 plot2d(x,y1,style=5) plot2d(x,y2,style=4) plot2d(x,y3,style=2) -4 -6 -6 -4 -2 0 2 4 Dabei bewirkt style=i, dass für die Verbindungslinien eine bestimme Farbe bzw. Form verwendet wird. Folgende Möglichkeiten gibt es: i=1: schwarz, i=2: blau, i=3: grün, i=4: hellblau, i=5: rot, i=6: magenta, i=7: gelb, i=0: nur die Punkte werden gezeichnet, i=-1: statt der Punkte 18 6 werden ”+” verwendet, i=-2: statt der Punkte werden ”x” gezeichnet. Manchmal ist es sinnvoll, zwei Funktionen mit verschiedenen Stützstellen (x-Werten) zu verwenden. Möchte man nämlich von der einen Funktion nur einige Punkte von der anderen aber den Funktionsgraphen plotten, so muss man verschiedene x-Vektoren definieren (und auch in plot2d() übergeben). Weitere Gestaltungsmöglichkeiten bietet der Befehl xtitle(’Titel’, ’x-Achse’,’y-Achse’), mit dem man die Grafik, die x- und die y-Achse beschriften kann. Mit xgrid(i) kann man ein Gitter einblenden lassen, wobei i die Farbe des Gitters definiert (Farbgebung s.o.). Durch den Befehl legend(’Funktion 1’, ’Funktion 2’, ...); lässt sich eine Legende erzeugen. All diese Befehle kann man auch im Zusammenhang mit fplot2d() verwenden. Darüberhinaus ist es auch möglich, xtitle(), xgrid() und legend() in 3D-Plots einzusetzen. Beispiel 9.5. xdel clf() x=[-5:0.1:5]; function y=f1(x) y=x^ 2+x^ 3; endfunction function y=f2(x) y=x^ 2; endfunction fplot2d(x,f1,style=5) fplot2d(x,f2,style=2) xgrid(3) legend(’x^ 2+x^ 3’,’x^ 2’); xtitle(’Zwei Polynome’,’x-Achse’,’y-Achse’) 19 Zwei Polynome 150 x^2+x^3 x^2 y-Achse 100 50 0 -50 -100 -5 9.3 -4 -3 -2 -1 0 1 x-Achse 2 3 4 5 m × n - Grafik - Matrix Mit Hilfe der Scilab-Funktion subplot() lässt sich eine m × n - GrafikMatrix erzeugen, d.h. in einem einzigen Fenster werden in m Zeilen und n Spalten m · n Grafiken gezeichnet. Der dritte Parameter in subplot(m,n,s) bestimmt die Position in der Matrix. Beispiel 9.6. xdel clf() //schließt alle offenen Grafikfenster //löscht die bisherige Grafik x=[0:0.1:10]; //x=[0, 0.1, 0.2, ... ,9.8, 9.9, 10] y1=sin(x); y2=cos(x); //y1=[sin(0), sin(0.1), ... , sin(10)] //y2=[cos(0), cos(0.1), ... , cos(10)] 20 // Grafik 1: - - - - - - - - - - - - - - - - - - - - - - - subplot(2,1,1) plot2d(x,y1,style=5) //erzeugt eine 2x1-Grafik-Matrix; //der nachstehende plot-Befehl ist für //die obere (=erste) Grafik //plottet die Punkte (0,sin(0)), //(0.1,sin(0.1)), ..., (10,sin(10)) //samt Verbindungslinien in rot // Grafik 2: - - - - - - - - - - - - - - - - - - - - - - - subplot(2,1,2) //der nachstehende plot-Befehl ist für //die untere (=zweite) Grafik //plottet die Punkte (0,cos(0)), //(0.1,cos(0.1)), ..., (10,cos(10)) //samt Verbindungslinien in blau plot2d(x,y2,style=2) 1.0 0.6 0.2 -0.2 -0.6 -1.0 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1.0 0.6 0.2 -0.2 -0.6 -1.0 0 21 9.4 2D-Kurven Der Befehl zum Plotten einer Kurve γ : [a, b] → R, 2 ( t 7→ x(t) y(t) ) = γ(t) ist plot2d(x,y), wobei x und y gleich lange Vektoren sind, welche die Funktionswerte von x(t) und y(t) enthalten. Hier kann man wieder die weiteren Optionen verwenden, welche in Kapitel 9.2 beschrieben sind. Beispiel 9.7. Wir möchten die Kurve ( γ(t) = cos(t) t ) , t ∈ [0, 6π] grafisch darstellen. xdel clf() t=[0:0.1:6*%pi]; plot2d(cos(t),t) 20 18 16 14 12 10 8 6 4 2 0 -1 0 1 Handelt es sich bei den Komponenten um kompliziertere Funktionen, so muss man diese erst als Scilab-Funktionen schreiben und dann mit Hilfe von feval() auswerten lassens. Diese evaluiert eine (zuvor definierte) ScilabFunktion f an den Stellen t(j), wobei j=1,...,length(t). Das Ergebnis ist also ein Vektor der gleichen Länge wie t. 22 Beispiel 9.8. Wir möchten die Kurve ( γ(t) = t cos(t) t sin(t) ) t ∈ [0, 25] , grafisch darstellen. xdel clf() t=[0:0.1:25]; function x=f1(t) x=cos(t)*t; endfunction function y=f2(t) y=sin(t)*t; endfunction x=feval(t,f1); y=feval(t,f2); 25 20 15 10 5 0 -5 -10 -15 -20 -25 -25 -15 -5 5 15 25 plot2d(x,y) 9.5 Höhenlinien R R Die Höhenlinien Hc einer Funktion f : D ⊂ 2 → , (x, y) 7→ f (x, y) zu einem Niveau c ∈ sind Teilmengen des 2 , nämlich R R R2 | f (x, y) = c }. Der Graph einer solchen Funktion liegt allerdings im R3 . Hc = {(x, y) ∈ D ⊂ Zum Zeichnen von Höhenlinien einer Funktion f gibt es bei Scilab den Befehl fcontour2d(). Der optionale Parameter i in fcontour2d(x,y,f,i) bestimmt dabei die Anzahl der gezeichneten Höhenlinien; x und y sind gleichlange Vektoren. 23 Beispiel 9.9. Das folgende Programm zeichnet sieben Höhenlinien der Funktion f (x, y) = x2 − y 2 auf dem Bereich [−5, 5] × [−5, 5]. Da diese Grafikfunktion sehr zeitaufwendig ist, wählen wir lediglich 0.5 als Schrittweiten für die Vektoren. 5 xdel clf() x=[-5:0.5:5]; y=[-5:0.5:5]; 4 -18.8 -12.5 3 -6.25 2 1 18.8 12.56.25 0 6.2512.5 18.8 0 function z=f(x,y) z=x^ 2-y^ 2; endfunction -1 -2 -6.25 fcontour2d(x,y,f,7) -3 -12.5 -18.8 -4 -5 -5 -4 -3 -2 -1 9.6 0 1 2 3 4 5 2D-Vektorfelder Die grafische 2D-Darstellung eines Vektorfeldes ( ) u(x, y) f (x, y) = , (x, y) ∈ D ⊂ v(x, y) R2 R kann mithilfe des Befehls champ(x,y,U,V) erfolgen. Dabei sind x,y ∈ k die Vektoren der Länge k mit den x- und y-Werten und U,V ∈ k×k Matrizen mit U(i,j)= u(x(i), y(j)) und V(i,j)= v(x(i), y(j)), also die Komponenten des Vektorfeldes am Punkt (x(i),y(j)). Diese Matrizen bekommen wir mit Hilfe des Befehls feval(x,y,func), wenn wir für func jeweils die Komponenten der Funktion f einsetzten. R 24 Beispiel 9.10. Gegeben sei das Vektorfeld ( ) cos(x) f (x, y) = , sin(y) (x, y) ∈ [−7, 7] × [10, 10]. Mit dem folgenden Programm können wir es grafisch darstellen lassen: xdel clf() 10 x=[-7:7]; y=[-10:10]; 8 function u=f1(x,y) u=cos(x); endfunction 4 6 2 0 function v=f2(x,y) v=sin(y); endfunction -2 -4 -6 U=feval(x,y,f1); V=feval(x,y,f2); champ(x,y,U,V) 9.7 -8 -10 -8 -6 -4 -2 0 2 4 6 8 Flächen in der Ebene Um parametrisierte Flächen in der Ebene zu plotten, verwenden wir den Befehl plot(). Dazu schreiben wir die Komponenten der Funktion ( ) x(r, s) ⃗x(r, s) = , r ∈ [a, b], s ∈ [c, d], y(r, s) 25 als Scilab-Funktionen x und y und werten diese mit dem Befehl feval(r,s,x), etc. aus. Wie schon in Kapitel 9.6 erklärt, ist das Ergebnis jeweils eine Matrix, welche die Funktionswerte an den Stellen (r(i),s(j)) enthält. Dabei sind r und s Vektoren, die den Intevallen [a, b] bzw. [c, d] entsprechen. Diese sollten mit Hilfe von linspace() erstellt werden. Denn verwendet man z.B. im Fall φ ∈ [−π, π] die Definition phi=[-%pi:0.05:%pi], so entsteht in der Grafik ein Spalt bei φ = π. Beispiel 9.11. Wir möchten den Kreisring plotten, der durch die Parametrisierung ( ) r cos(φ) ⃗x(r, φ) = , φ ∈ [−π, π], r ∈ [0.5, 1] r sin(φ) gegeben ist. xdel clf() 1.0 phi=linspace(-%pi,%pi,50); 0.8 r=linspace(0.5,1,100); 0.6 function u=x(phi,r) u=r*cos(phi); endfunction 0.4 0.2 0.0 function v=y(phi,r) v=r*sin(phi); endfunction -0.2 U=feval(phi,r,x); V=feval(phi,r,y); -0.8 -0.4 -0.6 -1.0 -1.0 -0.6 -0.2 0.2 0.6 plot(U,V) Wer gerne lieber einen schwarzen Kreisring hätte, möge den Plot-Befehl plot2d(U,V, style=[ones(100,1)]) verwenden. 26 1.0 10 Grafische Darstellung - 3D Beim Erstellen von 3D-Grafiken kann wieder der Befehl subplot() verwendet werden. Die optionalen Parameter der einzelnen Plot-Befehle werden hier nicht im einzelnen erörtert und auch nicht zur Bearbeitung der Hausaufgaben benötigt. Informieren Sie sich ggf. im Help-Browser darüber, indem Sie z.B. help plot3d in die Konsole eingeben, siehe Kapitel 3.5. Die in Kapitel 9.2 beschriebenen Grafik-Befehle xtitle(), legend() und xgrid() können aber auch in 3D-Grafiken eingesetzt werden. 10.1 Funktionsgraphen R R Sei f : D ⊂ 2 → . Ähnlich wie in Kapitel 9.2 definiert man einen ”Definitionsbereich”, eine Scilab-Funktion f() und verwendet dann die ScilabFunktion fplot3d(). Dabei müssen die Vektoren, welche den Definitionsbereich charakterisieren nicht die gleiche Länge haben. Beispiel 10.1. Wir plotten den Graphen der Funktion f (x, y) = x2 + y 2 , (x, y) ∈ [−5, 5] × [−5, 5]. xdel clf() x=[-5:0.1:5]; y=[-5:0.1:5]; function z=f(x,y) z=x^ 2+y^ 2; endfunction fplot3d(x,y,f) 27 Beispiel 10.2. Wir plotten den Graphen der Funktion f (x, y) = x + y, (x, y) ∈ [−5, 5] × [−5, 5]. xdel clf() x=[-5:0.1:5]; y=[-5:0.1:5]; function z=f(x,y) z=x+y; endfunction fplot3d(x,y,f) Hier bietet es sich an die Grafik zu drehen (oben links ª im Grafik-Fenster): Beispiel 10.3. In diesem Beispiel möchten wir die Funktion f (x, y) = x2 1 + y2 auf dem Bereich [−5, 5] × [−5, 5] plotten. Das Problem dabei ist, dass die Funktion bei (0, 0) gar nicht definiert ist. Dies ist aber auch der einzige kriti28 sche Punkt. Mit einem Trick lässt sie sich doch auf diesem Bereich darstellen: Wir definieren die Vektoren x = y = (−5, −4.89, −4.78, ..., −0.16, −0.05, 0.06, ..., 4.79, 4.9). Damit wird die Funktion nicht an dem kritischen Punkt ausgewertet aber dennoch auf dem ”ganzen” Bereich dargestellt: xdel clf() x=[-5:0.11:5]; y=[-5:0.11:5]; function z=f(x,y) z=1/(x^ 2+y^ 2); endfunction fplot3d(x,y,f) Eine andere Möglichkeit wäre den Definitionsbereich aufzuteilen, und die Funktion auf den unkritischen Bereichen durch mehrfachen Aufruf des Plotbefehls zu zeichnen. 10.2 3D-Kurven Zum Zeichnen einer Kurve γ : [a, b] → R3 , x(t) t 7→ γ(t) = y(t) z(t) gibt es bei Scilab den Befehl param3d(x,y,z), wobei x, y und z gleichlange Vektoren sind, welche die Funktionswerte von x(t), y(t) und z(t) enthalten. Beispiel 10.4. Wir möchten die Kurve cos(t) γ(t) = sin(t) , t 29 t ∈ [0, 8π] grafisch darstellen. (Die folgende Grafik haben wir geeignet gedreht.) 30 25 xdel clf() 20 Z t=[0:0.1:8*%pi]; 15 10 param3d(cos(t),sin(t),t) 5 01 X -1 0 0 -1 1 Y Wie schon in Kapitel 9.2 beschrieben, wird Scilab eine Fehlermeldung ausgeben, wenn man z.B. param3d(sin(t),cos(t),t*t) eingeben würde, denn dies würde bedeuten, dass zwei (Zeilen-) Vektoren miteinander multipliziert werden müssten. Abhilfe kann man mit der Scilab-Funktion feval() schaffen, welche eine (zuvor definierte) Scilab-Funktion f an den Stellen t(j), wobei j=1,...,length(t) evaluiert. Das Ergebnis ist also ein Vektor der gleichen Länge wie t. Es können auch noch andere Probleme auftreten: So ergibt z.B. die Multiplikation 1/t*cos(t), wobei t=[0:0.1:5], eine Matrix, denn aus dem Zeilenvektor t macht Scilab einen Spaltenvektor 1/t. Multiplikation mit einem Zeilenvektor ergibt dann eine Matrix. Daher ist das oben beschriebene Verfahren für kompliziertere Funktionen immer sinnvoll. Beispiel 10.5. Wir plotten die Kurve t cos(t) γ(t) = t sin(t) , t 30 t ∈ [0, 50]. xdel clf() t=[0:0.1:50]; function x=f1(t) x=t*cos(t); endfunction function y=f2(t) y=t*sin(t); endfunction x=feval(t,f1); y=feval(t,f2); 50 45 40 35 Z 30 25 20 15 10 5 0 50 -50 X 0 -50 50 param3d(x,y,t) 10.3 0 Y Flächen im Raum Um parametrisierte Flächen im Raum zu plotten, kann man den Befehl plot3d2() verwenden. Dazu schreibt man die Komponenten der Funktion x(r, s) ⃗x(r, s) = y(r, s) , r ∈ [a, b], s ∈ [c, d], z(r, s) als Scilab-Funktionen x,y,z und wertet diese mit dem Befehl feval(r,s,x), etc. aus. Wie schon in Kapitel 9.6 erklärt, ist das Ergebnis jeweils eine Matrix, welche die Funktionswerte an den Stellen (r(i),s(j)) enthält. Dabei sind r und s Vektoren, die den Intervallen [a, b] bzw. [c, d] entsprechen. Diese sollten mit Hilfe von linspace() erstellt werden. Denn verwendet man z.B. im Fall ϕ ∈ [−π, π] die Definition phi=[-%pi:0.05:%pi] wählt, so entsteht in der Grafik ein Spalt bei ϕ = π. 2 2 Eine elegantere Variante ist es, die Befehle plot3d und eval3dp() zu verwenden. Diese werden wir hier aber nicht vorstellen. 31 Beispiel 10.6. Wir möchten die Kugeloberfläche plotten, welche als parametrisierte Fläche sin(θ) cos(ϕ) ⃗x(ϕ, θ) = sin(θ) sin(ϕ) , ϕ ∈ [−π, π], θ ∈ [0, π] cos(θ) gegeben ist. xdel clf() phi=linspace(-%pi,%pi,50); theta=linspace(0,%pi,50); function u=x(phi,theta) u=sin(theta)*cos(phi); endfunction function v=y(phi,theta) v=sin(phi)*sin(theta); endfunction function w=z(phi,theta) w=cos(theta); endfunction U=feval(phi,theta,x); V=feval(phi,theta,y); W=feval(phi,theta,z); plot3d2(U,V,W) 32 11 Integration 11.1 Integration-1D Ist f : [a, b] → R eine stetige Funktion, so kann man mit dem Befehl intg(a,b,f) näherungsweise das Integral von f auf dem Intervall [a, b] berechnen. Dazu muss man f als Scilab-Funktion schreiben. Beispiel 11.1. Sei x ∈ [0, 2]. f (x) = x2 , Per Hand ausgerechnet ergibt das gesuchte Integral den Wert 8/3. Mit Scilab geht das so: function y=f(x) y=x^ 2 endfunction intg(0,2,f) Das Ergebnis mit Scilab ist 2.6666667, also näherungsweise 8/3. 11.2 Integration-2D R Für Integrale auf einem Rechteck [a, b] × [c, d] ⊂ 2 gibt es bei Scilab den Befehl int2d(X,Y). Dazu muss man das Rechteck zunächst in 2 Teildreiecke3 zerlegen. Die Matrizen X und Y enthalten dabei die x- und y-Koordinaten der Eckpunkte der Dreiecke und sind vom Format 3 × 2. Besondere Vorsicht ist allerdings bei uneigentlichen Integralen geboten. Hier kann das Ergebnis sehr ungenau werden. Mehr Informationen zu diesem Befehl und dessen weiteren Parametern erhalten Sie im Hilfe Browser (help int2d). 3 Das Rechteck kann auch in n > 2 Dreiecke zerteilt werden; dann sind die Matrizen X und Y vom Format 3×n. Eine Unterteilung in mehr als 2 Dreiecke kann notwendig werden, wenn das Gebiet, über welches man integriert, kein Rechteck sondern zum Beispiel ein Fünfeck ist. 33 Beispiel 11.2. Sei (x, y) ∈ [0, π] × [0, π]. f (x, y) = cos(x + y), function z=f(x,y) z=cos(x+y) endfunction 3.5 X=[0 0 %pi %pi %pi 0]; 3.0 Y=[0 0 0 %pi %pi %pi]; 1.5 1.0 int2d(X,Y,f) 2.5 2.0 0.5 0.00 1.17 2.33 3.50 Eine andere Möglichkeit, so ein Integral zu berechnen ist, das Doppelintegral auf zwei Einfachfachintegrale zurückzuführen. Dies wird hier allerdings nicht beschrieben sondern Teil einer Hausaufgabe sein. Diese Vorgehensweise ist auch sinnvoll, wenn der Bereich B, auf welchem die Funktion f integriert werden soll, nicht in Teildreiecke zerlegbar ist, aber von der Form B = {(x, y) ∈ R2 | a ≤ b ≤ x, α(x) ≤ y ≤ β(x)} B = {(x, y) ∈ R2 | a ≤ b ≤ y, α(y) ≤ x ≤ β(y)} bzw. ist. 34