2011-02-07 19 views
1

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

マイ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) 

答えて

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 

数値をグラフィカルに検索する場合:

あなたが値場所の近く関数fzeroを開始する必要がありますので、0に近く関数の零点を探します

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

それはすべてゼロを見つけることができません:最適化ルーチンによって

や数値、あなたは交差点があることを期待しています。このことができます

希望、

アンドリュー

編集:どのように二分法の。

最適化方法を使用して方程式を解きたくない場合は、匿名の1次元関数 "my_func"が得られますが、my_funcの範囲[range_ {min} range_ {max} = 0次のアルゴリズムでは、連続関数で作業している提供し、あなたのための関数のゼロを見つける:

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つの値を知っていれば関数のゼロを見つけることができます.1つは0より大きく、もう1つは0より小さい値です。

これらの既知の点から始めて、範囲[range_min range_max]を定義します。ここで、my_func(range_min)<とmy_func(range_max)> 0またはその逆です。次に、range_temp = mean(range_minと_max)の中間点を作成して、この範囲を半分にカットします。レンジ上のmy_funcの符号変更を保存するために、新しいrange [range_temp range_max]または[range_min range_temp]を作成します。我々は満足のいく精度に達するまでこのプロセスを繰り返す。

しかし、注意しなければならないのは、あなたが提供する最初の範囲内で1つのゼロしか見つからないことです。これは、ほとんどのゼロ発見法、そしてより一般的には、ゼロ発見が特別なケースとみなされる最適化の分野における基本的な不満である。

私は幸運、それはそれをカバーだと思います。

--Andrew

+0

のErm ...大丈夫...何とか私はそれを得ることはありません...私は意味 - 私はXがどのくらい見つけることはありません。 Erm。 t = 0:.3:10のような単純な関数の場合、どうすればよいでしょうか。y = sin(t); – Izumi

+0

オケイ...えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、 、y = 0である。 – Izumi

+0

@ lzumi、comment 1:y = tとy = sin(t)の交点を見つけたければ、関数z(t)= sin(t)-tの零点を探します。次のようにして、matlabで無名関数を作成します:z = @(t)sin(t)-t; t_zero = fzero(z、0)を見つける。 – Sevenless

関連する問題