プロが教えるわが家の防犯対策術!

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

A 回答 (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倍以上速いことがわかりますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/17 23:32

私、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してと順繰り代入していくと、
グラフ上ぐるぐる回って逐次収束します。(収束しないかもしれません、それは、調べてみないとね)
ほとんど、数値計算ばかりなので、
プログラム的には、何で書いてもそれほど難しくはないと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2004/10/17 23:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!