主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

拟合常微分方程 (ODE)

此示例说明如何以两种方式对数据进行 ODE 的参数拟合。第一种方式是直接对洛仑兹方程组的部分解进行恒速圆周轨迹拟合。洛仑兹方程组是著名的 ODE,高度依赖于初始参数。第二个示例说明如何修改洛仑兹方程组的参数,以拟合恒速圆周轨迹。您可以针对您的应用使用适当的方法,作为对数据进行微分方程拟合的模型。

洛仑兹方程组:定义和数值解

洛仑兹方程组是常微分方程组(请参阅洛仑兹方程组)。对于实数常量 σ,ρ,β,方程组为

dxdt=σ(y-x)dydt=x(ρ-z)-ydzdt=xy-βz.

一个敏感系统的洛仑兹参数值是 σ=10,β=8/3,ρ=28。从 [x(0),y(0),z(0)] = [10,20,10] 开始启动系统,查看系统从时间 0 到 100 的演变。

sigma = 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/5th order ODE solver
figure
plot3(a(:,1),a(:,2),a(:,3))
view([-10.0 -2.0])

Figure contains an axes object. The axes object contains an object of type line.

演变相当复杂。但在很短的时间区间内,它看起来有点像匀速圆周运动。绘制 [0,1/10] 时间区间内的解。

[tspan,a] = ode45(f,[0 1/10],xt0);     % Runge-Kutta 4th/5th order ODE solver
figure
plot3(a(:,1),a(:,2),a(:,3))
view([-30 -70])

Figure contains an axes object. The axes object contains an object of type line.

对 ODE 解进行圆周路径拟合

圆周轨迹的方程组有几个参数:

  • 路径与 x-y 平面间的夹角 θ(1)

  • 平面与 x 轴向倾角间的夹角 θ(2)

  • 半径 R

  • 速度 V

  • 相对于时间 0 的时移 t0

  • 空间 delta 中的三维位移

根据这些参数,可确定时间 xdata 的圆周轨迹的位置。

type fitlorenzfn
function f = fitlorenzfn(x,xdata)

theta = x(1:2);
R = x(3);
V = x(4);
t0 = x(5);
delta = x(6:8);
f = zeros(length(xdata),3);
f(:,3) = R*sin(theta(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)) + delta(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。为了将参数保持在合理的范围内,可对各参数设置边界。

lb = [-pi/2,-pi,5,-15,-pi,-40,-40,-40];
ub = [pi/2,pi,60,15,pi,40,40,40];
theta0 = [0;0];
R0 = 20;
V0 = 1;
t0 = 0;
delta0 = zeros(3,1);
x0 = [theta0;R0;V0;t0;delta0];
[xbest,resnorm,residual] = lsqcurvefit(@fitlorenzfn,x0,tspan,a,lb,ub);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>

绘制 ODE 解的时间点处的最佳拟合圆周点以及洛仑兹方程组的解。

soln = a + residual;
hold on
plot3(soln(:,1),soln(:,2),soln(:,3),'r')
legend('ODE Solution','Circular Arc')
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent ODE Solution, Circular Arc.

figure
plot3(a(:,1),a(:,2),a(:,3),'b.','MarkerSize',10)
hold on
plot3(soln(:,1),soln(:,2),soln(:,3),'rx','MarkerSize',10)
legend('ODE Solution','Circular Arc')
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent ODE Solution, Circular Arc.

对圆弧进行 ODE 拟合

现在修改参数 σ,β,andρ,使其与圆弧最佳拟合。为了更好地拟合,也允许初始点 [10,20,10] 发生改变。

为此,编写函数文件 paramfun,该文件采用 ODE 拟合的参数,并计算在时间 t 上的轨迹。

type paramfun
function 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 = zeros(1,6);
xt0(1) = sigma;
xt0(2) = beta;
xt0(3) = rho;
xt0(4:6) = soln(1,:);
[pbest,presnorm,presidual,exitflag,output] = lsqcurvefit(@paramfun,xt0,tspan,soln);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>

确定这种优化对参数的改变程度。

fprintf('New parameters: %f, %f, %f',pbest(1:3))
New parameters: 9.132446, 2.854998, 27.937986
fprintf('Original parameters: %f, %f, %f',[sigma,beta,rho])
Original parameters: 10.000000, 2.666667, 28.000000

参数 sigmabeta 大约改变 10%。

绘制修正后的解。

figure
hold on
odesl = presidual + soln;
plot3(odesl(:,1),odesl(:,2),odesl(:,3),'b')
plot3(soln(:,1),soln(:,2),soln(:,3),'r')
legend('ODE Solution','Circular Arc')
view([-30 -70])
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent ODE Solution, Circular Arc.

ODE 拟合中的问题

优化仿真或常微分方程中所述,优化器可能会因为数值 ODE 解中的固有噪声而遇到问题。如果您怀疑解不理想(例如,退出消息或退出标志指示解可能不准确),则可尝试更改有限差分运算。在本示例中,我们使用了更大的有限差分步长和中心有限差分。

options = optimoptions('lsqcurvefit','FiniteDifferenceStepSize',1e-4,...
    'FiniteDifferenceType','central');
[pbest2,presnorm2,presidual2,exitflag2,output2] = ...
    lsqcurvefit(@paramfun,xt0,tspan,soln,[],[],options);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>

在这一情况中,使用这些有限差分选项不能改进解。

disp([presnorm,presnorm2])
   20.0637   20.0637

另请参阅

主题