Das Beispiel

TraegerEingGelBS02Im Skript "Biegeschwingungen gerader Träger" wird gezeigt, dass für die analytische Berechnung der Eigenfrequenzen der Biegeschwingungen des nebenstehend skizzierten Tägers die Nullstellen der Funktion

fvonlambda

bekannt sein müssen (die Funktion hat unendlich viele Nullstellen). Besonders interessant ist der kleinste von Null verschiedene positive Wert λ1, mit dem die Eigenfrequenz der Grundschwingung berechnet werden kann. Dieser Wert soll nachfolgend ermittelt werden.

Für die Berechnung einer Nullstelle einer nichtlinearen Gleichung f(x) = 0 sind zwei Aufgaben zu erledigen:

  • Lokalisieren (Ermitteln eines Werts in der Nähe der gesuchten Nullstelle, eventuell auch eines Intervalls, in dem die Nullstelle liegt) und
     
  • Berechnen der Nullstelle.
Lösung mit Matlab

Es ist sofort ersichtlich, dass  λ = 0 eine Nullstelle der Funktion ist. Diese interessiert nicht. Deshalb wird in dem nachfolgend rechts zu sehenden Matlab-Script folgende Strategie verfolgt:

  • Es werden die Funktionswerte in einem Intervall berechnet, dessen untere Grenze ein sehr kleiner positiver Wert ist, die obere Grenze wird so groß gewählt, dass angenommen werden darf, dass mindestens eine Nullstelle in diesem Bereich liegt (eine graphische Darstellung des interessierenden Bereichs ist in jedem Fall hilfreich).
     
  • Nullstelle1Bei einem Vorzeichenwechsel wird eine Nullstelle in der Nähe des letzten λ-Wertes vermutet. Mit der Matlab-Function fzero wird der genaue Wert der Nullstelle bestimmt, Matlab-Help: "x = fzero(fun,x0) tries to find a zero of fun near x0, if x0 is a scalar. fun is a function handle."

Das nebenstehend zu sehende Script Nullstelle1.m realisiert diese Berechnung. Nach dem Ermitteln einer Nullstelle wird die Rechnung abgebrochen. Im Command Window findet man das Ergebnis:

Nullstelle1CW

Das Ergebnis ist korrekt, wie z. B. auf dieser Seite auch mit mehreren anderen Lösungsverfahren bestätigt wird.

 

Vorsicht ist geboten!

In älteren Lehrbüchern findet man bei dieser Aufgabe den Hinweis, dass man die nichtlineare Gleichung

sincosh

durch  cosλ coshλ dividieren sollte, so dass die für die Nullstellenberechnung gleichwertige Gleichung

tanMinustanh 

Nullstelle2aCW02entsteht. 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.

Nullstelle2bCWDas 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.

Nullstelle2

 

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").