Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

OptimizationToolbox- positive Nullstelle am nächsten zu 0

 

Fubaaa88
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2019, 10:54     Titel: OptimizationToolbox- positive Nullstelle am nächsten zu 0
  Antworten mit Zitat      
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))
               
    if qm(e) > qmR(e)        
        x0 = [2e-4];    
        Xzero(e) = fzero(fun,x0)
        Xsolve(e) = fsolve(fun,x0)                
   
    elseif qm(e) < qmR(e)        
        x0 = [-2e-4];
        Xzero(e) = fzero(fun,x0)
        Xsolve(e) = fsolve(fun,x0)
       
    end
end  
 

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-Cool 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?

Vielen Dank für eure Hilfe !

Grüße Fubaaa
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 19.929
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 15.05.2019, 11:08     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Fubaaa88
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2019, 13:44     Titel:
  Antworten mit Zitat      
Vielen Dank für deine schnelle Antwort Harald,

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 Sad

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:(

Gruß

Fubaaa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.929
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 15.05.2019, 14:13     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Fubaaa88
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2019, 14:24     Titel:
  Antworten mit Zitat      
Ich habe folgendes Programm, welches mir x-Werte iterativ berechnet.

Code:
x(k,e)=[0];
for e=1:H
    for k=1:laenge-1
        if qm(k,e)>qmR(k,e)
            while qm(k,e)-qmR(k,e)>1.0e-15 %10 Nanometer
                x(k,e)=x(k,e)+0.000000001;
                u=0;
                for i=1:50
                    qm(k,e)=u + ( (10^(-4))*lambda* (sqrt(i*omega/(2*a)) * exp(-x(k,e)*(sqrt(i*omega/(2*a)))) *...
                    ( f(i)*cos( i*pi*SP(e)/N- x(k,e)*(sqrt(i*omega/(2*a))) )...
                    + g(i)*sin( i*pi*SP(e)/N - x(k,e)*(sqrt(i*omega/(2*a))) )) ) );
                u=qm(k,e);               %EINHEIT: W/m^2*(10^-4)
                end
                qm(k,e)=-qm(k,e);
            end
       
        elseif qm(k,e)<qmR(k,e)
            while qm(k,e)-qmR(k,e)<1.0e-8
                x(k,e)=x(k,e)-0.000001;
                u=0;
                for i=1:50
                    qm(k,e)=u + ( (10^(-4))*lambda* (sqrt(i*omega/(2*a)) * exp(-x(k,e)*(sqrt(i*omega/(2*a)))) *...
                    ( f(i)*cos( i*pi*SP(e)/N- x(k,e)*(sqrt(i*omega/(2*a))) )...
                    + g(i)*sin( i*pi*SP(e)/N - x(k,e)*(sqrt(i*omega/(2*a))) )) ) );
                u=qm(k,e);               %EINHEIT: W/m^2*(10^-4)
               
                end
                qm(k,e)=-qm(k,e);
            end
        end
    end
end
 


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.

Grüße

Fubaaa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.929
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 15.05.2019, 15:15     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Fubaaa88
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2019, 15:52     Titel:
  Antworten mit Zitat      
Das werde ich mal ausprobieren.
Vielen Dank für deine Mühe !
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2019 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.