Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Lineare Regelsysteme: Eine Einführung mit MATLAB

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Parameterschätzung

 

maki
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2020, 09:05     Titel: Parameterschätzung
  Antworten mit Zitat      
Hallo, ich habe ein Problem bei der Schätzung von Parametern.

Der Code läuft, allerdings bekomme ich als Ergebnis der Schätzung die Parameterwerte, mit denen ich starte. Geschätzt werden sollen die Parameter(1) bis Parameter(10)

Der Code ist wie folgt:

Code:
%Programm für Parameterschätzung

global c0 Data tRange %Global definition of needed variables
Data= xlsread('BI130_Average_Daten.xlsx','D3:S30'); %Experimental Data
tRange = Data(1:28,1);

%%
%Define starting values from experimental data
c0(1) = Data(1,2);  
c0(2) = Data(1,4);
c0(3) = Data(1,6);
c0(4) = Data(1,8);
c0(5) = Data(1,10);
c0(6) = Data(1,12);
c0(7) = Data(1,14);
c0(8) = Data(1,16);
%%
%Definition of model parameters

%Parameters()
Parameters(1) = 0.055;        
Parameters(2) = 0.03;      
Parameters(3) = 0.002;                    
Parameters(4) = 1.8*10^-8;
Parameters(5) = 0.8*10^-8;
Parameters(6) = 1.2*10^-12;
Parameters(7) = 0.19;      
Parameters(8) = 0.3;      
Parameters(9) = 0.03;      
Parameters(10) = 0.03;    
 %%
%constants
constants(1) = 0.01;          
constants(2) = 4*10^-12;    
constants(3) = 0.4;          
constants(4) = 1.6;          
constants(5) = 0;          
constants(6) = 0.5;        
    %%
    %Weighting vector
    Weighting(1)=100;
    Weighting(2)=1;
    Weighting(3)=10;
    Weighting(4)=100;
    Weighting(5)=10;
    Weighting(6)=1;
    %%
    %Estimation of model parameters with Nelder-Mead algorithm
    options = optimset('MaxFunEvals',100000,'MaxIter',100000);
    [Estimated_Parameters]= fminsearch(@Objective_BI130_1,Parameters,options,Weighting);
    disp(Estimated_Parameters);


function Sum_of_squares=Objective_BI130_1(Parameters,Weighting)

global c0 Data tRange

[t,c]=ode45(@Model_BI130_1,tRange,c0,'',Parameters);

Magnitude(1)=1;
Magnitude(2)=1;
Magnitude(3)=1;
Magnitude(4)=1;
Magnitude(5)=1;
Magnitude(6)=1;

%Sum of squares
Sum_of_squares=Weighting(1)*sum((abs(c(:,1)-Data(1:28,2))*Magnitude(1)).^2)+...
Weighting(2)*sum((abs(c(:,2)-Data(1:28,4))*Magnitude(2)).^2)+...        
Weighting(3)*sum((abs(c(:,3)-Data(1:28,6))*Magnitude(3)).^2)+...          
Weighting(4)*sum((abs(c(:,4)-Data(1:28,8))*Magnitude(4)).^2)+...            
Weighting(5)*sum((abs(c(:,5)-Data(1:28,10))*Magnitude(5)).^2)+...              
Weighting(6)*sum((abs(c(:,6)-Data(1:28,12))*Magnitude(6)).^2);              
end
 


Viele Grüße,
Martin
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2020, 09:48     Titel:
  Antworten mit Zitat      
Hallo,

Eine Möglichkeit ist, dass die Startwerte ein lokales Minimum sind. Ich würde es also mal mit anderen Startwerten versuchen.

Falls die Optimization Toolbox vorhanden ist, würde ich lsqnonlin statt fminsearch verwenden.
Da wäre dann zu berücksichtigen, dass ode45 ja keine exakte Lösung liefert:
https://de.mathworks.com/help/optim.....ifferential-equation.html

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2020, 17:12     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für die Antwort. Als ich die initialen Werte änderte, veränderten sich auch die geschätzten Parameter, allerdings zu den gleichen Werten wie die Initialen.

Die Toolbox besitze ich, stoße damit allerdings auf Probleme.


Code:
Parameters(1) = 0.055;    
Parameters(2) = 0.03;      
Parameters(3) = 0.002;                      
Parameters(4) = 1.8*10^-8;
Parameters(5) = 0.8*10^-8;
Parameters(6) = 1.2*10^-12;
Parameters(7) = 0.19;      
Parameters(8) = 0.3;      
Parameters(9) = 0.03;      
Parameters(10) = 0.03;    
LB = [0.03, 0.015, 0.001, 0.5*10^-8, 0.1*10^-8, 0.1*10^-12,  0.10, 0.15, 0.015, 0.015];
UB = [0.07, 0.045, 0.003, 3.1*10^-8, 2*10^-8,   2.4*10^-12, 0.3, 0.45, 0.045, 0.045];

