Verfasst am: 24.02.2013, 10:29
Titel: lsqcurvefit mit Simulation
Hallo,
Ich hoffe jemand kann mir weiterhelfen. Ich habe extra den Code kommentiert damit er halbwegs Sinn ergibt. Es schaut sehr viel mehr aus als es in Wahrheit ist:
Ich habe ein Systems Biology Modell mit mehreren Parametern.
Diese Parameter möchte ich mit Hilfe von lsqcurvefit ermitteln.
Im großen und ganzem mache ich folgendes:
ich rufe in lsqcurvefit meine funktion auf. In dieser Funktion simuliere ich das Modell und ermittele eine Zeitserie.
Code:
% fit curve
fitted_parameter_values = lsqcurvefit(@myfun,parameter_values,Subsampled_Simulation_time,Data_current)
% Simulate for different parameters function F = myfun(x,xdata)
% open input model file
input_file_string=get(handles.Input_Model_File_Edit, 'String');
input_file=fopen(input_file_string, 'r');
% open output model file
output_file_string=get(handles.Output_Model_File_Edit, 'String');
output_file = fopen(output_file_string, 'w');
% scan each line from input model file. Copy each line until we are in % the Parameters section. If we are in the parameters section print % parameter name = parameter value while ~feof(input_file) line = fgets(input_file);
in_model_parameters_section=strfind(line, '********** MODEL PARAMETERS');
if in_model_parameters_section==1 fprintf(output_file, '%s', line);
% initialize model file
model_file_string=get(handles.Output_Model_File_Edit, 'String');
Model=SBmodel(model_file_string);
% initialize experiment
experiment_file_string=get(handles.Experiment_File_Edit, 'String');
Experiment=SBexperiment(experiment_file_string);
% Merge Model File and Experiment File
ModExp=SBmergemodexp(Model, Experiment);
% get Simulation time from Text Box
Simulation_Time=str2double(get(handles.Simulation_Time_Edit, 'String'));
% get Simulation step size from Text Box
Simulation_Step_Time=str2double(get(handles.Simulation_Step_Time_Edit, 'String'));
Results=SBsimulate(ModExp, [0:Simulation_Step_Time:Simulation_Time]);
% Remove time offset
time_offset=str2double(get(handles.Data_Time_Offset_Edit, 'String'));
time_offset_index=find(Results.time==time_offset);
Simulation_time=Results.time(time_offset_index:length(Results.time))-time_offset;
Simulation_current=Results.variablevalues(time_offset_index:length(Results.time),1);
Beim ausführen des Codes kommt bei mir folgende Nachricht:
Initial point is a local minimum.
Optimization completed because the size of the gradient at the initial point
is less than the default value of the function tolerance.
Optimization completed: The final point is the initial point.
The first-order optimality measure, 0.000000e+000, is less than
options.TolFun = 1.000000e-006.
du verwendest in deiner myfun die Variable x anscheinend nur, um sie in eine Datei zu schreiben (warum auch immer). Die Variable xdata wird anscheinend überhaupt nicht verwendet. Das sieht mir nicht nach dem Sinn einer Kurvenanpassung aus.
Mir scheint zudem, dass dein Code eine Anknüpfung an eine GUI beinhaltet. Es wäre vermutlich einfacher, wenn man erst mal sicher stellt, dass die Kurvenanpassung funktioniert, und das dann in die GUI einbaut.
Oke ich werde versuchen morgen die Kurvenanpassung als Skript zu schreiben (nicht in einer GUI).
Der Grund warum ich x in eine Datei schreibe ist dass ich diese Datei dann mit den Parameterwerten simuliere.
Es funktioniert auch so nicht. ich bekomme wieder die Fehlermeldung:
Initial point is a local minimum.
Optimization completed because the size of the gradient at the initial point
is less than the default value of the function tolerance.
<stopping criteria details>
Optimization completed: The final point is the initial point.
The first-order optimality measure, 0.000000e+000, is less than
options.TolFun = 1.000000e-006.
% fit curve
fitted_parameter_values = lsqcurvefit(@myfun,parameter_values,Data_Time+5000,Data_Current, lb, ub)
% Simulate for different parameters function F = myfun(x,xdata)
% open input model file
input_file=fopen('WLMSR_Model.txt', 'r');
% open output model file
output_file = fopen('WLMSR_Model_New.txt', 'w');
% scan each line from input model file. Copy each line until we are in % the Parameters section. If we are in the parameters section print % parameter name = parameter value while ~feof(input_file) line = fgets(input_file);
in_model_parameters_section=strfind(line, '********** MODEL PARAMETERS');
if in_model_parameters_section==1 fprintf(output_file, '%s', line);
Vorschläge:
- kommt diese Meldung auch bei anderen Startpunkten?
- Führen Aufrufe von myfun mit unterschiedlichen x auch wirklich zu unterschiedlichen F?
nochmal: hast du deine eigene Funktion myfun mal mit verschiedenen x getestet? Kommen dabei auch wirklich verschiedene F heraus?
Zitat:
Ich überlege mir ob ich meine eigene Routine zur Minimisierung der least squares schreibe.
Und was soll das bringen? Ich halte es für sehr wahrscheinlich, dass das Problem in deiner Modellfunktion liegt und nicht in fminunc oder lsqnonlin an sich.
So sollte genauer gerechnet werden und du solltest sehen, was in jedem einzelnen Iterationsschritt passiert (wobei das Problem hier ja ist, dass es gar nicht erst zu Iterationen zu kommen scheint).
Vielen Dank für deine Hilfe.
Soll ich dir den Code schicken? Das wäre einfacher, allerdings müsstest du dann auch die Systems Biology Toolbox 2 herunterladen und installieren.
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
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.