WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

For-Schleife und Fsolve

 

muenzi
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 12.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2010, 20:51     Titel: For-Schleife und Fsolve
  Antworten mit Zitat      
Hallo liebe Gemeinde, ich mal wieder...

Für ein Experiment muss ich eine Diagramm erstellen, dessen Punkte weder als Messwerte, noch als algebraische Gleichung berechenbar sind. Der einzige Weg ist eine iterative Lösung. Allerdings komme ich da nicht so recht vorwärts.
Ich habe folgende Gleichungen
f(T)=x1*p1(T)+(1-x1)*p2(T)-pbar=0
und p1(T)=10^(A1+B1/(C1+T)), p2(T)=10^(A2+B2/(C2+T)), mit bekannten Konstanten A1 bis C2.
Für beliebige T zwischen 0 und 100 möchte ich nun x1 berechnen. Alternativ ist auch die Berechnung von p1(T) und p2(T) und daraus T für beliebige x1 zwischen 0 und 1 denkbar (wird aber wohl schwerer denke ich).
Nun dachte ich mir, fsolve löst ja immer nur die statische Gleichung. x1 muss jedoch variiert werden und so kam ich auf die Idee mit der Schleife. Leider spukt die Schleife nur 1 Ergebnis aus und meldet dann folgenden Fehler:
Optimization terminated: first-order optimality is less than options.TolFun.
Woran liegt das? Habe sicher einen Fehler in der Schleife drin (ist schon etwas her, dass ich damit gearbeitet habe) oder ich verstehe fsolve nicht richtig.
Hier der Code
Code:
x1schleife=0
for Tschleife=0:100;
    Tschleife=Tschleife+1;
    pdampf1as=10.^(Aan1-Ban1./(Tschleife+Can1))*10^-3;
    pdampf2as=10.^(Aan2-Ban2./(Tschleife+Can2))*10^-3;
    x1schleife=fsolve(@(x1schleife) pdampf1as*x1schleife+pdampf2as*(1-x1schleife)-pu,0.5);
end
x1schleife
 

Wär top wenn jmd. helfen könnte.
Gruß Münzi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2010, 22:18     Titel:
  Antworten mit Zitat      
Hallo,

die x1-Werte werden ja auch in jeder Iteration überschrieben und nicht ergänzt. Das Inkrementieren von Tschleife ist unnötig bzw. unsinnig. Und die von dir genannte Fehlermeldung ist schließlich keine Fehler- sondern eine Meldung über den (erfolgreichen) Abschluss der Optimierung.
Code:
Tschleife=0:100;
x1schleife=zeros(size(Tschleife));
for I=1:length(Tschleife)
    pdampf1as=10.^(Aan1-Ban1./(Tschleife(I)+Can1))*10^-3;
    pdampf2as=10.^(Aan2-Ban2./(Tschleife(I)+Can2))*10^-3;
    x1schleife(I)=fsolve(@(x) pdampf1as*x+pdampf2as*(1-x)-pu,0.5);
end
x1schleife

Zudem: ist die Gleichung nicht so einfach, dass man sie von Hand lösen könnte (in Abh. von den Konstanten).
Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
muenzi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 12.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2010, 22:37     Titel:
  Antworten mit Zitat      
Ah okay, das macht natürlich Sinn. Ich danke dir für die Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
muenzi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 12.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2010, 14:48     Titel:
  Antworten mit Zitat      
Ich muss das Thema leider nochmal aufwärmen weil ich kein extra Topic aufmachen will.
Ich muss mit Fsolve folgendes Gleichungssystem lösen:
y1*pu-gamma1(x1)*p1(T)*x1=0
(1-y1)*pu - gamma2(x1)*p2(T)*x1=0
mit x1 von 0 bis 1
gamma1(x1)=lange formel mit vielen konstanten und eben x1
gamma2(x1)=ähnlich wie gamma1(x1)
p1(T)=10^(A1+B1/(T+C1))
p2(T)=10^(A2+B2/(T+C2))
A, B, C sind Konstanten

Iterativ gelöst werden soll T(x1) und T(y1) im Bereich von x1. Also für beispielsweise x1=0,1 , 0,2, 0,3 usw..
Anschließend soll T über x aufgetragen werden.

Hab leider überhaupt keine Ahnung wie das in Fsolve geht. Wär daher über jegliche Hilfe dankbar, auch wenn es vielleicht nur ein Denkanstoß ist.

Gruß Münzi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2010, 16:38     Titel:
  Antworten mit Zitat      
Hallo,

das geht im Grunde genausoso wie vorher. gamma1 und gamma2 werden in Funktionen der Form
Code:
berechnet.
Diese Funktionen werden dann in dem Function Handle einfach verwendet [in der Zeile x1schleife(I)=...].

Grüße,
Harald
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.