###前提・実現したいこと
ニュートン法でf(x)=10sinx+e^xの近似解とそのときの反復回数を求めたいのですが、コードを2つ作ったところ近似値が変わりました。なぜ値が変わってしまうのか教えて頂きたいです。ちなみに初期値 x0 = 1 、許容誤差 ε = 1e − 12 、最大反復回数 M = 50 回としています。
解のみ求めるコード
#解きたい方程式 #Newton法による非線型方程式の解法プログラム import numpy as np #NumPyライブラリ import math #解きたい方程式 def func_f(x): return 10*math.sin(x)+math.exp(x) #Newton法(方程式の関数項、探索の開始点、微小量、誤差範囲、最大反復回数) def newton(func_f, x0, eps=1e-12, error=1e-12, max_loop=50): num_calc = 0 #計算回数 print("{:3d}: x = {:.12e}".format(num_calc, x0)) #ずっと繰り返す while(True): #中心差分による微分値 func_df = (func_f(x0 +eps) -func_f(x0 -eps))/(2*eps) if(abs(func_df) <= eps): #傾きが0に近ければ止める print("error: abs(func_df) is too small (<=", eps, ").") quit() #次の解を計算 x1 = x0 -func_f(x0)/func_df num_calc += 1 #計算回数を数える print("{:3d}: x = {:.12e}".format(num_calc, x0)) #「誤差範囲が一定値以下」または「計算回数が一定値以上」ならば終了 if(abs(x1-x0)<=error or max_loop<=num_calc): break #解を更新 x0 = x1 #最終的に得られた解 print("x = {:.12e}".format(x0)) return x0 #メイン実行部 if (__name__ == '__main__'): #Newton法で非線型方程式の解を計算 solution = newton(func_f, -2.0)
これを実行すると次のようになります。
0: x = -2.000000000000e+00 1: x = -2.000000000000e+00 2: x = -4.224885263350e+00 3: x = -2.329896738224e+00 4: x = -3.384585017739e+00 5: x = -3.132348988175e+00 6: x = -3.137252161084e+00 7: x = -3.137252451638e+00 8: x = -3.137252451663e+00 x = -3.137252451663e+00
解と試行回数を求めるコード
import matplotlib.pyplot as plt import numpy as np import math initialValue = float(1) # 初期値 eps = 1e-12 # 微小な数 attemptLimits = 50 # 最大試行回数 # 解を求める関数 def targetFunc(x): return 10*math.sin(x)+math.exp(x) # 導関数 def derivative(x): return 10*math.cos(x)+math.exp(x) def newtonMethod(a, min): for i in range(attemptLimits): # 漸化式 ah = a - targetFunc(a)/derivative(a) # 収束条件 if abs(a - ah) < min:break # 近似解の更新 a = ah return a, i def main(): a, i = newtonMethod(initialValue, min) print("解:",'{:.12e}'.format(a) ,"試行回数:", i+1) if __name__ == '__main__': main()
これを実行すると次のようになります。
解: -9.137820247766e-02 試行回数: 4
と値が変わってしまいます。自分ではどこを間違えているのかわからなかったので質問させて頂きました。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 05:19
2020/05/26 05:31
2020/05/26 06:01