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