Verfasst am: 15.05.2019, 09:54
Titel: OptimizationToolbox- positive Nullstelle am nächsten zu 0
Guten Tag,
ich arbeite erst seit einigen Tagen mit Matlab, und komme bei folgendem Problem nicht weiter.
Ich habe eine Funktion "fun" (Fourier-Reihe) für einen Wandtemperaturübergang an e Messstellen. Diese Funktion möchte ich auf Nullstellen untersuchen.
So sieht mein Code bisher aus:
Code:
i = [1:1:50]
for e=[1:9]
fun = @(x)(((10^(-4))*-lambda* sum((sqrt(i.*omega./(2*a)) .*exp(-x.*(sqrt(i.*omega./(2*a)))) .*... ((A(e,i)+B(e,i)).*cos( i.*pi.*SP(e)./N - x.*(sqrt(i.*omega./(2*a))))...
+ (-A(e,i)+B(e,i)).*sin( i.*pi.*SP(e)./N - x.*(sqrt(i.*omega./(2*a)))))))) - qmR(1,e))
Diese Funktion hat mehrere Nullstellen, sowohl positive als auch negative.
Momentan muss ich beim definieren der Startwerte x0 glück haben, um die erste positive oder negative Nullstelle am nächsten zu x=0 zu finden.
Meine Idee war, sowol für die positiven als auch für die negativen Nullstellen ein pos./negatives Suchintervall für fzero zu definieren, aber nicht immer wechselt in diesem Intervall dann auch das Vorzeichen, und fzero bricht ab...
Wenn ich meinen Startwert x0 sehr nahe an 0 definiere (z.B. -1e- dann liefert mir
die Optimierung mit fzero und auch fsolve positive Nullstellen, die nahe an x=0 im positiven sind.
Mit dem oben gezeigten Code, finde ich für manche Messstellen (e) das richtige X und für manche nicht. Entwerder sind sie nicht die nächsten zu x=0 oder das Vorzeichen stimmt nicht.
Habt ihr eine Idee, wie ich von meiner Funktion die erste positive (für qm>qmR) und die erste negative (für qm<qmR) Nullstelle, die am nächsten bei 0 liegt, finden kann?
bei fzero kannst du auch ein Intervall angeben, z.B.
[0, kleineZahl]
Damit wäre eine positive Nullstelle garantiert. kleineZahl sollte möglichst klein gewählt werden, aber so, dass ein Vorzeichenwechsel vorliegt. Das kann an sich ein iterativer Vorgang sein.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ich habe es versucht mit Intervallen für fzero. Das Problem ist, das der Verlauf der Funktion für jede Messstelle ein anderer ist, und es dann zu dem Problem kommt, dass
bei manchen Messstellen kein Vorzeichenwechsel bzw. ein doppelter Vorzeichenwechsel für das angegebene Intervall vorliegt.
Für manche Messtellen liegt nahe null die Funktion im negativen, wird für kurze Zeit positiv, und ist anschließend wieder negativ.
Ich komme immer wieder an die Punkte wo ich dann mit fzero den Fehler bekomme, dass ich im angegebenen Intervall kein Vorzeichenwechsel habe
Wenn es die Möglichkeit gäbe, dem Optimierer zu sagen, das er von "0" aus nur im positiven bzw. im negativen nach Nullstellen suchen soll, würde es klappen. Aber sowas in der Art habe ich in der Documentation nicht gefunden:(
Gegenfrage: woran siehst du, dass eine Lösung nicht die erste ist? Plottest du? Dem liegen dann ja Daten zugrunde, und du könntest diese Daten nehmen und in ihnen nach dem ersten Vorzeichenwechsel suchen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Und ich habe die Werte von fzero bzw. fsolve mit den Werten aus obigen Code verglichen. An 5 von 9 Messstellen passen die Werte, aber manchmal bekomme ich nicht die erste Nullstelle, und manchmal habe ich Werte mit falschem Vorzeichen.
daraufhin habe ich die Messstellen, die nicht mit obigen Werten übereinstimmen, geplottet, und den mehrfachen Vorzeichenwechsel in diesen Fällen gesehen.
Obiger Code fängt immer von 0 an, und findet so iterativ die erste positive/negative Nullstelle.
Das ist mit fzero in der Art nicht umzusetzten oder ?
Obigen Code sollte ich optimieren und die Rechenzeit würde sich drastisch verkürzen mit fzero, verglichen zu obiger Iteration.
ich wage zu behaupten, dass das Originalprogramm die erste Nullstelle verpasst, wenn sie zu nahe bei 0 liegt.
Letztlich wird es darauf hinauslaufen, abhängig vom Verlauf ein richtiges "kleineZahl" zu "erraten". Ich könnte mir vorstellen, dass man dafür in irgendeiner Form die Frequenz bzw. Periode der Sinus/Cosinus-Schwingungen verwendet.
Das gute: wenn kleineZahl zu nahe an 0 ist, kann man es ja etwas größer machen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Das werde ich mal ausprobieren.
Vielen Dank für deine Mühe !
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.