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

Optimierung mit einem Integral

 

Fino
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 05.08.2013, 16:13     Titel: Optimierung mit einem Integral
  Antworten mit Zitat      
Hallo zusammen,

ich möchte eine Funktion optimieren, die ein Integral beinhaltet. Trotz intensiver Suche habe ich allerdings keinen Befehl gefunden der das kann. Deswegen wende ich mich an euch.

Meine Funktion besteht aus 4 Summanden, die alle in Abhängigkeit von Q angegebene werden können. Einer dieser Summanden beinhaltet allerdings ein Integral, wobei sowohl das Integral als auch die Grenzen des Integrals die zu optimierende Variable Q enthalten.

E=E_B(Q)+E_N(Q)-E_P(Q)-E_T(Q)

E_N=rho_f*c_f*Q*T_M

T_M = quad(@T_M,0,tr)

t_r=(((rho_s*c_s)/(rho_f*c_f))^2)*tlf_s*((4*pi*(a^2/(3*Q)))^2)*(1/(erfcinv(P)^2))

T_M=erfc((rho_s*c_s*sqrt(tlf_s)*((4/3)*pi*a^2))/(rho_f*c_f*sqrt(tr)*Q))*(T_i-T_a)+T_a

Das Ziel ist es nun E zu maximieren unter der Beachtung zweier Nebenbedingungen.
Mein Ansatz war bisher mit fmincon E zu maximieren. Da aber die Maximierung von Q auch Auswirkungen auf die Grenzen des Integrals hat, wird dieses Unterfangen sehr kompliziert. Der int-Befehl kann leider keine explizite Lösung finden. Mit dem quad-Befehl habe ich das Problem, dass ich eine Funktion an quad übergeben muss. Diese Funktion soll ja aber auch Teil der Optimierung sein.

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken. Über jede Form der Unterstützung würde ich mich sehr freuen.

Freundliche Grüße

Fino
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: 05.08.2013, 17:22     Titel:
  Antworten mit Zitat      
Hallo,

ich würde mit quad arbeiten.

Du kannst für das Integrieren Q ja als Parameter verwenden, also etwa

Code:
function f = ziel(Q)
...
tm = quad(@(x) fun(x, Q), ...)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 06.08.2013, 10:53     Titel:
  Antworten mit Zitat      
Hallo,

als Ergänzung: du kannst auch die Integrationsgrenzen als Parameter übergeben und brauchst dich vor Komplexität dabei nicht zu scheuen. Dafür ist mehrdimensionale Optimierung ja da.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Fino
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 06.08.2013, 12:02     Titel:
  Antworten mit Zitat      
Hallo Harald, Hallo MaFam, Hallo an den Rest der community,

ich habe versucht eure Tipps umzusetzen:

Code:

function f = E_ges



tr_param = (((rho_s*c_s)/(rho_fluid*c_fluid))^2)*tlf_s*((4*pi*(a^2/(3*Q)))^2)*(1/(erfcinv(P)^2))

T_Misch_0_tr = quad(@(tr) Integral_dep_Q(tr,Q),0,tr_param)

f = rho_fluid*c_fluid*Q*(T_aquifer-T_injection)*tb+rho_fluid*c_fluid*Q*T_Misch_0_tr-(7*wlf_s*(T_aquifer-T_ground)*z*tn)/(log((4*tlf_s*((((rho_s*c_s)/(rho_fluid*c_fluid))^2)*tlf_s*((4*pi*(a^2/(3*Q)))^2)*(1/(erfcinv(P)^2))+((rho_aquifer*c_aquifer)/(rho_fluid*c_fluid)*(4/3)*pi*M*(a^2/Q))))/(1.78*r^2)))-((((rho_s*c_s)/(rho_fluid*c_fluid))^2)*tlf_s*((4*pi*(a^2/(3*Q)))^2)*(1/(erfcinv(P)^2))+((rho_aquifer*c_aquifer)/(rho_fluid*c_fluid)*(4/3)*pi*M*(a^2/Q)))*((Q*(rho_fluid*g*(h_obertage+((Q/(4*pi*Transm))*W_u)+50)+(1E5*(5E-05*(s/100)^2+0.0001*(((Q/(4*pi*Transm))*W_u)/100)+9E-16)+P_anlage)))/n_pump)
 
