2

間隔を指定して関数のルートを取得するために、Python(組み込みのメソッドではない)の補間メソッドを使用しようとしています。

私は次のことをしましたが、どこが間違っているのかわかりません。二分法でそれを行いましたが、唯一の違いはテストポイントです。

x1とx2は区間の両端であり、fは関数であり、イプシロンは許容誤差です。

def interpolation (x1,x2,f,epsilon):
 i = 1
 n = 100
 while i<n:
    m =  (f(x2)- f(x1))/(x2-x1)
    b = f(x2) - m*(x2) 
    p = b
    print (i,p,f(p))
    if f(p) == 0 or b< epsilon:
        print ('The root is at ',p,'after',i,'iterations')
        break
    i+= 1
    if f(x1)*f(p) > 0:           #Equal signs
        x1 = p
    else:
        x2 = p

これをf=sin(x ^ 2)で実行すると、次のように振動する100回の反復が返されます。

コード

  (80, 1.3266674970489443, 0.98214554271216425)
  (81, 1.4900968376899661, 0.79633049173817871)
  (82, 1.3266674970489443, 0.98214554271216425)
  (83, 1.4900968376899661, 0.79633049173817871) 
4

2 に答える 2

0

実際に問題を解決したい場合 (演習用のソリューションを開発するのではなく)、既製のモジュールを使用することをお勧めします。

私の最初の選択肢はscipy.optimize.bisect()docs

このモジュールには、Newton-Raphson などの他のメソッドもあります。

于 2012-11-20T18:44:14.150 に答える