这个例子展示了如何用两种方法使ODE的参数适合于数据。第一种方法直接拟合了一个等速圆路径到洛伦兹系统解的一部分,洛伦兹系统是一个著名的微分方程,对初始参数有敏感的依赖性。第二章是如何修改洛伦兹系统的参数来拟合等速圆路径。对于应用程序,您可以使用适当的方法作为模型,将微分方程拟合到数据中。
洛伦兹方程组是一个常微分方程组(见洛伦兹系统).真正的常数 ,系统是
敏感系统的参数洛伦兹值为
.启动系统从[x(0)(0)、z(0)) =(10年,20年,10)
并查看系统从时间0到100的演变。
σ= 10;β= 8/3;ρ= 28;F = @(t,a) [-sigma*a(1) + sigma*a(2)];Rho *a(1) - a(2) - a(1)*a(3);β* (3)+ (1)* (2)];xt0 =(10年,20年,10);[tspan,a] = ode45(f,[0 100],xt0);%龙格-库塔4 /5阶ODE求解器图plot3((: 1)、(:,2),(:,3))视图([-10.0 - -2.0])
进化过程相当复杂。但在一小段时间内,它看起来有点像匀速圆周运动。在时间区间内画出解[0, 1/10)
.
[tspan,a] = ode45(f,[0 1/10],xt0);%龙格-库塔4 /5阶ODE求解器图plot3((: 1)、(:,2),(:,3))视图(-70 [-30])
圆路径方程有几个参数:
角 从x-y平面出发的路径
角 平面沿x轴倾斜
半径R
速度V
转变t0从时间0
空间三维位移δ
根据这些参数,确定次圆路径的位置xdata
.
类型fitlorenzfn
函数f = fitlorenzfn(x,xdata) = x(1:2);R = x (3);V = x (4);t0 = x (5);δ= x (8);f = 0(长度(xdata), 3);f (: 3) = R * sin(θ(1))* sin (V * (xdata - t0)) +δ(3);f(:,1) = R*cos(V*(xdata - t0))*cos(theta(2))…- R * sin (V * (xdata - t0)) * cos(θ(1))* sin(θ(2))+δ(1);f (: 2) = R * sin (V * (xdata (t0)) * cos(θ(1))* cos(θ(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停止是因为相对于初始值的平方和的最终变化小于函数公差的值。
从ODE解和Lorenz系统的解一起绘制时刻的最佳拟合圆点。
Soln = a +残差;持有在plot3(溶液(:1)溶液(:,2),溶液(:,3),“r”)传说(“颂歌解决方案”,圆弧的)举行从
图plot3((: 1)、(:,2),(:,3),“b”。,“MarkerSize”, 10)在plot3(溶液(:1)溶液(:,2),溶液(:,3),“处方”,“MarkerSize”10)传说(“颂歌解决方案”,圆弧的)举行从
现在修改参数 以配合圆弧。为了更好的匹配,也允许初始点[10,20,10]改变。
为此,编写一个函数文件paramfun
取ODE拟合的参数并计算时间内的轨迹t
.
类型paramfun
函数pos = paramfun(x,tspan) sigma = x(1);β= x (2);ρ= x (3);xt0 = x (6);F = @(t,a) [-sigma*a(1) + sigma*a(2)];Rho *a(1) - a(2) - a(1)*a(3);β* (3)+ (1)* (2)];[~, pos] =数值(f tspan xt0);
要找到最佳参数,请使用lsqcurvefit
使新计算的ODE轨迹与圆弧之间的差异最小溶液
.
xt0 = 0 (1,6);xt0(1) =σ;xt0(2) =β;xt0(3) =ρ;xt0(6) =溶液(1:);[pb, presnorm presidual、exitflag、输出]= lsqcurvefit (@paramfun、xt0 tspan,溶液);
局部最小值。Lsqcurvefit停止是因为相对于初始值的平方和的最终变化小于函数公差的值。
确定此优化对参数的更改程度。
流('新参数:%f, %f, %f'pb (1:3))
新增参数:9.132446、2.854998、27.937986
流('原始参数:%f, %f, %f'(σ,β,ρ))
原始参数:10.000000、2.666667、28.000000
的参数σ
和β
变化了大约10%。
画出修改后的溶液。
图保存在Odesl =总统+ soln;plot3 (odesl (: 1) odesl (:, 2), odesl (:, 3),“b”) plot3(溶液(:1)溶液(:,2),溶液(:,3),“r”)传说(“颂歌解决方案”,圆弧的)视图([-30 -70])保持从
中描述的优化模拟或常微分方程,由于数值ODE解中的固有噪声,优化器可能会遇到麻烦。金宝搏官方网站如果您怀疑您的解决方案不是理想的,可能是因为退出消息或退出标志表明了潜在的不准确性,那么请尝试更改有限差分。在本例中,使用更大的有限差分步长和中心有限差分。
选择= optimoptions (“lsqcurvefit”,“FiniteDifferenceStepSize”1的军医,...“FiniteDifferenceType”,“中央”);[pbest2, presnorm2 presidual2、exitflag2 output2] =...lsqcurvefit (@paramfun xt0 tspan,溶液,[],[],选项);
局部最小值。Lsqcurvefit停止是因为相对于初始值的平方和的最终变化小于函数公差的值。
在这种情况下,使用这些有限差分选项并不能改善解。
disp ([presnorm presnorm2])
20.0637 - 20.0637