end
 


Die function in der ich die Zielfunktion E_ges definiere beinhaltet nun den quad-Befehl, den ich nach Harald's Tipp verfasst habe. Der Parameter tr_param für den quad Befehl wird, wie es MaFam vorgeschlagen hat, auch in der gleichen Funktion ermittelt.
Dem quad-Befehl selbst übergebe ich die function Integral_dep_Q, welche abhängig ist von tr und Q (s.u.)

Code:

function f = Integral_dep_Q (tr,Q)

 f = erfc((rho_s*c_s*sqrt(tlf_s)*((4/3)*pi*a^2))/(rho_fluid*c_fluid*sqrt(tr)*Q))*(T_injection-T_aquifer)+T_aquifer
end
 


Um eine bessere Übersicht zu erreichen habe ich versucht mich beim Code auf das wesentliche zu beschränken (keine Nebenrechnungen, Zuweisungen ...)

Leider bekomme ich nun folgende Fehlermeldung:

The integrand function must return an output vector of the same length as the input vector.

Gleichzietig erhalte ich aber ein Ergebnis, dass wie folgt aussieht:

Code:

f =
 
8123/20 - 63*erfc(2283977736442529/(6585581568000*Q*tr^(1/2)))
 


Das Ergebnis beinhaltet leider immer noch tr, sodass ich eben nicht nach Q optimieren kann.

Auch nach langer Suche kann ich mir bisher nicht erklären, wo genau das Problem liegt. Vielleicht ist dies nun ein Anfängerfehler aber ich würde mich trotzdem sehr freuen, wenn mir jemand einen Tipp geben könnte.

Grüße

Sören
Private Nachricht senden Benutzer-Profile anzeigen
 
Fino
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 06.08.2013, 14:45     Titel:
  Antworten mit Zitat      
Das obige Problem scheine ich gelöst zu haben. Aber jetzt motzt MuPAD ... Sad mal sehen was er jetzt hat
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: 06.08.2013, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

wo verwendest du denn MuPAD? Ich sehe zumindest auf den ersten Blick nichts in der Hinsicht.

Ein Problem bei deinem geposteten Code ist, dass die ganzen anderen Variablen wohl in der anderen Funktion nicht bekannt sind. Dazu müsstest du den von mir genannten Trick bzgl. Q auf die anderen Variablen ausweiten. Damit nicht so viele Variablen übergeben werden müssen, würde ich mit einer Parameterstruktur arbeiten.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 07.08.2013, 12:27     Titel:
  Antworten mit Zitat      
Hallo,

MuPad wurde scheinbar von Matlab intern bei einer Berechnung verwendet und damit gab es scheinbar einen Fehler.

Das Übergeben der Variablen funktioniert gut. Ich habe es nur ganz bewusst bei der Angabe des Codes weg gelassen um den Code nicht ewig in die Länge zu ziehen.

Mein ganzes Problem lässt sich ja letztlich darauf reduzieren, dass der quad-Befehl mit einer Variablen rechnen muss. Deswegen habe ich mir ein kleines Test-Skirpt gebastelt.

Ich definiere die Funktion Test

Code:

function f = Test(x,y)
f = x.^2+2*x+y;
end
 


nun möchte ich diese Funktion in den Grenzen [0:10] berechnen. Dazu definiere ich y als Variable und übergebe x und y an den quad Befehl.

Code:

int y;
Ergebnis = quad(@(x)Test(x,y),0,10)
 


