この非線形方程式は、図1のように
のx軸と交わる点
に実数解を持つ。ここだけとは限らないが、少なくともこの交わる点は解である。この点
の値は、コンピューターを用いた反復(ループ)計算により探すことができる。
この授業では4通りの計算テクニックを学習したが、重要3なのは
実際の数値計算は、
であるような2点
から出発する。
そして、区間
を2分する点
に対して、
を計算を行う。
ならば
を
と置き換え、
ならば
を
と置き
換える。絶えず、区間
の間に解があるようにするのである。この操作
を繰り返して、区間の幅
が与えられた値
よりも小さく
なったならば、計算を終了する。解へ収束は収束率1/2の一次収束である。
実際にこの方法で
1 #include <stdio.h>
2 double func(double x);
3
4 /*=============================================================*/
5 /* main function */
6 /*=============================================================*/
7
8 int main(){
9 double eps=1e-15; /* precision of calculation */
10 double a, b, c;
11 double test;
12 char temp;
13 int i=0;
14
15 do{
16
17 printf("\ninitial value a = ");
18 scanf("%lf%c", &a, &temp);
19
20 printf("initial value b = ");
21 scanf("%lf%c", &b, &temp);
22
23 test=func(a)*func(b);
24
25 if(test >= 0){
26 printf(" bad initial value !! f(a)*f(b)>0\n\n");
27 }
28
29 }while(test >= 0);
30
31 if(b-a<0){
32 c=a;
33 a=b;
34 b=c;
35 }
36
37
38 while(b-a>eps){
39
40 c=(a+b)/2;
41
42 if(func(c)*func(a)<0){
43 b=c;
44 }else{
45 a=c;
46 }
47
48 i++;
49 printf(" %d\t%20.15f\n",i,c);
50
51 }
52
53 printf("\nsolution x = %20.15f\n\n",c);
54
55 return(0);
56 }
57
58
59 /*=============================================================*/
60 /* define function */
61 /*=============================================================*/
62
63 double func(double x){
64 double y;
65
66 y=x*x*x-3*x*x+9*x-8;
67
68 return(y);
69 }
まずは、この数列の漸化式を求める。関数
上の点
の接
線を引き、それとx軸と交点
である。まずは、
を求める
ことにする。点
を通り、傾きが
の直線の方
程式は、
| (4) |
計算の終了は、
![]() |
(6) |
ニュートン法を使う上で必要な式は、式(5)のみで
ある。計算に必要な式は分かったが、数列がどのように真の解
に収束
するか考える。
と真値
の差の絶対値、ようするに誤差を
計算する。
を忘れないで、テイラー展開を用いて、計算を進める
と
![]() |
ニュートン法の特徴をまとめると次のようになる。
1 #include <stdio.h>
2 #include <math.h>
3 #define IMAX 50
4 double func(double x);
5 double dfunc(double x);
6
7 /*================================================================*/
8 /* main function */
9 /*================================================================*/
10 int main(){
11 double eps=1e-15; /* precision of calculation */
12 double x[IMAX+10];
13 char temp;
14 int i=-1;
15
16 printf("\ninitial value x0 = ");
17 scanf("%lf%c", &x[0], &temp);
18
19 do{
20 i++;
21 x[i+1]=x[i]-func(x[i])/dfunc(x[i]);
22
23 printf(" %d\t%e\n", i, x[i+1]);
24
25 if(fabs((x[i+1]-x[i])/x[i])<eps) break;
26 }while(i<=IMAX);
27
28 if(i>=IMAX){
29 printf("\n not converged !!! \n\n");
30 }else{
31 printf("\niteration = %d solution x = %20.15f\n\n",i,x[i+1]);
32 }
33
34 return(0);
35 }
36
37 /*================================================================*/
38 /* define function */
39 /*================================================================*/
40 double func(double x){
41 double y;
42
43 y=x*x*x-3*x*x+9*x-8;
44
45 return(y);
46 }
47
48 /*================================================================*/
49 /* define derived function */
50 /*================================================================*/
51 double dfunc(double x){
52 double dydx;
53
54 dydx=3*x*x-6*x+9;
55
56 return(dydx);
57 }
二分法に比べて、ニュートン法は収束が早く良さそうであるが、次に示すように解へ収束 しない場合があり問題を含んでいる。
非線形方程式
| (8) |
このようにニュートン法は解に収束しないで、振動する場合がある。こうなる と、プログラムは無限ループに入り、永遠に計算し続ける。これは資源の無駄 遣いなので、慎むべきである。通常は、反復回数の上限を決めて、それを防ぐ。 ニュートン法を使う場合は、この反復回数の上限は必須である。
実際には収束しない場合のほうが稀であるので、ニュートン法は非常に強力な 非線型方程式の解法である。ただ、反復回数の上限を決めることを忘れてはならない。