• ベストアンサー

数値計算??

f(x)=x-cosx=0 の解を求めるプログラムを教えて下さい。 ニュートン法と逐次代入法で 初期値は0.5、収束判定は10の-10乗 と先生が言ってたのですが 全くわかりません。 お願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

参考までにCで作ってみました。 /* f(x)=x-cosx=0 の解をx=0.5から始めてe=10^(-10)の範囲で求める */ /* ニュートン法: f'(x)=1+sinx 点(a,b)を通り傾き1+sinaの直線は y-b=(x-a)(1+sina) x軸との交わる時のxは x=-b/(1+sina)+a */ #include <stdio.h> #include <math.h> void main(void){ double xold,xnew,e; unsigned c=0; e=pow(10,-10); xnew=0.5; do{ c++; xold=xnew; xnew=(cos(xold)-xold)/(1.0+sin(xold))+xold; }while(fabs(xnew-xold)>e); printf("繰り返し数(%u):x=%#12.11g,e=%#g\n",c,xnew,e); } /* f(x)=x-cosx=0 の解をx=0.5から始めてe=10^(-10)の範囲で求める */ /* 逐次代入法 */ #include <stdio.h> #include <math.h> void main(void){ double xold,xnew,e; unsigned c=0; e=pow(10,-10); xnew=0.5; do{ c++; xold=xnew; xnew=cos(xold); }while(fabs(xnew-xold)>e); printf("繰り返し数(%u):x=%#12.11g,e=%#g\n",c,xnew,e); } このプログラムでは、ニュートン法が10倍以上速いことがわかりますね。

sisuado
質問者

お礼

2通りの方法、両方教えて下さり有難うございました。 感動しました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

私、javaのプログラムは、よくわかりませんので、 ニュートン法と逐次代入法について ニュートン法は、 あるxについてf(x)を微分することで、接線の導きコレが0になるx(点)(y=0と交わるx(点)を)を求めて、これを次のxとして同じ手順をくりかえす方法です。 逐次代入法は、 y=xとy=cosxのグラフを描いてみると f(x)=x-cosx=0となる部分というのは、 y=xとy=cosxの交わるところだとわかります。 x=0.5から始めて、 cosxの結果をyとして、y=xのxを求めます。 そこで、求まったxをまたcosxしてと順繰り代入していくと、 グラフ上ぐるぐる回って逐次収束します。(収束しないかもしれません、それは、調べてみないとね) ほとんど、数値計算ばかりなので、 プログラム的には、何で書いてもそれほど難しくはないと思います。

sisuado
質問者

お礼

ありがとうございます!