DAE上使用的lsqcurvefit函数给出Index的错误超过数组元素的数量(1)

时间:2019-01-06 15:10:22

标签: indexing

我正在学习使用下面给出的简单案例解决DAE时如何使用lsqcurvefit。目前,我收到一条错误消息:

Index exceeds the number of array elements (1).
Error in sym/subsref (line 870)
            R_tilde = builtin('subsref',L_tilde,Idx);
Error in SimpleExcersize (line 12)
eqn1 = diff(x(t),t) == (1 / b(1)) * (b(2) * b(3) - b(2) * x(t)) - ((x(t) * b(4) * b(5) - b(6) * ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) / (1 / b(7))
+ (b(6) / (((b(8)*((b(6)*x(t) * b(4) * b(5))- ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(9)* ((b(12) * b(6) * x(t) * b(4) * b(5) / z(t))-((y(t) *
b(12) * b(13))/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(10) *((b(12) * b(13) * b(6) * x(t) * b(4) * b(5) / z(t).^2) - ((y(t) * b(12) * b(13))/(z(t).^2 + b(12) * z(t)
+ b(12) * b(13))))) / (b(8) * ((b(6) * x(t) * b(4) * b(5))- ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) * b(11))))));

如何修改代码?

我试图确保b0具有14个初始值。代码是

   tdata =[0;960;1920;2880;3840;4800;5760;6720;7680;8640;9600;10560;11520;12480;13440;14400;15360;16320;17280;18240;19200;20160;21120;22080;23040;24000;24960;25920;26880;27840;28800;29760;30720];

xdata=zeros(33,3);

xdata (:,1) = [3.16E-02;3.56E-02;3.83E-02;4.12E-02;4.34E-02;4.58E-02;4.74E-02;4.92E-02;5.08E-02;5.21E-02;5.34E-02;5.49E-02;5.56E-02;5.63E-02;5.72E-02;5.80E-02;5.88E-02;5.92E-02;5.98E-02;6.03E-02;6.06E-02;6.10E-02;6.14E-02;6.15E-02;6.18E-02;6.20E-02;6.22E-02;6.24E-02;6.25E-02;6.26E-02;6.27E-02;6.28E-02;6.29E-02];
xdata (:,2) = [0.33;0.64;0.93;1.18;1.40;1.60;1.78;1.94;2.08;2.20;2.31;2.41;2.49;2.57;2.63;2.69;2.74;2.78;2.82;2.85;2.87;2.89;2.91;2.93;2.94;2.95;2.96;2.96;2.97;2.97;2.97;2.98;2.98];
xdata (:,3) = [6.87;6.65;6.43;5.68;3.45;3.00;2.85;2.78;2.63;2.61;2.57;2.56;2.55;2.58;2.59;2.55;2.57;2.57;2.52;2.51;2.51;2.53;2.53;2.51;2.5;2.51;2.49;2.49;2.49;2.47;2.47;2.46;2.46];


syms x(t) y(t) z(t) b 

eqn1 = diff(x(t),t) == (1 / b(1)) * (b(2) * b(3) - b(2) * x(t)) - ((x(t) * b(4) * b(5) - b(6) * ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) / (1 / b(7)) + (b(6) / (((b(8)*((b(6)*x(t) * b(4) * b(5))- ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(9)* ((b(12) * b(6) * x(t) * b(4) * b(5) / z(t))-((y(t) * b(12) * b(13))/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(10) *((b(12) * b(13) * b(6) * x(t) * b(4) * b(5) / z(t).^2) - ((y(t) * b(12) * b(13))/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))) / (b(8) * ((b(6) * x(t) * b(4) * b(5))- ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) * b(11))))));
eqn2 = diff(y(t),t)== ((x(t) * b(4) * b(5) - b(6) * ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) / (1 / b(7)) + (b(6) / (((b(8)*((b(6) * x(t) * b(4) * b(5))-((y(t) * b(12) * z(t)) / (z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(9) * ((b(12) * b(6) * x(t) * b(4) * b(5) / z(t))-((y(t) * b(12) * b(13))/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))+ b(10)*((b(12) * b(13) * b(6) * x(t) * b(4) * b(5) / z(t).^2) - ((y(t) * b(12) * b(13))/(z(t).^2 + b(12) * z(t) + b(12) * b(13))))) / (b(8)*((b(6) * x(t) * b(4) * b(5))- ((y(t) * z(t).^2)/(z(t).^2 + b(12) * z(t) + b(12) * b(13)))) * b(11))))));
eqn3 = z(t) - (b(14) / z(t)) - ((y(t) * b(12) * z(t)) / (z(t)^2 + b(12) * z(t) + b(12) * b(13)))-  2 * ((y(t) * b(12) * b(13))/(z(t)^2 + b(12) * z(t) + b(12) * b(13))) == 0;

eqns = [eqn1 eqn2 eqn3];

vars = [x(t); y(t); z(t)];

origVars = length(vars);

M = incidenceMatrix(eqns, vars);

[eqns, vars] = reduceDifferentialOrder(eqns, vars);

isLowIndexDAE(eqns,vars);

f = daeFunction(eqns,vars, b);


F = @(t, Y, YP) f(t, Y, YP, b);

vars;
y0est = [3.16E-02; 0.33; 6.87];
yp0est = zeros(3,1);
opt = odeset('RelTol', 10.0^(-7), 'AbsTol' , 10.0^(-7));
[y0, yp0] = decic(F, 0, y0est, [], yp0est, [], opt);
[tSol,ySol] = ode15i(F, [0, 30720], y0, yp0, opt);
for k = 1:origVars
  S{k} = char(vars(k));
end

plot(y0, yp0)

% initial guesses
b0 = [1 1 1 1 1 1 1 1 1 1 1 1 1 1];

[b, resnorm, exitflag, output] = lsqcurvefit(F,b0,tdata,xdata);

plot(tdata,xdata(:,1),'p',tdata,xdata(:,2),'d',tdata,xdata(:,3),'v')
hold on
plot(tSol, F(b,tSol))
hold off

我希望代码给出b的最佳值。

0 个答案:

没有答案