options = optimset('MaxFunEvals',100000,'MaxIter',100000);
    [Estimated_Parameters, resnorm, residual, exitflag, output]= lsqnonlin(@Objective_BI130_1,Parameters,LB,UB,options);
    disp(Estimated_Parameters);


function Sum_of_squares=Objective_BI130_1(Parameters,Weighting)

global c0 Data tRange

[t,c]=ode45(@Model_BI130_1,tRange,c0,'',Parameters);

Magnitude(1)=1; %Xv
Magnitude(2)=1; %Xt
Magnitude(3)=1; %Viability
Magnitude(4)=1; %Glucose
Magnitude(5)=1; %Lactate
Magnitude(6)=1; %Glutamin

    %Weighting vector
    Weighting(1)=100;
    Weighting(2)=1;
    Weighting(3)=10;
    Weighting(4)=100;
    Weighting(5)=10;
    Weighting(6)=1;

%Sum of squares
Sum_of_squares=Weighting(1)*sum((abs(c(:,1)-Data(1:28,2))*Magnitude(1)).^2)+...  %Xv
Weighting(2)*sum((abs(c(:,2)-Data(1:28,4))*Magnitude(2)).^2)+...              %Xt
Weighting(3)*sum((abs(c(:,3)-Data(1:28,6))*Magnitude(3)).^2)+...             %Viability
Weighting(4)*sum((abs(c(:,4)-Data(1:28,8))*Magnitude(4)).^2)+...             %Glc
Weighting(5)*sum((abs(c(:,5)-Data(1:28,10))*Magnitude(5)).^2)+...              %cLac
Weighting(6)*sum((abs(c(:,6)-Data(1:28,12))*Magnitude(6)).^2)+...               %Gln
Weighting(6)*sum((abs(c(:,7)-Data(1:28,14))*Magnitude(6)).^2)+...  
Weighting(6)*sum((abs(c(:,8)-Data(1:28,16))*Magnitude(6)).^2);  
end
 


bringt mir den Fehler:

Error using lsqncommon (line 64)
The Levenberg-Marquardt algorithm does not handle bound constraints and the trust-region-reflective algorithm requires at least as many equations as variables; aborting.

