Matlab 插值后用ode45求解常微分方程

Matlab 插值后用ode45求解常微分方程,matlab,ode,numerical-integration,Matlab,Ode,Numerical Integration,我正在使用以下代码,无法找到错误: xx = 0:1/50:1; v = 3.*exp(-xx)-0.4*xx; xq = xx; vq = @(xq) interp1(xx,v,xq); tspan = 0:1/50:1; x0 = 3; [~, y2] = ode45(@(t,x)vq(x), tspan, x0); 我得到了y2=[3;NAN;NAN;NAN,…]。然而,当我在调用ode45之前绘制这两个方程时,我发现它们相等,这并不奇怪 当我计算: f = @(t,r) 3.*exp

我正在使用以下代码,无法找到错误:

xx = 0:1/50:1;
v = 3.*exp(-xx)-0.4*xx;
xq = xx;
vq = @(xq) interp1(xx,v,xq);

tspan = 0:1/50:1;
x0 = 3;
[~, y2] = ode45(@(t,x)vq(x), tspan, x0);
我得到了
y2=[3;NAN;NAN;NAN,…]
。然而,当我在调用
ode45
之前绘制这两个方程时,我发现它们相等,这并不奇怪

当我计算:

f = @(t,r) 3.*exp(-r)-0.4*r;
[~, y] = ode45(f,tspan,x0);

它很好用。但是我需要证明,如果我插值,我可以得到相同的结果。为什么不起作用?

您会得到
NaN
,因为这是为
xx
所跨越的时间间隔之外的值返回的默认值。在您的情况下,
xx
仅在
0
1
之间变化。但您的初始条件是
3
。如果要使用插值,则需要在数据定义的间隔内开始,并确保保持在该间隔内。例如,如果您只是更改初始条件:

xx = 0:1/50:1;
v = 3.*exp(-xx)-0.4*xx;
xq = xx;
vq = @(xq) interp1(xx,v,xq);

tspan = 0:1/50:1;
x0 = 0.1;
[t, y2] = ode45(@(t,x)vq(x), tspan, x0);

f = @(t,r) 3.*exp(-r)-0.4*r;
[t, y] = ode45(f,tspan,x0);

figure;
subplot(211)
plot(t,y,'b',t,y2,'r--')
subplot(212)
plot(t,abs(y-y2))
xlabel('t')
ylabel('Absolute Error')

即使在这种初始条件下,由于指数增长,系统的状态在某一点离开[0,1]间隔,
y2
将变为
NaN
。如果愿意,您可以告诉
interp1
使用。

y3
?您显示的代码中没有
y3
。另外,你所说的
f
的方程是没有意义的,它不是
t
r
的函数。我现在已经修复了代码,对不起,我在发布问题之前应该更加小心!对不起,霍奇勒f'是r和t的函数,尽管我在f'中只有r'谢谢@horchler,我已经完成了数学运算,你是对的!我在[0 1]间隔之外。