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

Variablen an fsolve übergeben

 

MaKel89
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 15:18     Titel: Variablen an fsolve übergeben
  Antworten mit Zitat      
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.

Vielen Dank schonmal Smile
Private Nachricht senden Benutzer-Profile anzeigen


huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 07.01.2016, 15:44     Titel:
  Antworten mit Zitat      
Hallo,

schreib doch mal bitte deinen Code, den du schon versucht hast! Und welche Fehler aufgetreten sind
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 15:56     Titel:
  Antworten mit Zitat      
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.

Code:
%% Eingabewerte
CPr = 0.516;
g = 9.81;
% Massenströme
mL = 0.02;
mW = 0.1274;
% Stoffgrößen
cpWg = 1.86;
cpWf = 4.18;
cpL = 1;
lambda = 26.425*10^(-6);
eta = 1.875*10^(-5);
Pr = 0.7135;
hv0 = 2500;
phiein = 1;
rhoL = 1.15;
%Temperaturen und Druck
p = 101.325; %kPa
Tumg = 20;
Twein = 60;
TLein = 40;

    Tm = (Twein+TLein)/2;
    % Geometriegrößen
    Aaussen = 0.72;
    L = 0.7;
    a = 180;
    V = 0.032;

    %% anfängliche Berechnungen
    % Stoffaustauschkoeff., Temperaturausdehnungskoeff., spez. Eingangsenthalpie
    % Wasser
    K = (mW/(a*V))*0.52*(mL/mW)^(-0.16);
    volkoeff = 1/(273.15+Tumg);
    hwein = cpWf*Twein;

    % Luftzustand
    Xein = 2.19*10^(-6)*TLein^3-1.85*10^(-4)*TLein^2+7.06*10^(-3)*TLein-0.077;
    hLein = cpL*TLein+Xein*(hv0+cpWg*TLein);

   

     x0 = [TLein+10,Twein-10]; %geratener Startwert
     my_fun = @(x)parameterfun(hwein,cpWf,mL,CPr,lambda,volkoeff,g,rhoL,Tm,Tumg,L,eta,Pr,mW,hLein,K,a,V);
     y = fsolve(my_fun,x0);
     y1 = real(y(1));
     y2 = real(y(2));

    Twaus = y2;
    TLaus = y1;

    Xaus = 2.19*10^(-6)*TLaus^3-1.85*10^(-4)*TLaus^2+7.06*10^(-3)*TLaus-0.077;
   
    mKond = (Xaus-Xein)*mL;
    Wasser = mKond*3600*18;


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


Die Fehlermeldung die ich rausbekomme ist:

Code:
Index exceeds matrix dimensions.

Error in parameterfun (line 2)
y = [mW*(hwein-cpWf*x(2)) + mL*(hLein-(0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61))...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 18:52     Titel:
  Antworten mit Zitat      
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.

irgendwelche ideen dazu?
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: 07.01.2016, 19:02     Titel:
  Antworten mit Zitat      
Hallo,

Problem beim geposteten Code: x muss durchgeleitet werden
Code:
my_fun = @(x)parameterfun(  x,   hwein,cpWf,mL,CPr,lambda,volkoeff,g,rhoL,Tm,Tumg,L,eta,Pr,mW,hLein,K,a,V);

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 19:07     Titel:
  Antworten mit Zitat      
danke schon mal harald,

das mit dem x ist mir auch aufgefallen. habe jetzt auch verstanden was da passiert, wie gesagt, den solver kriege ich zum laufen.

ich debugge mal ein bisschen und guck ob ich voran komme.

ansonsten melde ich mich noch mal Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 19:50     Titel:
  Antworten mit Zitat      
hm...also ich komme nicht wirklich auf was.

ich hab die dateien mal angehangen.

für jegliche hilfe bin ich sehr dankbar Smile

parameterfun.m
 Beschreibung:

Download
 Dateiname:  parameterfun.m
 Dateigröße:  543 Bytes
 Heruntergeladen:  377 mal
Verdunstertest.m
 Beschreibung:

Download
 Dateiname:  Verdunstertest.m
 Dateigröße:  1.3 KB
 Heruntergeladen:  388 mal
ZustandsberechnungKuehlturmanalogie2.m
 Beschreibung:

Download
 Dateiname:  ZustandsberechnungKuehlturmanalogie2.m
 Dateigröße:  1.2 KB
 Heruntergeladen:  358 mal
iter1.m
 Beschreibung:

Download
 Dateiname:  iter1.m
 Dateigröße:  476 Bytes
 Heruntergeladen:  404 mal
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: 07.01.2016, 20:16     Titel:
  Antworten mit Zitat      
Hallo,

deine Code ist sehr unübersichtlich, insbesondere die iter1.m und die parameterfun.m.
Ich würde solche Endlosausdrücke unbedingt vermeiden.

Beispielsweise kommt der Ausdruck
Code:
0.00585*x(1)^3-0.497*x(1)^2+19.87*x(1)-207.61

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.

Grüße,
Harald

iter2.m
 Beschreibung:

Download
 Dateiname:  iter2.m
 Dateigröße:  558 Bytes
 Heruntergeladen:  381 mal
Verdunstertest2.m
 Beschreibung:

Download
 Dateiname:  Verdunstertest2.m
 Dateigröße:  1.3 KB
 Heruntergeladen:  377 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 20:28     Titel:
  Antworten mit Zitat      
uff schonmal dickes dankeschön,

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?
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: 07.01.2016, 20:33     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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 :)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2016, 20:45     Titel:
  Antworten mit Zitat      
du bist auch ein crack Razz

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.

vielen dank auf jeden fall schon mal Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2016, 13:01     Titel:
  Antworten mit Zitat      
soooo ich hab noch mal ne frage,

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.

sieht jemand wo mein fehler ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaKel89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 16.11.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2016, 14:14     Titel:
  Antworten mit Zitat      
hab meinen fehler gefunden Very Happy

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. Rolling Eyes 3 Stunden verplempert! Very Happy
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.