Anzufertigen sind die MATLAB-Funktionen quadgl, quadgleval, rangetest und ein MATLAB-Skript ueblogical. Die Funktionen enthalten die Lösungen für alle Unterbeispiele und das Skript ist eine einfache Testroutine für die Funktionen.
Die vorbereiteten Programme für die Übung können mit dem Befehl !uebungsdaten geladen werden. Die Übungsnummer ist 5. Die Programme, die zur Verfügung stehen sind:
Benötigt wird auch Basiswissen über Logische Operatoren.
(12.2) | ||||
triviale Lösung |
Zu erstellen ist nun ein Unterprogramm
[x1,x2]=quadgl(a,b,c)
welches 12.1 löst, wobei die Koeffizienten , und
beliebige Felder mit reellen Zahlen sein können. D.h. die Gleichung soll
simultan für mehrere Werte der Koeffizienten gelöst werden, wobei die
Ergebnisse in den Feldern und gespeichert werden sollen. Zu
verwenden sind dabei die Lösungen aus 12.2, wobei dort wo
keine Lösungen existieren, der Wert NaN (entspricht: Not A Number)
verwendet werden soll. Dort wo beliebige Lösungen erlaubt sind, soll für
die triviale Lösung 0 verwendet werden.
Dazu notwendig ist Folgendes:
Die Anzahl der Eingabeparameter (7.1.6) sollte hier immer drei sein (keine Defaultwerte), ansonsten sollte eine Fehlermitteilung geschrieben werden (error).
Außerdem sollte mit Hilfe der Befehle issamesize (wurde bereitgestellt), isnumeric und isreal überprüft werden, ob die Koeffizientenfelder gleich groß sind, ob sie Zahlen sind und, ob sie reelle Zahlen enthalten. Hilfe zu den Befehlen bekommt man z.B. mit help issamesize oder auch im Abschnitt 7.1.4. Falls die Bedingungen nicht erfüllt sind, sollte wieder eine Fehlermitteilung geschrieben werden.
Danach kann man drei logische Felder entsprechend der drei logischen Bedingungen in 12.2 erzeugen und diese dann auf beiden Seiten der Zuweisungen verwenden. Damit ist sichergestellt, dass die jeweiligen Berechnungen nur durchgeführt werden, wenn die entsprechende Bedingung erfüllt ist.
Zwei Dinge sollte man sich überlegen: Warum ist es besser die Diskriminante nur einmal zu berechnen und dann in der Formel für zu verwenden? Warum muss man in MATLAB keine Unterscheidung treffen, ob der Wert größer oder kleiner Null ist?
[r1,r2] = quadgleval(a,b,c,x1,x2)
ueblogical
'y'
) zugewiesen werden. Für das Setzen der Defaultwerte
empfiehlt sich die Verwendung von isempty.
Erzeugen Sie nun die drei -Felder a, b und c mit gleichverteilten Zufallszahlen zwischen und . Der Befehl rand(n) liefert dabei gleichverteilte Zufallszahlen im Interval zwischen 0 und . Die Anpassung an das Intervall zwischen und erfolgt dabei durch eine Skalierung (Multiplikation) und Verschiebung (Addition).
Setzen Sie danach die mittlere Spalte von a und die mittlere Zeile von b auf den Wert Null. Wenn es keine mittlere Zeile oder Spalte gibt (gerade Anzahl), dann nehmen Sie die Spalte (Zeile) mit dem nächsthöheren Index.
Rufen Sie quadgl und danach mit den Resultaten quadgleval auf. Die Resultate können Sie graphisch darstellen:
showmata(real(x1),real(x2)) % Realteile pause(delay) % Verzögerung showmata(imag(x1),imag(x2)) % Imaginärteile pause(delay) showmata(abs(r1),abs(r2)) % Absolutwerte der rechten Seite pause(delay)
Die Befehle real, imag und abs berechnen den Realteil, den Imaginärteil und den Absolutwert.
Sie sollten nun die Resultate in einer Farbcodierung sehen, wobei weisse Bereiche nan symbolisieren. Wegen numerischer Ungenauigkeiten ergeben sich für die Werte auf der rechten Seite nicht nur Null, sondern auch kleine Werte im Bereich .
Zählen Sie nun für die beiden Felder ar1=abs(r1) und ar2 die Anzahl der Werte mit exakter Null, mit nan (isnan). Dabei summiert man immer über alle Werte (Doppelpunkt) in den entsprechenden logischen Arrays.
Außerdem soll man in einer for-Schleife jeweils alle Werte zählen, wobei k von bis laufen soll.
Geben Sie all diese Summen formatiert aus und überlegen Sie, ob sie stimmen können. Es sollten eine gewisse Anzahl von Nullen, von nan und sonst eher kleine Werte vorkommen. Kommen zu große Werte vor, ist sicher etwas falsch.
[m,count] = rangetest(m,b,e)
Für die Output-Matrix m soll Folgendes gelten
(12.4) | ||||
(12.5) | ||||
(12.6) |
Sie können auf alle Überprüfungen und auf das Setzen von Defaultwerten verzichten, wichtig ist nur die Funktionalität der MATLAB-Funktion. Die gesamte Aufgabe soll wieder ohne if und for unter Verwendung der logischen Indizierung funktionieren.
ueblogical
[-1,0,1]
.
Stellen Sie die Matrix vor und nach der Ersetzung graphisch dar. Die Bilder sollten dabei ungefähr so aussehen.
Geben Sie die Werte von count formatiert aus und überprüfen Sie, ob die Gesamtzahl der Ersetzungen gleich der Anzahl der Elemente in m ist.
Winfried Kernbichler 2005-04-26