Error in lsqnonlin (line 252)
lsqncommon(funfcn,xCurrent,lb,ub,options,defaultopt,allDefaultOpts,caller,...

Error in Parameter_Estimation_BI130_1 (line 47)
[Estimated_Parameters, resnorm, residual, exitflag, output]= lsqnonlin(@Objective_BI130_1,Parameters,LB,UB,options);


trust-region-reflective würde in meinem Fall, denke ich, nicht gehen, da ich 10 Parameter schätzen will und weniger Gleichungen habe.

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

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2020, 17:19     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Als ich die initialen Werte änderte, veränderten sich auch die geschätzten Parameter, allerdings zu den gleichen Werten wie die Initialen.

Das verwundert mich.

Für lsqnonlin sollte die Zielfunktion einen Vektor zurückgeben statt die Abweichungen zu berechnen, also z.B.
Code:
Sum_of_squares=Weighting(1)*(c(:,1)-Data(1:28,2))*Magnitude(1) + ...


Ein Problem in der Zielfunktion: Weighting ist Eingabeargument der Zielfunktion und wird dann überschrieben. Das ist nicht sinnvoll.

Du hattest in deinem ursprünglichen Problem ja auch keine Bound Constraints. Lass sie doch mal weg?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2020, 17:51     Titel:
  Antworten mit Zitat      
Hallo, danke für die Antwort.

Die Optimierung läuft, allerdings war der Initial Point direkt in einem lokalen Minimum. Nach ändern der Startwerte befindet er sich immer noch in einem lokalen Minimum.
Es ist tatsächlich egal, mit welchen Werten ich den Optimierer füttere, er befindet sich immer im Minimum. Die Exitflag spuckt als Ergebnis 1 aus.

Würde ein Multistart mehr Sinn machen?

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

Forum-Meister


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

Zitat:
Würde ein Multistart mehr Sinn machen?

Mein Verdacht ist, dass das Problem woanders liegt. Wenn du unterschiedliche Startwerte wählst, kommen denn dann zumindest als Zielfunktionswert andere Werte raus?

Nutze doch mal den Debugger und schau, mit welchen Parameters die Funktion gefüttert wird. Ändert sich dann die Rückgabe von ode45? Ändern sich die weiteren Variablen?
Hast du die Tipps im Link von 9:48 versucht?

Viel mehr kann ich leider nicht dazu sagen, ohne das komplett selbst ausführen zu können.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2020, 12:28     Titel:
  Antworten mit Zitat      
Hallo,


Zitat:
kommen denn dann zumindest als Zielfunktionswert andere Werte raus?


Ja, das änderte sich. Ich vermute, das dauerhafte Minimum rührte daher, da die objective Funktion nicht in einer Schleife verwickelt war.

Zitat:
Hast du die Tipps im Link von 9:48 versucht?


Das Einbauen der option FiniteDifferenceStepSize brachte keine Änderung. Für das andere war mein Englisch nicht gut genug.

Ich denke ich bin mittlerweile kurz vor der Lösung, hänge aber an einer Kleinigkeit:

Code:
   options = optimoptions('lsqnonlin','FiniteDifferenceStepSize',1e-3);
    options.Algorithm ='levenberg-marquardt';
    [Estimated_Parameters, resnorm, residual, exitflag, output]= lsqnonlin(@Objective_BI130_1,Parameters,[],[],options);
    disp(Estimated_Parameters);


function Sum_of_squares=Objective_BI130_1(Parameters,Weighting)

global Data tRange

 %Initial values einzelner Stufen
Xv0   = [0.3*10^6 ,0.3*10^6    ,0.3*10^6    ,0.3*10^6    ,0.4*10^6    ,0.4*10^6    ,0.25*10^6   ,0.3*10^6    ,0.38*10^6  ,0.38*10^6];
Xt0   = [0.3*10^6 ,0.3*10^6    ,0.3*10^6    ,0.3*10^6    ,0.4*10^6    ,0.4*10^6    ,0.25*10^6   ,0.3*10^6    ,0.38*10^6  ,0.38*10^6];
Viab0 = [100      ,100         ,100         ,100         ,100         ,100         ,100         ,100         ,100        ,100];
cGlc0 = [6.8      ,6.8         ,6.8         ,6.8         ,6.8         ,6.8         ,6.8         ,6.8         ,6.8        ,6.8];    
cLac0 = [0.3      ,0.3         ,0.3         ,0.3         ,0.3         ,0.3         ,0.3         ,0.3         ,0.3        ,0.3];
cGln0 = [0.9      ,0.9         ,0.9         ,0.9         ,0.9         ,0.9         ,0.9         ,0.9         ,0.9        ,0.9];
cAmm0 = [1        ,1           ,1           ,1           ,1           ,1           ,1           ,1           ,1          ,1];
v0    = [0.25     ,0.5         ,1           ,2           ,2           ,10          ,50          ,80          ,400        ,2000];
   
   
n = 10;
t=0;
y=[0,0,0,0,0,0,0,0];
Laufdauer =[0 72;72 144 ;144 216;216 288;288 360;360 432;432 504;504 576;576 648;648 1392];

for k = 1:n
   tRange= Laufdauer(k,:);
c0 = [ Xv0(k); Xt0(k); Viab0(k); cGlc0(k); cLac0(k);  cGln0(k);  cAmm0(k); v0(k)];

[tSpeicher,ySpeicher]=ode45(@Model_BI130_1,tRange,c0,'',Parameters);
     t = vertcat(t,tSpeicher);
     y= vertcat(y,ySpeicher);
     
     
Magnitude(1)=1E6;
Magnitude(2)=1E6;
Magnitude(3)=1;
Magnitude(4)=1;
Magnitude(5)=1;
Magnitude(6)=1;

    %Weighting vector
    Weighting(1)=100;
    Weighting(2)=1;
    Weighting(3)=10;
    Weighting(4)=100;
    Weighting(5)=10;
    Weighting(6)=1;


%Sum of squares
 
Sum_of_squares=Weighting(1)*(y(:,1)-Data(1:28,2))*Magnitude(1)+...
Weighting(2)*(y(:,2)-Data(1:28,4))*Magnitude(2)+...          
Weighting(3)*(y(:,3)-Data(1:28,6))*Magnitude(3)+...                
Weighting(4)*(y(:,4)-Data(1:28,8))*Magnitude(4)+...            
Weighting(5)*(y(:,5)-Data(1:28,10))*Magnitude(5)+...                
Weighting(6)*(y(:,6)-Data(1:28,12))*Magnitude(6)+...                
Weighting(6)*(y(:,7)-Data(1:28,14))*Magnitude(6)+...  
Weighting(6)*(y(:,8)-Data(1:28,16))*Magnitude(6);  
end


end
 


ergibt folgenden Fehler:

Matrix dimensions must agree.

Error in Objective_BI130_1 (line 47)
Sum_of_squares=Weighting(1)*(y(:,1)-Data(1:28,2))*Magnitude(1)+... %Xv

Error in lsqnonlin (line 205)
initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Error in Parameter_Estimation_BI130_1 (line 45)
[Estimated_Parameters, resnorm, residual, exitflag, output]= lsqnonlin(@Objective_BI130_1,Parameters,[],[],options);

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


Wird die Ausgabe von Sum_of_squares als Vektor erwartet?
Leider bin ich damit etwas überfordert. Wie kann ich hier den Debugger sinnvoll anwenden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2020, 13:01     Titel:
  Antworten mit Zitat      
Hallo,

setze einen Haltepunkt in die Zeile, die den Fehler wirft und schaue dir die Dimensionen der beteiligten Variablen an. Insbesondere: hat y 28 Zeilen?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2020, 14:54     Titel:
  Antworten mit Zitat      
Hallo,

y hat 54 Zeilen, also mehr als die Data Exceldatei mit 28.

Die Größe von y resultiert aus der variablen Step Size des ODE Solvers. Von einer festen Step Size, falls überhaupt möglich, wird generell abgeraten, sofern ich bisher gelesen habe.

Das Problem ist größer als ich dachte:
Meine Excel besteht nur aus insgesamt 28 Werten in einem Zeitbereich von 0 bis über 1000 Stunden. Der Solver hat schon in den ersten 72 Stunden 54 Messwerte genommen, danach sollte er in eine Schleife übergehen und weitere 72 Stunden mit anderen Initialwerten messen.
Mein Datenset ist also weitaus kleiner als die Steps des Solvers.

Wäre es sinnvoll, den solver laufen zu lassen, allerdings die Werte nur zu den gleichen Zeiten wie im Datenset anzeigen zu lassen?

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

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2020, 15:11     Titel:
  Antworten mit Zitat      
Hallo,

du hast Werte zu bestimmten Zeiten. Du musst ode45 dazu bringen, Werte zu diesen Zeiten zu berechnen. Das kannst du erreichen, indem du einen Vektor mit mehr als 2 Elementen als tspan angibst.
Aktuell scheinst du das ja schon zu tun und trange mit 28 Werten zu verwenden? Das in einer Schleife aufgerufen und aneinandergehängt passt dann aber halt nicht zu den 28 Vergleichswerten.

Das Problem mit Weighting, auf das ich Gestern 17:19 hingewiesen hatte, besteht übrigens immer noch.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2020, 16:49     Titel:
  Antworten mit Zitat      
Hallo,

die Schleife habe ich wieder entfernt, macht doch keinen Sinn. Durch das entfernen der Schleife scheint auch der Fehler mit den unterschiedlich großen Matrixen behoben zu sein, was für mich nicht viel Sinn ergibt. : Surprised

Zitat:
Weighting ist Eingabeargument der Zielfunktion und wird dann überschrieben. Das ist nicht sinnvoll.


Ich verstehe leider nicht ganz wo das überschrieben wird.

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

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2020, 17:05     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
was für mich nicht viel Sinn ergibt.

Für mich schon. trange sind 28 Werte, du bekommst also 28 Werte von ode45, und die kannst du mit anderen 28 Werten vergleichen.

Zitat:
Ich verstehe leider nicht ganz wo das überschrieben wird.

In deiner Funktion.

function Sum_of_squares=Objective_BI130_1(Parameters,Weighting)

%Weighting vector
Weighting(1)=100;
...

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 15:08     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
function Sum_of_squares=Objective_BI130_1(Parameters,Weighting)

%Weighting vector
Weighting(1)=100;

stimmt, hatte das in beiden Skripten definiert.


Zitat:
Das kannst du erreichen, indem du einen Vektor mit mehr als 2 Elementen als tspan angibst

Ich versuche das jetzt über eine Structure zu lösen.

Dabei habe ich mit dem Code
Code:

p1= [0 70.8];
p2= [71.28 143.52];
p3= [144 216.24];
p4= [217.2 287.04];
p5= [288.24 358.32];
p6= [358.42 429.22];
p7= [429.32 474.776 545.192];
p8= [545.292 567.991 615.391 684.631];
p9= [684.731 707.675 754.876 825.052];
p10= [825.152 847.448 894.348 965.532 1059.852];


Time.p = struct('p1', {p1}, 'p2', {p2}, 'p3', {p3}, 'p4', {p4}, 'p5', {p5}, 'p6', {p6}, 'p7', {p7}, 'p8', {p8}, 'p9', {p9}, 'p10', {p10});


ein struct Array geschrieben mit 10 Feldern, welche die jeweiligen Zeitpunkte beinhalten.

Mit der for-Schleife

Zitat:
n=10;
t=0;
y=[0,0,0,0,0,0,0,0];
%Laufdauer = [0 70.8;71.28 143.52 ;144 216.24;217.2 287.04;288.24 358.32;358.42 429.22;429.32 474.776 545.192;545.292 567.991 615.391 684.631;684.731 707.675 754.876 825.052; 825.152 847.448 894.348 965.532 1059.852]; %Laufdauer der einzelnen Stufen
for k = 1:n

Laufdauer= p(k,Smile;

[tSpeicher,ySpeicher]=ode45(@Model_BI130_1,Laufdauer,c0_global,Parameters);
c0 = [ Xv0(k); Xt0(k); Viab0(k); cGlc0(k); cLac0(k); cGln0(k); cAmm0(k); v0(k)]; %Vector that contains all the Initial values
t = vertcat(t,tSpeicher);
y= vertcat(y,ySpeicher);

will ich nun für jede Iteration in ein neues Feld des Structs greifen und mir die Daten holen.
Scheinbar erkennt er aber die Zeit in dem Struct nicht als Spanne an, denn

Zitat:
Error using odearguments (line 21)
When the first argument to ode45 is a function handle, the tspan argument must have at least two elements.

Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

Error in Objective_BI130_1_for (line 40)
[tSpeicher,ySpeicher]=ode45(@Model_BI130_1,Laufdauer,c0_global,Parameters);

Error in lsqnonlin (line 205)
initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Error in Parameter_Estimation_BI130_1 (line 51)
[Estimated_Parameters, resnorm, residual, exitflag, output]= lsqnonlin(@Objective_BI130_1_for,Parameters,[],[],options, Weighting);

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


Wie könnte ich es beheben und ist diese herangehensweise Sinnvoll?

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

Forum-Meister


Beiträge: 22.027
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.04.2020, 16:30     Titel:
  Antworten mit Zitat      
Hallo,

Code:
Time.p = struct('p1', {p1}, 'p2', {p2}, 'p3', {p3}, 'p4', {p4}, 'p5', {p5}, 'p6', {p6}, 'p7', {p7}, 'p8', {p8}, 'p9', {p9}, 'p10', {p10});

Das ist dreifach gemoppelt. Time ist eine Struktur, die eine Struktur enthält, die Cells enthält.
Für diese Liste brauchst du doch gar keine Namen, also viel einfacher ein "normales" Cell Array:

Code:
p = cell(1,10);
p{1}= [0 70.8];
p{2}= [71.28 143.52];
...


Zugriff dann mit p{k}

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
maki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 23.03.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2020, 18:01     Titel:
  Antworten mit Zitat      
Hallo,

danke für den Tipp!


Die ODE berechnet jetzt die y-Werte zu den vorher definierten Zeiten (aus einem Cell Array) und noch weiteren. Die Ergebnisse werden in (t,y) gespeichert.

Wie kann ich die y-Werte zu den Cell-Array Zeiten aus (t,y) extrahieren und in eine neue Variable schreiben?

Hier nochmal das Cell-Array:
Code:

p =cell (1,10);
p{1}= [0 70.8];
p{2}= [71.28 143.52];
p{3}= [144 216.24];
p{4}= [217.2 287.04];
p{5}= [288.24 358.32];
p{6}= [358.42 429.22];
p{7}= [429.32 474.776 545.192];
p{8}= [545.292 567.991 615.391 684.631];
p{9}= [684.731 707.675 754.876 825.052];
p{10}= [825.152 847.448 894.348 965.532 1059.852];


Mein Ziel ist es, eine neue Variable, quasi ein komprimiertes y herzustellen, welches die y-Werte zu den Zeiten aus der p-Cell enthält und die untereinander auflistet. zum Beispiel. (Wobei jedes p für mehrere Zeitwerte steht).

Code:
ykomprimiert = y (p{1},:);



Mein Ansatz war, ein weiteres Cell-Array zu erstellen, die Werte aus y da händisch einzutragen, aus dieser cell ein struct zu machen und von einem Struct zu einem table. Das Problem dabei ist, die table wird Richtung Columns verlängert, nicht Richtung rows. Außerdem ist es recht umständlich.

Mein Ansatz mit i funktionerte auch nicht.

Code:
i=28
yModel(i) = y (2,:);
yModel(i) = y (46,:);
 


Vielleicht hat jemand eine Idee?

Viele Grüße,
Martin
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
.


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