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

Funktion mit 2 variablen Integrieren und Summieren

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2014, 16:53     Titel: Funktion mit 2 variablen Integrieren und Summieren
  Antworten mit Zitat      
Hallo,

ich bin ziemlich neu in Matlab und habe bisher eher mit VBa oder Java gearbeitet. Nun habe ich selbst festgestellt, dass for schleifen in Matlab nicht so viel Sinnmachen und sehr langsam sind, ich bekomme mein Problem aber akuell nur damit gelöst. Würde mich aber sehr freuen, wenn mir jemand helfen kann das ganze über eine Matrix zu lösen.

Es geht um folgendes eine Kombination aus 2 Funktionen (f und g, die jeweils zunächst abgeleitet werden) sollen von 1 bis unendlich (eine große Zahl tuts hier) aufsummiert werden. Die Funktion f ist aber von 2 Variablen abhängig. Die Variable m muss zunächst mit der Laufvariable (von der Summe) festgelegt werden, dann kann nach t integriert werden.

Code:

fcarb=0.5;
fcarbI=0;
while abs(fcarb-fcarbI)>0.01
fcarb=0.001+fcarb;
...
Xave=0;
 for m=1:5000;
 f = @(t) f_t(t).*X_t(m,t);
 integralI = quad(f,0,t_lim);
 g=@(s) f_t(s)*XmaxN;
 integralII = quad(g,t_lim,1000);
 rnageII=(((F_0/F_R)*fcarb.^(m-1))./(((F_0/F_R)+fcarb).^m));
 
 Xave_i=rnageII*(integralI+integralII);

 Xave=Xave+Xave_i;
 
  if rnageII==0
      break
  end
 end
fcarbI=Xave/Xmaxave;
 


Aus dem Ergebniss Xave bestimme ich anschließend einen weiteren Wert, der in einer While Schleife verglichen wird. Passt er nicht wird fcarb erhöht und das ganze neu durchlaufen. Vielleicht wäre es also auch möglich direkt fcarb anzugehen.

Dorry ich hoffe irgendwer versteht mein Problem, kann auch gerne versuchen es noch weiter zu erläutern.

Liebe Grüße


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.06.2014, 17:44     Titel:
  Antworten mit Zitat      
Hallo,

zum Lösen einer Gleichung kannst du FSOLVE verwenden. Das sollte effizienter sein als eine händische while-Schleife.

Je nach Komplexität von f_t und X_t (leider hier nicht gegeben) könnte man das Integral auch symbolisch ermitteln und dann nur noch Werte einsetzen.

Für weitere Unterstützung bitte ein lauffähiges Beispiel zur Verfügung stellen.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2014, 13:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die schnelle Antwort, hier der komplette Code mit Konstanten und den nötigen Funktionen sollte so laufen

Code:

t_lim=30
fcarb=0.5;
fcarbI=0;
Xmaxave=0.08;
%%

while abs(fcarb-fcarbI)>0.01
fcarb=0.001+fcarb;  
%%

Xave=0;
 for m=1:5000;
 f = @(t) f_t(t).*X_t(m,t);
 integralI = quad(f,0,t_lim);
 g=@(s) f_t(s)*0.07;
 integralII = quad(g,t_lim,1000);
 rnageII=(((0.001)*fcarb.^(m-1))./(((0.001)+fcarb).^m));
 
 Xave_i=rnageII*(integralI+integralII);

 Xave=Xave+Xave_i;
 
  if rnageII==0
      break
  end
 end
 %%

 fcarbI=Xave/Xmaxave;
 
end
 


Hier die Funktionen:
Code:

function Sn=S_n(x)
global  Xr k ;
Sn=43700000*((1/(1/(1-Xr)+k*x))+Xr);
 


Code:

function Xt=X_t(x,y)
global ks Xr k c_CO2_star c_eq;
Xt=1-(1-((ks*(43700000*((1./((1./(1-Xr))+k.*x))+Xr)).*(c_CO2_star-c_eq).*y)./3).^3);
 


Code:

function ft=f_t(t)
ft=(1/100)*exp(-(t/100));
 


Die Idee mit dem fsolve klingt gut, allerdings weis ich nicht genau wie ich es umsetzten soll.

LG
 
Harald
Forum-Meister

Forum-Meister


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

die globalen Variablen fehlen.
Davon abgesehen sollte man globale Variablen meiden, um die Programme übersichtlich zu gestalten.

fsolve löst nichtlineare Gleichungen bzw. Gleichungssysteme. Als erstes müsstest du dir überlegen, was diese Gleichung eigentlich ist. Auf den ersten Blick würde ich sagen:

fcarbI = fcarb, wobei fcarbI von fcarb abhängt, also
f(fcarb) - fcarb = 0, wobei f fcarbI aus fcarb berechnet.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2014, 13:58     Titel:
  Antworten mit Zitat      
Super vielen Dank, funktioniert mit fsolve gut und viel, viel schneller. Ich habe einfach die while Schleife wie folgt ersetzt
Code:

opts = optimset('Display','Off');
 f=@(fcarb)Xave/Xmaxave;
 
 fcarb=fsolve(@(fcarb)(f(fcarb)-fcarb),0.7,opts)
 


Danke!
 
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.