ニュートン法のは一般に、初期値に近い解を高速に計算する計算方法である。
区間[a; b] 内にある解を求める為に、次のような方法を考える。
- 区間[a; b] 内の1025 個点xn = a + (b ???? a) n=1024, (0 n 1024) 、そのな
かでjf(xn)j が最小であるものを返す関数maekeisan を作る。
2. 関数maekeisan で得られた点を初期値として、ニュートン法を計算する。
問い:/* houteisiki05.c / 以下のプログラムを完成させよ。
#include <stdio.h>
#include <math.h>
#define EPS 1e-8 / 打ち切り誤差*/
#define LIMIT 50 /* 打ち切り回数*/
double f(double x){ return sin(x); }
double df(double x){ return cos(x); }
double maekeisan(double (*f)(double), double a, double b){
double x,saisho,xx;
int n;
saisho=fabs(f(a)); 【A 】;
for(n=0;【B 】;n++){
x=a+(b-a)*n/1024;
if (fabs(f(x))<saisho) {xx=x; saisho=【C 】}
}
return xx;
}
double newton2(double (*f)(double), double (*g)(double), double a, double b){
double x0,x1;
int k;
x0=【D 】;
printf("初期値=%lf \n",x0);
for (k=1;k<=LIMIT;k++) {
x1=x0-f(x0)/df(x0);
if (fabs(x1-x0)<EPS) return x1;
x0=x1;
}
if (k>LIMIT) { printf("収束しない\n"); return 9999;}
}
main(){
printf("x=%lf \n",newton2(f,df,3,7));
}
実行結果
初期値=3.140625
x=3.141593
回答1件
あなたの回答
tips
プレビュー