Newton法でf(x)=0の解を求めるプログラムをC++で作っています。
f(x)=10sin(x)+e^x
反復回数が6回になると思うのですが、そうすると誤差の計算(最後のfor文)がおかしくなってしまいます。5回だと上手くいく気もするのですが、、
どっちが正しいのでしょうか?間違っている箇所があれば教えてください。
恐らく近似解は-9.139306700409e-02
誤差は最後の反復で1.85e-11になると思います。
#include<stdio.h>
#include<math.h>
double f(double x){
return 10sin(x) + exp(x);
}
double df(double x){
return 10cos(x) + exp(x);
}
int main(){
int k;
const int Max = 50;//最大反復回数
int N = 0;//反復回数
double x0 = 1.0;//初期値
double eps = 1e-12;//許容誤差
double X_n[Max + 1];//近似解を保存する数列
X_n[0] = x0;
for(int k = 0; k < Max; k++){
if(fabs(f(X_n[k])) < eps){
N = k + 1 ;
printf("反復回数は%d回\n", N);
printf("近似解は%.12e\n", X_n[k]);
break;
}
X_n[k + 1] = X_n[k] - (f(X_n[k]) / df(X_n[k]));
}
for(int j = 1; j < N; j++){
printf("%d \t %.12e \t %.2e\n" , j, X_n[j], fabs(X_n[j]-X_n[k]));
}
return 0;
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。