Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ODE gegen Messdaten fitten

 

LaborDodo
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2018, 18:16     Titel: ODE gegen Messdaten fitten
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein kleines Problem ein ODE-System gegen Messdaten zu fitten. Ich habe da System mal etwas Abgespeckt um es zu verdeutlichen.
Prinzipiell habe ich zwei Funktionen (geschachtelt) und eine Art Hauptprogramm.
In der ersten Funktion befindet sich mein ODE-System, welche folgendermaßen aussieht.

Code:

function dy = fun(t,y,k1)
 
   k2 = 2.5;

   dy(1) = -k1*y(1);
   dy(2) = k1*y(1)-k2*y(2)*y(2);
   dy(3) = k2*y(2)*y(2);
   dy = dy';
end
 


Diese Funktion wird in einer Funktion darüber in eine anonyme Funktion eingebettet, damit ich einen Solver (der ja nur t und y erwartet) verwenden kann. Diese Funktion bekommt auch meinen zu fittenden Parameter k1 übergeben.

Code:

function [tn,yn] = fun(k1)

   f = @(t,y) function1(t,y,k1);

   [tn, yn] = ode45(f,[0 3],[1 0 0]);
end
 


Das Hauptprgramm ruft nun diese Funktion auf und übergibt ein k1. Das funktioniert soweit einwandfrei. Ich habe mir testweise ein paar zahlen für einen Fall ausgeben lassen und machte jetzt mit leicht verändertem k1 gegen diese Messwerte fitten.

Code:

%Testdaten fuer k1 = 2
t_data = [0 0.002486768 0.126487408 0.558597808 1.306824781 2.131824781 3];
y_data = [1 0.995038812 0.7764873 0.327193234 0.073271043 0.014072155 0.002479314];

%berechnung mit k1 =2
[tn,yn] = function2(2);

%fit mit veraendertem k1
k1 = 1

fit = lsqcurvefit(function2,k1,t_data,y_data);

plot(tn,yn(:,1))
hold on
plot(t_data,y_data,'b.')
xlabel('Zeit t');
ylabel('Konzentration');
 


Fehler:
Not enough input arguments.
in der Zeile mit der Anonymen Funktion.

Ich hoffe ich bin hier nicht völlig auf dem Holzweg. Falls es dafür ein völlig anderen Ansatz gibt freue ich mich natürlich trotzdem.

Vielen Dank und beste Grüße
LaborDodo
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.12.2018, 16:15     Titel: Re: ODE gegen Messdaten fitten
  Antworten mit Zitat      
Hallo LaborDodo,

Zitat:
Not enough input arguments.
in der Zeile mit der Anonymen Funktion.

Bitte poste die komplette Fehlermeldung. Dann würde klar werden, welches "die Zeile mit der anonymen Funktion" ist.

In Deinem Code gibt es zwei Funktionen die "fun" heißen. "function1" fehlt. "function2" wird einmal als Funktion aufgerufen:
Code:
[tn,yn] = function2(2);

danach aber als Function-Handle:
Code:
fit = lsqcurvefit(function2,k1,t_data,y_data);

Dies entspricht dem Aufrufen von function2() ohne Input-Argumente. Ich vermute, Du meinst:
Code:
fit = lsqcurvefit(@function2,k1,t_data,y_data);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
LaborDodo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2018, 20:57     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Antwort.
Ich habe den Code versucht etwas schöner zu machen. Daher die falschen Namen der Funktionen. Sorry.
Hier nun nochmal mein echtes Codebeispiel.

Code:

function dy = folge_sim_fun(t,y,k1)
 
k2 = 2.5;
dy(1) = -k1*y(1);
dy(2) = k1*y(1)-k2*y(2)*y(2);
dy(3) = k2*y(2)*y(2);
dy = dy';
end
 




Code:

function [tn,yn] = folge_sim(k1)

f = @(t,y) folge_sim_fun(t,y,k1);

A0 = 1;
tic;
[tn, yn] = ode45(f,[0 3],[A0 0 0]);
toc;

end
 



Code:

clear all
close all
clc
 
a = 1;

t_data = [0 0.002486768 0.126487408 0.558597808 1.306824781 2.131824781 3];
y_data = [1 0.995038812 0.7764873 0.327193234 0.073271043 0.014072155 0.002479314];

%[tn,yn] = folge_sim(2);

fit = lsqcurvefit(@folge_sim,a,t_data,y_data);

plot(tn,yn(:,1))
hold on
plot(t_data,y_data,'b.')
xlabel('Zeit t');
ylabel('Konzentration');
 


Folgende Zeile
Code:

%[tn,yn] = folge_sim(2);
 

dient mir lediglich als Test ob das durchreichen der Variablen klappt und ich rausbekomme was rauskommen soll. Übergeb ich einen Weert von 2 passen funktion und Testwerte zusammen, was logisch ist, weil die Werte so erzeugt wurden. Also nur ein Test.

Fehlermeldungen:

benutze ich
Code:

fit = lsqcurvefit(@folge_sim,a,t_data,y_data);
 

Error using folge_sim
Too many input arguments.

Error in lsqcurvefit (line 213)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in main_fit (line 14)
fit = lsqcurvefit(@folge_sim,a,t_data,y_data);

Caused by:
Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.

benutze ich
Code:

fit = lsqcurvefit(folge_sim,a,t_data,y_data);
 


Not enough input arguments.

Error in folge_sim (line 3)
f = @(t,y) folge_sim_fun(t,y,k1);

Error in main_fit (line 14)
fit = lsqcurvefit(folge_sim,a,t_data,y_data);

Aktuell bin ich vollständig verwirrt.

Vielen Dank und Grüße
LaborDodo
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.12.2018, 14:27     Titel:
  Antworten mit Zitat      
Hallo LaborDodo,

Wenn es ein Problem mit einer Funktion gib, ist das Lesen der Dokumentation der erste Schritt: https://www.mathworks.com/help/opti.....curvefit.html#buuhcjo-fun
Hier findest Du die Erklärung, dass die übergebene Funktion 2 Input-Argumente haben muss:
Code:
function F = myfun(x,xdata)
F = ...     % Compute function values at x, xdata

Zitat:
Code:
fit = lsqcurvefit(@folge_sim,a,t_data,y_data);

Hier hat Dein folge_sim nur einen Input stattdessen.

Zitat:
Code:
fit = lsqcurvefit(folge_sim,a,t_data,y_data);

Hier rufst Du, wie ich oben schon mal schrieb, die Funktion folge_sim() ohne Inputs. Beide Fehlermeldungen sind also zu erwarten.

Gruß, Jan
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
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.