1

3 次 ODE の解と直線 y=x の交点を見つけるにはどうすればよいですか?

私のODEのコードは

sol=dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4')
x=0:2
y=subs(sol,'t',x)
plot(x,y)
4

1 に答える 1

2

交点の数値を見つけるには:

解と求めている線との交点でゼロになる無名関数を作成します。

sol = dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4');
my_func = @(x) subs(sol,'t',x) - x; % Your solution - x is equal to zero at the %intersections

次に、値をグラフィカルに見つけたい場合は、次のようにします。

plot(-5:.01:5,my_func(-5:.01:5))

または数値的に、最適化ルーチンによって:

x = fzero(my_func,0); % I find x = -.6847

これは、0 に近い関数のゼロを探します。すべてのゼロが見つかるわけではないため、交点があると予想される値の近くで fzero 関数を開始する必要があります。

お役に立てれば、

アンドリュー

編集: 二分法のハウツー。

匿名の 1 次元関数 "my_func" を取得したら、方程式を解くために最適化手法を使用したくないが、my_func = 0 の範囲 [range_{min} range_{max}] がわかっている場合は、次のアルゴリズムは、連続関数を使用している場合、関数のゼロを見つけます。

range_min = 0; % say our range is [0 2]
range_max = 2;

error_tolerance = .0001; % will find the answer to within .0001

while (range_max - range_min < error_tolerance)
range_temp = (range_max + range_min)/2;
if ((my_func(range_temp) <0 & my_func(range_max)>0) | (my_func(range_temp) >0 & my_func(range_max)<0))
range_min = range_temp;

else if ((my_func(range_min)<0 & my_func(range_temp)>0) | (my_func(range_min)>0 & my_func(range_temp)<0))
    range_max = range_temp;

else if (my_func(range_temp == 0)
range_min = range_temp;
range_max = range_temp;

    end

end

t_intersection = (range_min + range_max)/2;

したがって、いくつかの説明: 関数が連続であり、あなたの関数が連続である場合、t_intersection で y=t と交差する場合、変更された関数 my_func(t) = sol(t)-t は t_intersection でゼロになります。my_func は連続であるため、関数の 2 つの値 (ゼロより大きい値とゼロより小さい値) がわかっている場合、関数のゼロを見つけることができます。

したがって、これらの既知の点から始めて、my_func(range_min)<0 および my_func(range_max)>0 またはその逆の範囲 [range_min range_max] を定義します。次に、中間点 range_temp = mean(range_min and _max) を作成して、この範囲を半分にカットします。ここで、新しい範囲 [range_temp range_max] または [range_min range_temp] を作成して、範囲全体で my_func の符号の変更を保持するようにします。満足のいく精度に達するまで、このプロセスを繰り返します。

ただし、1 つの注意点があります。これは、指定した初期範囲内で 1 つのゼロしか検出しません。これは、ほとんどのゼロ検出方法に対する根本的なフラストレーションであり、より一般的には、ゼロ検出が特殊なケースと見なされる最適化の分野です。

頑張ってください。

-- アンドリュー

于 2011-02-08T02:27:47.803 に答える