ce-12. ニュートン法による方
程式の求解
1
金子邦彦
C プログラミング応用)(全14回)
URL: https://www.kkaneko.jp/pro/c/index.html
ニュートン法による求解
2
ニュートン法
ニュートン法による非線形方程式 f (x) = 0 の求
3
出力:
f
(
x
) = 0
近似解の1
入力:関数 fと,
初期近似値 x0
再帰による繰返し計算により,
x
1
x
2... を求め
(手順は次ページ)
収束すれば,解の近似値が得られる
(注)収束しない場合もありえる
ニュートン法
初期近似値 x0 から出発
反復公式
を繰り返す
x1x2x3 ... は,徐々に解に近づいていく(と
期待できる)
4
)('
)(
1
i
i
ii xf
xf
xx
ニュートン法
初期近似値 x0 から出発
反復公式
を繰り返す
x1x2x3 ... は,徐々に解に近づいていく(と
期待できる)
5
)('
)(
1
i
i
ii xf
xf
xx
これは,点(
x
i,
f
(
x
i) )における 接線と,
x
(
y
= 0) との交点 (
x
i+1, 0) を求めてい
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
x
36
x
2 +11
x
6
6
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点を1つ選ぶ
関数上の点
7
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 接線を引
接線
8
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
接線
関数上の点
解の1
この場合,接線と
x
軸の交点は解の1つに
近づいている
接線と
x
の交点
9
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 (
x
0,
f
(
x
0))
接線と x 軸の交
(
x
0
f
(
x
0)/
f
'(
x
0), 0)
接線
y
=
f
'(
x
0)(
x
x
0) +
f
(
x
0)
関数上の点 から
接線と
x
軸の交点の
x
座標
を求めることを繰返す
)(, ii xfx
)(/)('
1iiii xfxfxx
10
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 (0, 6)
x
0= 0
接線と
x
軸の交点 (0.54545454..., 0)
x
1= 0.54545454...
11
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 (0.54545454..., 1.62283996...)
x
1= 0.54545454...
接線と
x
軸の交点 (0.84895321..., 0)
x
2= 0.84895321...
12
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 (0.84895321..., 0.37398512...)
x
2= 0.84895321...
接線と
x
軸の交点 (0.97467407..., 0)
x
3= 0.97467407...
13
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
関数上の点 (0.97460407..., 0.052592310...)
x
3= 0.97467407...
接線と
x
軸の交点 (0.99909154..., 0)
x
3= 0.999909154...
14
ニュートン法での収束の判
15
(解そのものが分かっていないから)
今日の授業では次の方法で行ってみる
ある小さな正の数δに対して
)( i
xf
となった時点で計算を終了
ニュートン法では,現在
x
iの誤差(ど
れだけ真の解に近いか)は,正確には分か
らない
-8
-6
-4
-2
0
2
4
6
8
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x
f
(
x
)
幅2δ
)( i
xf
x
iの値がこの範囲に入ったら計算を終了
16
ニュートン法の能力と限界
17
初期近似値
x
0で十分近い
解を指定できれば,収束
が早い.
関数
f
(
x
) が単調でなくて変曲点を持つ
(つまり
f
'(
x
) の符号が変わる)とき
例)上の図の1から開始
2(
f
'(
x
) = 0となる点)が選ばれる
3
y
軸との交点が求まらない
(負の無限大に発散)
収束しない
初期近似値
x
0の選び方
によっては,収束が遅い
ことがある
収束しないこともありえ
(右図)
x
f
(
x
)
0
ニュートン法の注意点
虚数解は求まらない
f (x) = 0 の解が複数あっても,1回に求まる解
は1つだけ
初期近似値 x0
x0 は,コンピュータでなく,人間が決める
x0 の値によっては,収束しないこともありえる
x0 の値によって,求まる解が変わってくる(f (x) =
0 が複数の解を持つ場合)
求まる解は近似解
18
例題1.ニュートン法のプログラム
f(x)=x2 2 をニュートン法で解くプログラム
19
#include "stdio.h"
#include <math.h>
/* f(x) */
double f(double x)
{
return pow(x,2) -2;
}
/* f(x)の導関数 */
double g(double x)
{
return 2 * x;
}
int main()
{
double x;
double new_x;
double delta;
int i;
int ch;
/* 初期値 */
x = 10;
/* 収束判定のための delta */
delta = 0.000001;
printf("繰り返し回数\tnew_x\t\tf(x)\t\tg(x)\n");
/* for ... になっているのは 100 回繰り返しても収束しなかったら計算を終わりたいから */
for(i = 0 ; i < 100 ; i++) {
new_x = x - f(x) / g(x);
printf("%2d\t\t%lf\t%lf\t%lf\n",i,new_x,f(x),g(x));
/* fabs double の変数について絶対値を求める関数 */
if( fabs(f(new_x)) < delta ) {
printf( "収束した\n" );
printf( "解は %lf\n", new_x);
break;
}
x = new_x;
}
printf( "Enter キーを1,2回押してください. プログラムを終了します\n");
ch = getchar();
ch = getchar();
return 0;
} 20
収束したかの判定を
行っている部分
反復公式
実行結果の例
21
台形則による数値積分
22
定積分
区間 [a, b] で,連続関数 f, x, x=a, x=b
囲まれた面積
23
f(x)
ab
x
定積分:
区間 [a, b] の小区間への分割
n 個の等間隔な小区間に分割
幅: h = (b-a) / n
小区間: [x0, x1], [x1, x2], ..., [xn-1, xn]
但し,x0 = a, xi = x0 + i × h
24
f(x)
x0= a xn= b
x
x1
x2xn-1
小台形
小台形の面積は
25
f(x)
x0= a xn= b
x
xixi+1
小台形
f(xi)f(xi+
1)
))()((
21
ii xfxf
h
台形則 trapezoidal rule
小台形の面積の和は
定積分 I を,この和 Sn で近似 台形則とい
26
f(x)
x0= a xn= b
x
))()((
21
1
0
ii
n
i
nxfxf
h
S
x1
x2xn-1
x3xn-2
台形則
両端 x0 = a xn = b を除いて,f(xi) 2度出
27
)()(
21
1
0
ii
n
i
nxfxf
h
S
)())()((2)(
2110 nn xfxfxfxf
h
但し h = (b - a) / n
2回現れる部分
)(
2
1
)()(
2
11
1
0n
n
iixfxfxfh
)(
2
1
)()(
2
11
1
bfihafafh n
i
台形則による数値積分
区間[ab]を n 等分 (1区間の幅h=(b-a)/n)
n 個の台形を考え, その面積の和 Sn で,定積分 I
を近似
f(x) が連続関数のときは,n を無限大に近づければ,
Sn I に近づく
但し,単純に「n を大きくすればよい」とは言え
ない
n を大きくすると 計算時間の問題,丸め誤差の問
題が発生
28
n
n
ii
n
i
nSxfxf
h
I
lim))()((
2
lim 1
1
0