まずは、この数列の漸化式を求める。関数上の点 の接 線を引き、それとx軸と交点 である。まずは、 を求める ことにする。点 を通り、傾きが の直線の方 程式は、
(4) |
計算の終了は、
(6) |
ニュートン法を使う上で必要な式は、式(5)のみで ある。計算に必要な式は分かったが、数列がどのように真の解に収束 するか考える。 と真値の差の絶対値、ようするに誤差を 計算する。 を忘れないで、テイラー展開を用いて、計算を進める と
ニュートン法の特徴をまとめると次のようになる。
#include <stdio.h> #include <math.h> #define IMAX 50 double func(double x); double dfunc(double x); /*================================================================*/ /* main function */ /*================================================================*/ int main(){ double eps=1e-15; /* precision of calculation */ double x[IMAX+10]; char temp; int i=-1; printf("\ninitial value x0 = "
); scanf("%lf%c"
, &x[0], &temp); do{ i++; x[i+1]=x[i]-func(x[i])/dfunc(x[i]); printf(" %d\t%e\n"
, i, x[i+1]); if(fabs((x[i+1]-x[i])/x[i])<eps) break; }while(i<=IMAX); if(i>=IMAX){ printf("\nnot converged !!! \n\n"
); }else{ printf("\niteration = %dsolution x = %20.15f\n\n"
,i,x[i+1]); } return(0); } /*================================================================*/ /* define function */ /*================================================================*/ double func(double x){ double y; y=x*x*x-3*x*x+9*x-8; return(y); } /*================================================================*/ /* define derived function */ /*================================================================*/ double dfunc(double x){ double dydx; dydx=3*x*x-6*x+9; return(dydx); }