Verfasst am: 07.01.2016, 15:18
Titel: Variablen an fsolve übergeben
Hallo zusammen,
wie der Titel schon sagt, kriege ich es nicht gebacken Variablen an die fsolve-Function zu übergeben.
Ich habe ein Skript, in dem ich den Variablen Werte zuweise, also A=2,B=3 usw.
in fsolve hab ich dann 2 nichtlineare Funktionen mit 2 Unbekannten. In diesen Funktionen tauchen dann die Parameter A,B,... wieder auf.
Letztendlich will ich im Skript einen Parameter variieren und über eine for-schleife dann jeweils das Ergebnis erhalten. Soweit komme ich aber nicht, da ich es auch nicht für einen fest definierten Einzelfall die Variablen zu übergeben.
Ich hab mir die Dokumentation für anonyme Funktionen jetzt schon x-mal angeguckt aber ich verstehe die Implementation einfach nicht.
Kann mir das vielleicht jemand für Dumme erklären? Bin nicht wirklich sehr versiert programmiertechnisch.
Was ich im Einzelfall gemacht habe ist die Variablen in einem MAT-File zu speichern und innerhalb der Function aufzurufen, aber das ist ja nicht so das Wahre und funktioniert mit der SChleife bei mir nicht.
Also würde ich es gerne über die anonymen Funktionen lösen.
Also ich definiere die Funktion parameterfun mit den entsprechenden nichtlinearen Gleichungen. Dann hab ich im Skript die Werte und den Startwert definiert. Ich versuche dann ein function handle für die anonyme Funktion zu erstellen und dies dann in die fsolve-Funktion zu speisen.
function F = parameterfun(x,hwein,cpWf,mL,CPr,lambda,volkoeff,g,rhoL,Tm,Tumg,L,eta,Pr,mW,hLein,K,a,V)
F = [mW*(hwein-cpWf*x(2)) + mL*(hLein-(0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61))...
-CPr*lambda*(volkoeff*g*rhoL^2*(Tm-Tumg)*L^3*Pr/(eta^2))^(1/4)*Aaussen*(Tm-Tumg)/L, mL*((0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61)-hLein)-K*a*V*(hwein-(0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61)-(cpWf*x(2)-hLein))/... (log((hwein-(0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61))/(cpWf*x(2)-hLein)))];
end
okay nach dem durcharbeiten ein paar beispiele habe ich es glaub ich verstanden.
ich krieg den solver auch zum laufen.
allerdings nun folgendes:
wenn ich es nach dem alten muster rechnen lasse, also variablen in speichern und innerhalb der fsolve function aufrufen, wird eine lösung gefunden.
übergebe ich die variablen mit der anonymen funktion und starte den solver, wird keine lösung gefunden. der solver bricht ab mit der fehlermeldung:
No solution found.
fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
default value of the function tolerance.
das verstehe ich nicht, da beide lösungen im prinzip analog laufen sollten.
die werte für die gesuchten größen sind auch nah bei denen der ersten variante, nur eben nicht komplett gleich, weil der solver vorher abbricht.
Solche Probleme lassen sich auch schön mit dem Debugger untersuchen.
Was du im folgenden beschreibst, kann ich nicht nachvollziehen. Falls sich die Frage durch den Vorschlag nicht löst, auch hier die Bitte, die beiden Code-Varianten zur Verfügung zu stellen.
mehrfach vor. Dann sollte man das in einer Variable zwischenspeichern und im weiteren Verlauf diese Variable verwenden.
Eine Vielzahl Parameter kann z.B. in einer Struktur zusammengefasst werden. Dann wird aus vielen Inputvariablen einer.
Wenn ich in iter1.m das Laden der Variablen durch Inputvariablen ersetze und in Verdunstertest.m statt parameterfun.m aufrufe, dann kommen die gleichen Ergebnisse wie mit dem load/save - Ansatz. Das Problem lag also irgendwo anders, möglicherweise in Unterschieden der Zielfunktion.
ich werde das beherzigen und in zukunft versuchen, das ganze übersichtlicher zu gestalten.
dazu direkt eine frage: wenn ich innerhalb einer funktion dann diesen langen ausdruck ersetze durch eine variable, wird die auch nur innerhalb der funktion verwendet richtig? (da eigener workspace)
jetzt habe ich noch eine weitere frage. der solver löst den ganzen spaß ja iterativ. wieso werden da teilweise ergebnisse mit komplexem charakter ausgespuckt, bei denen der imaginärteil aber 0.00000 ist? liegt das an dem numerischen vorgehen (ich hab keine ahnung von numerik) oder ist der logarithmus der übeltäter?
dazu direkt eine frage: wenn ich innerhalb einer funktion dann diesen langen ausdruck ersetze durch eine variable, wird die auch nur innerhalb der funktion verwendet richtig? (da eigener workspace)
Korrekt.
Zitat:
jetzt habe ich noch eine weitere frage. der solver löst den ganzen spaß ja iterativ. wieso werden da teilweise ergebnisse mit komplexem charakter ausgespuckt, bei denen der imaginärteil aber 0.00000 ist? liegt das an dem numerischen vorgehen (ich hab keine ahnung von numerik) oder ist der logarithmus der übeltäter?
Bereits in der Auswertung der Funktion iter2.m für die Startwerte liefert sie eine komplexwertige Rückgabe. Das Problem ist also der Logarithmus bzw. nicht ausreichend gute Startwerte.
So etwas kannst du auch selbst leicht mit dem Debugger feststellen. Ich habe ja inkl. Schreiben des Texts gerade mal 5 Min. gebraucht :)
nein, du hast schon recht. hab es jetzt auch einmal durchgespielt. allerdings sind meine startwerte eigentlich schon recht nah bei den späteren ergebnissen.
ich muss mal überprüfen, ob die logarithmusargumente richtig definiert sind bzw. ob die ergebnisse physikalisch trotzdem verwertbar sind. intuitiv würde ich sagen ja, da sie sich im richtigen bereich befinden.
und zwar geht es speziell um einen parameter in meinem code. der parameter "a" scheint keine auswirkungen auf das iterationsergebnis zu haben, obwohl er in den nichtlinearen funktionen auftaucht.
ich habe schon von sehr kleinen bis zu sehr großen werten variiert und bekomme für meine gesuchten größen immer dasselbe raus.
in der definition für K habe ich das Produkt a*V und das kürzt sich dementsprechend mit dem gleichen Produkt in einer der Zielgleichungen. 3 Stunden verplempert!
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.