Newton's method

home

Newton's method

logx + x = 3 の解を求めます。


#!/usr/bin/perl
#
# 
# logx + x = 3 の解の近似値を求める
# 求める解は y = logxと y = -x + 3 の交点だから1つである。
# 
# f(x) = logx + x -3とすると、f(2) = log2 -1 < 0, f(3) = log3 > 0 だから解は開区間(2,3)に存在する。
# 閉区間[2,3]でf'(x) = 1/x + 1 > 0, f"(x) = -1/x^2 < 0だから a_1= 2の値から近似値を計算する。
#
# # f(x)上の点p1(a_1,f(a_1))における接線の方程式は y = f'(a_1)(x- a_1) + f(a_1)
# x軸との交点はp2はy = 0 として、p2(a_1 - f(a_1)/f'(a_1)),0)となる。
# 一般に、a_n+1 = a_n - f(a_n)/f'(a_n)
# 数列{a_n}は増加数列で上に有界で極限値αが存在する。
#
#
#

use feature ':5.16';
use autodie;

my %a;   #キャッシュとして第n項の値を保持

say "f(x) = logx + x -3としてニュートン法で近似値を計算します。";

for (my $i = 1; $i < 100; $i++) {
	#
	#  任意のε>0に対し、|f(x_n)| < ε を条件にforループを抜けることも可能。 
	#
	say "n = $i","-----a[$i]=",results($i);
}

sub results {
	my $n = shift;
	
	# n =1 ならば a_1 =2
	if ($n == 1) {
		$a{$n} = $n * 2;
			return $n * 2;
	}
	
	# 第n -1 項の値が存在するなら第n項の値を求める。
	if(exists $a{$n - 1}) {
		$a{$n} = $a{$n - 1} - (log($a{$n - 1}) + $a{$n - 1} -3) / ((1 + $a{$n - 1}) + 1);
		return $a{$n};
	}	
}

実行結果は以下のようになりました。


f(x) = logx + x -3としてニュートン法で近似値を計算します。
n = 1-----a[1]=2
n = 2-----a[2]=2.07671320486001
n = 3-----a[3]=2.12393270045401
n = 4-----a[4]=2.15370958840858
n = 5-----a[5]=2.17275248598871
n = 6-----a[6]=2.1850351995409
n = 7-----a[7]=2.19299997422553
n = 8-----a[8]=2.19818231818579
n = 9-----a[9]=2.20156160971917
n = 10-----a[10]=2.20376827952032
n = 11-----a[11]=2.20521055003736
n = 12-----a[12]=2.20615377464645
n = 13-----a[13]=2.20677087036749
n = 14-----a[14]=2.20717470202319
n = 15-----a[15]=2.20743901614611
n = 16-----a[16]=2.20761203267507
n = 17-----a[17]=2.20772529506341
n = 18-----a[18]=2.20779944385106
n = 19-----a[19]=2.20784798785879
n = 20-----a[20]=2.20787976946668
n = 21-----a[21]=2.20790057705628
n = 22-----a[22]=2.20791420001356
n = 23-----a[23]=2.20792311916313
n = 24-----a[24]=2.20792895868232
n = 25-----a[25]=2.20793278192421
n = 26-----a[26]=2.20793528507576
n = 27-----a[27]=2.20793692393992
n = 28-----a[28]=2.20793799693829
n = 29-----a[29]=2.2079386994529
n = 30-----a[30]=2.20793915940413
n = 31-----a[31]=2.20793946054403
n = 32-----a[32]=2.20793965770677
n = 33-----a[33]=2.20793978679345
n = 34-----a[34]=2.20793987130928
n = 35-----a[35]=2.20793992664362
n = 36-----a[36]=2.2079399628722
n = 37-----a[37]=2.20793998659183
n = 38-----a[38]=2.20794000212159
n = 39-----a[39]=2.20794001228926
n = 40-----a[40]=2.20794001894625
n = 41-----a[41]=2.20794002330472
n = 42-----a[42]=2.20794002615831
n = 43-----a[43]=2.20794002802662
n = 44-----a[44]=2.20794002924984
n = 45-----a[45]=2.20794003005071
n = 46-----a[46]=2.20794003057505
n = 47-----a[47]=2.20794003091835
n = 48-----a[48]=2.20794003114312
n = 49-----a[49]=2.20794003129028
n = 50-----a[50]=2.20794003138663
n = 51-----a[51]=2.20794003144971
n = 52-----a[52]=2.20794003149101
n = 53-----a[53]=2.20794003151805
n = 54-----a[54]=2.20794003153575
n = 55-----a[55]=2.20794003154734
n = 56-----a[56]=2.20794003155493
n = 57-----a[57]=2.2079400315599
n = 58-----a[58]=2.20794003156315
n = 59-----a[59]=2.20794003156528
n = 60-----a[60]=2.20794003156668
n = 61-----a[61]=2.20794003156759
n = 62-----a[62]=2.20794003156819
n = 63-----a[63]=2.20794003156858
n = 64-----a[64]=2.20794003156884
n = 65-----a[65]=2.207940031569
n = 66-----a[66]=2.20794003156911
n = 67-----a[67]=2.20794003156919
n = 68-----a[68]=2.20794003156923
n = 69-----a[69]=2.20794003156926
n = 70-----a[70]=2.20794003156928
n = 71-----a[71]=2.2079400315693
n = 72-----a[72]=2.20794003156931
n = 73-----a[73]=2.20794003156931
n = 74-----a[74]=2.20794003156932
n = 75-----a[75]=2.20794003156932
n = 76-----a[76]=2.20794003156932
n = 77-----a[77]=2.20794003156932
n = 78-----a[78]=2.20794003156932
n = 79-----a[79]=2.20794003156932
n = 80-----a[80]=2.20794003156932
n = 81-----a[81]=2.20794003156932
n = 82-----a[82]=2.20794003156932
n = 83-----a[83]=2.20794003156932
n = 84-----a[84]=2.20794003156932
n = 85-----a[85]=2.20794003156932
n = 86-----a[86]=2.20794003156932
n = 87-----a[87]=2.20794003156932
n = 88-----a[88]=2.20794003156932
n = 89-----a[89]=2.20794003156932
n = 90-----a[90]=2.20794003156932
n = 91-----a[91]=2.20794003156932
n = 92-----a[92]=2.20794003156932
n = 93-----a[93]=2.20794003156932
n = 94-----a[94]=2.20794003156932
n = 95-----a[95]=2.20794003156932
n = 96-----a[96]=2.20794003156932
n = 97-----a[97]=2.20794003156932
n = 98-----a[98]=2.20794003156932
n = 99-----a[99]=2.20794003156932