質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2390閲覧

Python3.6 ニュートン法 コードによって値が変わる理由を知りたい

ika_ika

総合スコア7

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/26 03:29

###前提・実現したいこと
ニュートン法で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

と値が変わってしまいます。自分ではどこを間違えているのかわからなかったので質問させて頂きました。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

と値が変わってしまいます。

グラフを描いてみれば明らかなように、この式は無限に解を持ちます。-3.137252451663e+00-9.137820247766e-02も、その解の1つです。

投稿2020/05/26 03:34

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ika_ika

2020/05/26 05:19

ということは条件が同じでも解はランダムに出てくるということですかね。 回答して頂きありがとうございました。
maisumakun

2020/05/26 05:31

特定の解を求めたければ、それを念頭に制御する必要があります。
ika_ika

2020/05/26 06:01

了解しました。 教えて下さりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問