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返すデフォルトであるためです。あなたの場合、からまでしか変化しません。しかし、あなたの初期条件はです。補間を使用する場合は、データで定義された間隔内で開始し、そこにとどまるようにする必要があります。たとえば、初期条件を単純に変更すると、次のようになります。interp1xxxx013

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 に答える