Maple spuckt mir dann diese Fehlermeldung aus:

Undefined function 'isfinite' for input arguments of type 'sym'.

Wenn ich das richtig verstehe heißt es schlicht und einfach quad kann nicht mit einer Variablen rechnen. Ich glaube ich habe eure Tipps berücksichtigt.
Um das Problem zu umgehen fällt mir jetzt nur noch die Möglichkeit ein mit diversen Schleifen für jedes Q in einem gewissen Bereich (etwa 200 Mal in meinem Fall) das Ergebnis meiner Zielfunktion zu berechnen und dann eben die Ergebnisse zu vergleichen. Das wäre allerdings die Holzhammermethode und da ich diese Prozedur wahrscheinlich mehrere tausend mal durchziehen muss bekomme ich neben dem bedingt genauen Ergebnis auch noch eine riesige Rechenzeit.

Habt ihr noch irgendwelche Ideen, Hinweise Tipps?

Vielen Dank für eure Unterstützung

Gruß Sören
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.08.2013, 13:42     Titel:
  Antworten mit Zitat      
Hallo,

du hattest ja festgestellt, dass symbolische Integration nicht funktioniert, da keine Stammfunktion gefunden werden kann. Damit bleibt eben nur noch numerische Integration, und das geht rein mit Zahlen. Du musst also einen konkreten Zahlwert für y vorgeben.
Übertragen auf deine eigentliche Situation macht das nicht viel aus, denn du bekommst Q ja ohnehin als Eingang für die Zielfunktion, musst also nur für dieses eine Q das Integral ausrechnen. Dass bei weiteren Auswertungen der Zielfunktion das Integral für andere Q von neuem ausgewertet werden muss, wird sich nicht vermeiden lassen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 07.08.2013, 13:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

wenn ich deinen Kommentar richtig verstanden habe, haben wir glaube ich ein wenig aneinander vorbei geredet. Das Ziel ist es meine Zielfunktion zu optimieren. Ich möchte ein Q erhalten für das die Zielfunktion maximal wird. Somit habe ich Q nicht als Zahl zur Verfügung.

Gruß Sören
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.08.2013, 13:56     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Somit habe ich Q nicht als Zahl zur Verfügung.

Das ist wahr. Das Optimierungsverfahren wählt aber selbstständig verschiedene Q und möchte damit die Zielfunktion auswerten. Q wird also ein Eingabeargument der Zielfunktion sein und steht dann auch (als numerischer Wert) zur Verfügung, um das Integral (numerisch) zu berechnen. Siehe auch mein Beitrag von 5.8., 17:22.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 07.08.2013, 14:06     Titel:
  Antworten mit Zitat      
Ok das bedeutet fmincon gibt Werte vor und wenn ich diesen Wert übergebe sollte auch der quad Befehl funktionieren. Ich habe bisher immer versucht den quad Befehl isoliert zum laufen zu bekommen. Ich probiere das aus und melde mich dann nochmal.

Bis dahin schon mal vielen Dank für die Geduld.
Private Nachricht senden Benutzer-Profile anzeigen
 
Fino
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.08.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 08.08.2013, 09:27     Titel:
  Antworten mit Zitat      
Very Happy Ich kann einen Erfolg vermelden.
Das Programm läuft durch und spuckt auf den ersten Blick auch die richtigen Ergebnisse aus. Jetzt muss ich nur noch ein wenig an den Nebenbedingungen spielen.
Vielen Dank für die Hilfe hier im Forum, ohne die Unterstützung hätte ich es wahrscheinlich nicht hin bekommen.

Gruß Sören
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: 08.08.2013, 11:03     Titel:
  Antworten mit Zitat      
Hallo,

das ist doch was :)
Beim Optimierer auch auf exitflag achten. Man kann auch mal unterschiedliche Startwerte nehmen und schauen, ob die Optimierung immer zum selben Minimum konvergiert.

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.