0

我正在使用以下代码,但找不到问题所在:

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);

它工作正常。但我需要证明,如果我进行插值,我可以获得相同的结果。为什么这不起作用?

4

1 回答 1

1

你得到NaN,因为这是由interp1跨越的间隔之外的值返回的默认值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使用实际推断。

于 2014-02-15T18:43:42.197 回答