这个例子展示了如何用两种方式将ODE的参数与数据匹配。第一个例子显示了一个恒速圆路径直接拟合到洛伦兹系统解的一部分,这是一个著名的ODE,对初始参数有敏感的依赖性。第二部分展示了如何修改洛伦兹系统的参数来拟合一个匀速圆路径。您可以为您的应用程序使用适当的方法作为模型来拟合微分方程到数据。
洛伦兹方程组是一个常微分方程组洛伦兹制度)。对于真正的常数 ,系统是
Lorenz的敏感系统参数的值是
。启动系统[x(0),y(0),z(0)] = [10,20,10]
并查看系统从0到100年的演变。
西格玛= 10;Beta = 8/3;rho = 28;f = @(t,a)[-sigma * a(1)+ sigma * a(2);rho * a(1) - a(2) - a(1)* a(3);-beta * a(3)+ a(1)* a(2)];xt0 = [10,20,10];[TSPAN,A] = ODE45(F,[0 100],XT0);%Runge-Kutta 4th / 5阶ODE求解器图Plot3(a(:,1),a(:,2),a(:,3))视图([ - 10.0 -2.0])
进化过程相当复杂。但在一小段时间内,它看起来有点像匀速圆周运动。在时间间隔内绘制解[0,1 / 10]
。
[TSPAN,A] = ODE45(F,[0 1/10],XT0);%Runge-Kutta 4th / 5阶ODE求解器图plot3((: 1)、(:,2),(:,3))视图(-70 [-30])
循环路径的等式有几个参数:
角 来自x-y平面的路径
角 从沿X轴倾斜的平面
半径R.
速度V.
转移T0.从时间0
空间中的3-D偏移三角洲
就这些参数而言,确定循环路径的位置xdata.
。
类型fitlorenzfn
功能f = forlorenzfn(x,xdata)theta = x(1:2);r = x(3);v = x(4);t0 = x(5);delta = x(6:8);f =零(长度(xdata),3);f(:,3)= r * sin(θ(1))* sin(v *(xdata-t0))+ delta(3);f(:,1)= r * cos(v *(xdata-t0))* cos(theta(2))... - r * sin(v *(xdata-t0))* cos(theta(1))* SIN(THETA(2))+三角洲(1);f(:,2)= r * sin(v *(xdata-t0))* cos(theta(1))* cos(theta(2))... - r * cos(v *(xdata - t0))* SIN(THETA(2))+ DELTA(2);
为了找到在ODE解中给出的时刻到洛伦兹系统的最佳拟合圆路径,请使用lsqcurvefit.
。为了使参数保持在合理的范围内,对各参数设置界限。
磅=[-15年-π-π/ 2,5日,-π,-40,-40,-40];乌兰巴托=π/ 2,π,60岁,15日,π,40岁,40岁,40);theta0 = (0, 0);R0 = 20;= 1;t0 = 0;delta0 = 0 (3,1);x0 = [theta0; R0 V0; t0 delta0);[xb, resnorm残留]= lsqcurvefit (tspan @fitlorenzfn, x0,磅,乌兰巴托);
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
从颂歌解决方案与洛伦茨系统的解决方案绘制最佳拟合圆点。
soln = a +残差;持有在Plot3(Soln(:,1),Soln(:,2),Soln(:,3),'r') 传奇('ode解决方案'那'圆弧')举行从
图plot3((: 1)、(:,2),(:,3),'b。'那“MarkerSize”, 10)在Plot3(Soln(:,1),Soln(:,2),Soln(:,3),'rx'那“MarkerSize”10)传说('ode解决方案'那'圆弧')举行从
现在修改参数 最适合圆弧。为了更好的拟合,允许初始点[10,20,10]也改变。
为此,编写函数文件Paramfun.
用ODE拟合的参数来计算时间的轨迹T.
。
类型Paramfun.
功能pos = paramfun(x,tspan)sigma = x(1);beta = x(2);rho = x(3);xt0 = x(4:6);f = @(t,a)[-sigma * a(1)+ sigma * a(2);rho * a(1) - a(2) - a(1)* a(3);-beta * a(3)+ a(1)* a(2)];[〜,pos] = ode45(f,tspan,xt0);
找到最佳参数,使用lsqcurvefit.
以减少新的计算ODE轨迹和圆弧之间的差异soln.
。
XT0 =零(1,6);XT0(1)= Sigma;xt0(2)= beta;xt0(3)= rho;XT0(4:6)= Soln(1,:);[PBEST,PRESNORM,常规,EXITFLAG,OUTPUT] = LSQCurveFit(@ Pararfun,XT0,Tspan,Soln);
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
确定此优化更改了参数的程度。
fprintf('新参数:%f,%f,%f'pb (1:3))
新参数:9.132446,2.854998,27.937986
fprintf('原始参数:%f, %f, %f',[sigma,beta,rho])
原始参数:10.000000,2.666667,28.000000
参数Sigma.
和β
改变了大约10%。
绘制修改的解决方案。
图保存在odesl = president + soln;plot3 (odesl (: 1) odesl (:, 2), odesl (:, 3),'B')Plot3(Soln(:,1),Soln(:,2),Soln(:,3),'r') 传奇('ode解决方案'那'圆弧')查看([ - 30 -70])持有从
如上所述优化模拟或常微分方程,优化器由于数值ode解决方案中的固有噪声而产生问题。万博 尤文图斯如果您怀疑您的解决方案不是理想的,可能是因为退出消息或退出标志表示潜在的不准确性,然后尝试更改有限差异。在此示例中,使用更大的有限差分步长和中央有限差异。
选择= optimoptions ('lsqcurvefit'那“FiniteDifferenceStepSize”,1e-4,......'finitedifferenceType'那“中央”);[PBEST2,PRESNORM2,Pariadual2,ExitFlag2,Output2] =......lsqcurvefit (@paramfun xt0 tspan,溶液,[],[],选项);
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
在这种情况下,使用这些有限差分选项不会改善解决方案。
DISP([预升高,PRESNORM2])
20.0637 - 20.0637