• ベストアンサー

常微分方程式の問題で。

常微分方程式の問題で オイラー法、ルンゲ・クッタ法、ルンゲ・クッタ・ギル法、ミルン法、アダムス法より2つの方法を用いて解け。 y''+y'/x+y=0 初期条件y'/x=-1/2 0<=x<=4 h=0.4 という問題なのですが、基本的に解き方がわかりません。 二階微分なので連立ルンゲ・クッタで解くのかな?っと思ったのですが 結局それからどうすればいいのかわかりません。 2つの方法とありますが、これはどの方法でも解けるものなのでしょうか? 本当はC言語のプログラムを組まなければいけないのですが、 この理論がわからないのでおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • petit-C
  • ベストアンサー率46% (7/15)
回答No.4

No.2です。 No.1さんの指摘どおり間違っております。 すみません。訂正させていただきます。 オイラー法では、 u[n+1] = u[n] + v[n] * h v[n+1] = v[n] + ( - v[n] / ( n * h ) - u[n] ) * h でした。(括弧はずしたほうが良いでしょう) No.1さんのいうとおり、初期条件は、  y'/x → -1/2 (x→+0) と読むしかないので、  y''(0) = -1/2 , y'(0) = 0 , y(0) = 1 ですね。 ( y''(0) = lim(x→+0)y'/x ) なので、u[0] = 1 , v[0] = 0 ですが、 上の漸化式は、n=0で0で割る問題があるので、 (他の方法でも同じです。) 1回目の手順だけ、v[0] / ( n * h )を、 -1/2としなければいけないと思います。 レポートにするなら、ここは、手計算で、 u[1],v[1]から、数値計算したらいいと思います。 参考になりました??

usui323
質問者

お礼

回答ありがとうございます。 う~ん、難しいなぁ(^^;) 一階微分ならまだ比較的理解できるのですが・・・。

その他の回答 (4)

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.5

アドバイスです。  「1階化」→「連立常微分方程式」→「各差分化手法」 で考えたらいいと思います。 <1階化> j階常微分方程式は、k次導関数を変数に割り当てることで、ベクトルの1階常微分方程式になります。 z_k(t) = (yのk階微分) ( kは、0~j-1 ) 最後以外は、z_1'(x) = z_2(x)見たいな感じです。 最後の式は、z_(j-1)'(x) とz_1からz_(j-1)で書きます。 こういう手順を1階化というはずです。 手順自体に、必然性は無いと思いますが、 この手順で、1階化できて、高階の導関数が無くなってよかったねという感じで、次の段階に行きます。 「必然性は無い」とは、別の方法でも1階化できるということ。 <連立常微分方程式> さっきの微分方程式は、連立だけど、1階の常微分方程式になりました。 z_kをk成分とするベクトルvを考えてもいいですか?  v(x) = ( z_1 , z_2 , ‥ , z_(j-1) ) とすると、  v'(x) = f(v) というベクトル値関数f(v)のある方程式になります。  { v(x + dx) - v(x) } / dx = f(v) とよめるので、移項して、  v(x + dx) = v(x) + f(v) dx になります。 <各差分化手法> できたように見えますが、実は、さっきの式のf(v)がまずいです。 vは、v(x)でしょうか?v(x+dx)でしょうか? dxを有限の値とした場合、本来ならuとか書くべきで、 厳密に言うなら、平均値の定理から出てくる、存在の保証されたある値です。 でも、誤差を評価すると、x~x+dxの間のvのどれでも、大体OKになりまし、そもそも、v(x)からだけでuを決めないといけないので、ガッツリ決めるのは無理があります。 つまり、  v(x + dx) = v(x) + f(u) dx uの決め方が、何とか法になります。 ここで、uは、vと同じ次数のベクトルです。 (u≒vです) (ふつうの)オイラー法の場合、uは、v(x)と定めます。やってみたらわかりますが、v(x+dx)を求めるのに、v(x)がわかっていたら、一発だからすごく簡単という感じです。 ルンゲクッタだと、もうちょっと複雑な決め方をしますが、理論的側面(というか証明の計算)よりは、実用上の話が大事なようにおもえます。(計算機科学の数学が大事な人だったら別ですが) 手順をちゃんと踏めるかが重要。 オイラー法は、精度がdx程度ですが、ルンゲクッタは、精度がdx^6の精度になったと思います。 一回の差分での手順は、オイラー法が1手順ですが、ルンゲクッタは、4手順かかります。 でも、精度が6次なので、ルンゲクッタはすげーとなります。 オイラーは速いからいいじゃんとも言います。(?) どの手法も一長一短があって、どれを使うかは、問題の性質によります。全部ひっくるめて、ルンゲクッタは、最終兵器という人もいます。 こんな感じのイメージで調べてみてください。

usui323
質問者

お礼

回答ありがとうございました。 難しいですが、もう少し考えてみようとおもいます。

回答No.3

No.1です。 連立化することと、オイラー法について No.2さんが書かれているので(ただし、v' = - v/u - u → v' = - v/x - u ですよね)、初期条件に関してですが、ものすごく善意に解釈して >y''+y'/x+y=0 >初期条件y'/x=-1/2 >0<=x<=4 >h=0.4 の2番目の式が、x=0の近傍で成り立つものと考えれば、y'=-1/2xと変形して、x=0 では、y'=0 で y''=-1/2 なので1番目の式から y=1 となり、x=0におけるy,y'の初期条件は定まります。また、計算機の上ではx=0におけるy'/xの値の評価は出来ませんが、x=0でy'/x=-1/2 と与えられているのでそれを一つの変数と考えることで計算できるでしょう。

usui323
質問者

お礼

回答ありがとうございます。 初期条件については少しわかりました。

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.2

「2つの方法」とは、「答えを2個作りなさい」という意味でOKだと思います。 連立も正しいと思います。 u = y v = y' として、 u' = v v' = - v/u - u とおいたら、ほとんど終わりですね。 オイラー法なら、 u[n+1] = u[n] + v[n] * h v[n+1] = v[n] + ( - v[n] / u[n] - u[n] ) * h として、ぐるぐる回せばいいと思います。 メモリを枯渇させないよう、注意してください。 問いてないので、わかりませんが、 初期条件は、何でも、いいと思います。 例えば、x[0] = 1 , y[0]= 0 , y'[1] = -1/2 。 一応、2個の答えの初期条件を合わせて、計算して、 「比べてみよ」というのが、問題の意図だと思います。 たぶん、xが小さいところで、差異が生じると思います。

usui323
質問者

お礼

回答ありがとうございます。 う~ん、なんかよくわからないんですよねー。 一階微分ならまだわからんでもないのですが、運悪く2階微分が 当たってしまったもので・・・。

回答No.1

>オイラー法、ルンゲ・クッタ法、ルンゲ・クッタ・ギル法、ミルン法、アダムス法より2つの方法を用いて解け。 どれも数値計算のアルゴリズムなので、それぞれをキーワードにしてWEBで検索すれば概要は分かると思うのですが、それ以前に >y''+y'/x+y=0 >初期条件y'/x=-1/2 >0<=x<=4 >h=0.4 は、初期条件が不足していて、どの方法でも解けません。

関連するQ&A