|
Vorsicht ist geboten!
In älteren Lehrbüchern findet man bei dieser Aufgabe den Hinweis, dass man die nichtlineare Gleichung
durch cosλ coshλ dividieren sollte, so dass die für die Nullstellenberechnung gleichwertige Gleichung
entsteht. Dieser Gleichung sieht man die Lösungen sofort an: Es sind die Schnittpunkte der tan- und der tanh-Funktion. Wenn man nun in dem oben zu sehenden Script die Zeile 17 durch
f = tan(lam)-tanh(lam) ;
ersetzt, wird die Erwartung, das gleiche Ergebnis wie oben zu erhalten, nicht erfüllt. Man erhält vielmehr das im Command Window rechts zu sehende Ergebnis. Es ist nicht die gesuchte Nullstelle, sondern die durch die tan-Funktion erzeugte Polstelle. Weil es ein ungerader Pol (mit Vorzeichenwechsel) ist, wird auch dieser Punkt von fzero als Ergebnis abgeliefert.
Dies ist zumindest verwirrend, entspricht aber der dokumentierten Arbeitsweise von fzero. Man kann sich das über das Anfordern einer erweiterten Ausgabe von fzero bestätigen lassen. Wenn man die Zeile 10 im Script Nullstelle1.m durch
[lam1 flam1 exitflag] = fzero (@ewg , lam)
ersetzt, erhält man zusätzlich den Funktionswert (für den man an einer Nullstelle einen Wert annähernd Null erwarten kann) und ein exitflag, das eine Aussage über das abgelieferte Ergebnis enthält.
Das nebenstehende Command Window zeigt das Ergebnis dieser Rechnung: Der Funktionswert ist sehr groß (theoretisch müsste er für die berechnete Polstelle -∞ oder +∞ sein). Das exitflag zeigt mit dem Wert -5 laut Matlab-Hilfe: "fzero might have converged to a singular point."
Tatsächlich darf man nur dann eine Nullstelle als Ergebnis von fzero erwarten, wenn das exitflag den Wert 1 hat. Nachfolgend wird deshalb ein Script Nullstelle2.m gezeigt, das dieses exitflag abfragt und nur dann das abgelieferte Ergebnis als Nullstelle akzeptiert (und die Rechnung abbricht), wenn das exitflag dieses tatsächlich als Nullstelle ausweist.
|
Vorsicht!
Dass das Nullstellenprogramm fzero nicht garantiert eine Nullstelle, sondern auch einen anderen Punkt abliefern kann, bei dem ein Vorzeichenwechsel des Funktionswertes erfolgt, entspricht der Beschreibung dieser Function im Help-System von Matlab (bei fzero ganz weit unten unter Limitations).
Man sollte sich also mit einer graphischen Darstellung der Funktion und/oder der Abfrage des exitflags absichern.
|
|
|
Liebe Matlab-Entwickler,
es ist richtig, die Function arbeitet korrekt im Sinne der Beschreibung. Aber sie arbeitet nicht so, wie es der Anwender (beim Namen fzero) erwartet.
Und weil der Algorithmus bei der Annäherung an den Punkt des Vorzeichenwechsels ganz einfach testen kann, ob sich dabei die Funktionswerte verkleinern oder vergrößern, wäre es doch kein Problem, tatsächlich nur Nullstellen abzuliefern (und z. B. nur dann, wenn der Anwender das exitflag anfordert, auch andere "Vorzeichenwechselpunkte").
|
|
|