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

lsqcurvefit mit Simulation

 

srivvs
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 10:29     Titel: lsqcurvefit mit Simulation
  Antworten mit Zitat      
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);

                for i=1:length(parameter_names{1}(:))

                    current_parameter_name=cell2mat(parameter_names{1}(i));
                    fprintf(output_file, '%s = %f\n', current_parameter_name, x(i));
                    line = fgets(input_file);
                end
            else
                fprintf(output_file, '%s', line);
            end

    end

    %close input and output file
    fclose(input_file);
    fclose(output_file);
   
    % 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);

    % subsample
    Subsampled_Simulation_time=Simulation_time(1:n:end);
    Subsampled_Simulation_current=Simulation_current(1:n:end);

    % return function value
    F=Subsampled_Simulation_current();

    end
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: 24.02.2013, 10:44     Titel:
  Antworten mit Zitat      
Hallo,

ein entscheidender Punkt fehlt leider: wo liegt das Problem? Gibt es eine Fehlermeldung? Wenn ja, welche? Unerwartete Ergebnisse? Inwiefern?

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 18:28     Titel:
  Antworten mit Zitat      
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.

Optimization Metric Options
relative first-order optimality = 0.00e+000 TolFun = 1e-006 (default)
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: 24.02.2013, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 19:49     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

hoffentlich klappts morgen.

danke
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: 24.02.2013, 20:31     Titel:
  Antworten mit Zitat      
Hallo,

und was ist mit xdata? Muss doch auch irgendwo verwendet werden?

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 20:34     Titel:
  Antworten mit Zitat      
Hi,

Ja da hast du Recht Harald. Ich bin schon dabei. Vielleicht geht es sich heute noch aus.

danke für deine Hilfe
ciao
Private Nachricht senden Benutzer-Profile anzeigen
 
srivvs
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 21:29     Titel:
  Antworten mit Zitat      
Hi,

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.

Optimization Metric Options
relative first-order optimality = 0.00e+000 TolFun = 1e-006 (default)


Hier ist der Code:

Code:


function FitCurve

% load data to fit
data=load('WLMSR_Traces_Exp.mat');
Data_Current=data.WLMSR_m20V;
Data_Time=data.time;

% initialize starting parameter values and parameter names
alpha1 = 0.022348;
zalpha1 = 0.01176;
beta1 = 0.047002000000000002;
zbeta1 = -0.0631;
Kf = 0.023761000000000001;
Kb = 0.036777999999999998;
alpha2 = 0.013733;
zalpha2 = 0.038198;
beta2 = 6.8899999999999994e-005;
zbeta2 = -0.04178;
Vm = -80;
parameter_values=[alpha1 zalpha1 beta1 zbeta1 Kf Kb alpha2 zalpha2 beta2 zbeta2 Vm];
parameter_names = cell(size(parameter_values));
parameter_names{1}='alpha1';
parameter_names{2}='zalpha1';
parameter_names{3}='beta1';
parameter_names{4}='zbeta1';
parameter_names{5}='Kf';
parameter_names{6}='Kb';
parameter_names{7}='alpha2';
parameter_names{8}='zalpha2';
parameter_names{9}='beta2';
parameter_names{10}='zbeta2';
parameter_names{11}='Vm';

% initialize lower and upper bounds for parameter values
lb_alpha1 = 0.01;
ub_alpha1 = 0.1;
lb_zalpha1 = 0.005;
ub_zalpha1 = 0.05;
lb_beta1 = 0.01;
ub_beta1 = 0.1;
lb_zbeta1 = -0.05;
ub_zbeta1 = -0.005;
lb_Kf = 0.01;
ub_Kf = 0.1;
lb_Kb = 0.01;
ub_Kb = 0.1;
lb_alpha2 = 0.01;
ub_alpha2 = 0.1;
lb_zalpha2 = 0.005;
ub_zalpha2 = 0.05;
lb_beta2 = 1.8899999999999994e-005;
ub_beta2 = 1.8899999999999994e-004;
lb_zbeta2 = -0.05;
ub_zbeta2 = -0.01;
lb_Vm = -81;
ub_Vm = -79;
lb=[lb_alpha1 lb_zalpha1 lb_beta1 lb_zbeta1 lb_Kf lb_Kb lb_alpha2 lb_zalpha2 lb_beta2 lb_zbeta2 lb_Vm];
ub=[ub_alpha1 ub_zalpha1 ub_beta1 ub_zbeta1 ub_Kf ub_Kb ub_alpha2 ub_zalpha2 ub_beta2 ub_zbeta2 ub_Vm];


% 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);

                for i=1:length(parameter_values)

                    fprintf(output_file, '%s = %f\n', parameter_names{i}, x(i));
                    fgets(input_file);
                end
            else
                fprintf(output_file, '%s', line);
            end

    end

    %close input and output file
    fclose(input_file);
    fclose(output_file);
   
    % initialize model and experiment file
    Model=SBmodel('WLMSR_Model_New.txt');
    Experiment=SBexperiment('-20.exp');
   
    % Merge Model File and Experiment File
    ModExp=SBmergemodexp(Model, Experiment);
   
    % get Simulation step size from Text Box
    Simulation_Step_Time = 2.5;
    Simulation_Time = 15000;
    Simulation_Results=SBsimulate(ModExp, [0:Simulation_Step_Time:Simulation_Time]);

   
   
    % subsample
    offset_index=find(Simulation_Results.time==xdata(1));
   
    Subsampled_Simulation_time=Simulation_Results.time(offset_index:3:end);
    Subsampled_Simulation_current=Simulation_Results.variablevalues((offset_index:3:end),1);
   
    % return function value
    F=Subsampled_Simulation_current();

    end
end

 
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: 24.02.2013, 21:37     Titel:
  Antworten mit Zitat      
Hallo,

Vorschläge:
- kommt diese Meldung auch bei anderen Startpunkten?
- Führen Aufrufe von myfun mit unterschiedlichen x auch wirklich zu unterschiedlichen F?

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2013, 23:05     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ja die Meldung kommt auch wenn man ganz falsche Startwerte verwendet.

Ich habe mich durch das Program gestept aber aus irgendeinem Grund ändert sich x überhaupt nicht.

Ich überlege mir ob ich meine eigene Routine zur Minimisierung der least squares schreibe.

Hast du eine Ahnung wie man so eine Routine schreibt? Wo soll ich anfangen?
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: 25.02.2013, 00:14     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2013, 00:31     Titel:
  Antworten mit Zitat      
Hallo,

Ja ich habe jetzt gerade das Skript mit verschiedenen Startwerten für x getestet. Da kommen verschiedene Werte für F heraus.

danke
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: 25.02.2013, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit sehe ich noch.
Bau mal in dein myfun.m am Ende disp(F) ein. Werden, wenn lsqcurvefit läuft, auch hier verschiedene Werte angezeigt?

Hintergrund: ich könnte mir vorstellen, dass aus irgendeinem Grund noch eine alte Datei verwendet wird.

Ansonsten bräuchte ich wohl eine Version des Codes, die ich selbst reproduzieren kann, um mir das genauer anzusehen.

Grüße,
Harald
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: 25.02.2013, 14:53     Titel:
  Antworten mit Zitat      
Hallo,

weitere Vorschläge:
Code:
opts = optimset('display', 'iter', 'tolfun', 1e-12, 'tolx', 1e-12);
fminunc(..., opts)


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).

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2013, 17:23     Titel:
  Antworten mit Zitat      
Hi Harald,

Sorry für die späte Antwort.

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.

mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.