2017-01-22 14 views
-3

ニュートンの方法を使って方程式のルーツを見つけようとしています。これはおそらく非常に明白な間違いですが、私は "TypeError:Relationalの真理値を決定できません"というエラーを受けています。私はインポート/忘れることがありますか?申し訳ありませんが、私は非常にPythonに新しいです。ユーザー定義関数のニュートンメソッド

import sympy 

from sympy import * 
x, y, z = symbols('x y z') 
init_printing(use_unicode=True) 

def newton(f, n, eps): 
    y = f(n) 
    delta = diff(eps, x) 
    while abs(y) > eps: 
     dy = (f(n + delta) - y)/delta 
     n = n - y/dy 
     y = f(n) 
    return n 

def f(n): 
    return 5 * n + 10 

eps = input("input function:") 

print(newton(f, 0, eps)) 
+2

あなたの質問が良いとpythonの基本については、「緊急」とラベル付けする必要はありません。あなたは45ナノ秒で7つの答えを得るでしょう。この日曜日の夕方に良い質問を全人が飢えています:) –

+0

これは今までのことですが問題はありますか?それはエラーを起こすか?正しい結果が得られませんか? – ayhan

+0

'print(newtroot(function、t))'は上記の3つのパラメータを渡しておらず、 'f'の代わりに' function'を渡しています。そして、整数としてキャストされる関数は何ですか? –

答えて

1

あなたのコードでは、ニュートン法を実施していません。最初の推測で接線を推定し、y = 0で代入して新しい推測値を取得し、推測値の関数が0に十分近づくまで続けます。以下のコードを参照してください。

def newton(f, x, eps=1e-50): 
    y = f(x) 
    delta = 1e-10 
    while abs(y) > eps: 
     dy = (f(x+delta) - y)/delta 
     x = x - y/dy 
     y = f(x) 
    return x 

def f(x): 
    return 5 * x + 10 

newton(f, 0) # outputs -2.0 

テキストによるユーザー指定の機能は、簡単に実行できません。私たちが通常行っていることは、上記の関数の数値実装を提供することです。

シンボルレベルで操作したい場合は、文字列を解析してコードに適切な関数を作成する必要がありますが、これは簡単なことではありません。ライブラリが利用できるかどうかを確認したいかもしれません。

実際には、誰かがルートなしの関数でそれを実行する場合に最大反復回数を実装したいと思うかもしれません。

+0

ありがとうございます!ユーザ定義関数の場合、Sympyを使用し、おそらくdiff(func、var)を使用することは賢明ですか? –

+0

ええ、sympyは解析には問題ありません。私は象徴的な差別化をしません。おそらく測定可能な利点はなく、上記のようにdyを計算するのに比べてかなり遅いです。 –

+0

sympyを使って解析的に根を見つけることができます。ニュートンの方法のポイントは、根を素早く数値で見つけることです。 :) –

1

要約:symPyでユーザ定義関数を定式化することができます。その関数はほぼ自動的に導出でき、目的関数とその派生関数の数値関数はlambdifyで取得できます。 lambdify edのPython関数を使うと、記号的評価のために効率を交換しません。また、ニュートン法を含むSciPy最適化パッケージを利用することもできます。

scipy.optimize.minimizeには、ニュートン法があります。目的関数とその派生関数を使ってそれをフィードし、結果を得ることができます。

オリジナルのコードに記号的な数式を使用しても、特定の数式を扱うので意味がありません。 NumPyを使用すると、より良い実行パフォーマンスが得られます。

さまざまな数式に一般的な数学インターフェイスを提供することを考えている場合、その派生機能を楽しむことができるため、SymPyは素晴らしいです。

数ヶ月前、私はSymPyとSciPyの組み合わせで、スプリング接続ボディの物理モデルを演奏しました。

https://github.com/wakita/symdoc/blob/master/kk.ipynb

  • 目的関数の式は、In [9]に記載されています。
  • 目的関数に対応するPython関数がIn [10]で得られます。
  • 目的関数の導関数はIn [14]で得られます。
  • ニュートンベースの最小化はIn [19]で実行されます。目的関数の1次微分と2次微分を利用します。

SymPyを使用することの美しさは、私の例で見てきたように、派生物の複雑な計算を全く混乱させず、SymPyで表現されている数式を扱うことです。

関連する問題