2017-09-27 8 views
-1
私はこの割り当てに取り組んでいます

は、Pythonへの擬似コード(割線メソッド)を翻訳

まず、によって定義されたF関数を実装:F(X)= EXP(X)-sin(x)が最も近いですゼロ。

第二に、入力が与えられると、ページ95上の割線の方法を実装し、F関数の根を見つけるためにそれを使用するには、X0 = -3.5とX1 = -2.5

値の追加次
- 絶対テスト:abs(x^k-x^{k-1})/ abs(x^{k})\ leqデルタ
- 反復ガード:k < iter_max

各反復では、現在のルートと現在のf値の値である反復番号kを出力します。 20桁の浮動小数点数を出力します。

これは私が完了する必要がコードです:

import numpy as np 
from math import exp, sin 
import matplotlib.pyplot as plt 

def f(x: float) -> float: 
    return 

def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float: 
    return 

これは、95ページからの擬似コードです:

input: x_0, x_1, delta, epsilon, iter_max 
fx_0 <- f(x_0); fx_1 <- f(x_1) 
output: 0, x_0, fx_0 
output: 1, x_1, fx_1 
for k = 2 to iter_max do 
    if |fx_0| > |fx_1| then 
     x_0 <-> x_1; fx_0 <-> fx_1 
    end if 
    s <- (x_1 - x_0)/(fx_1 - fx_0) 
    x_1 <- x_0 
    fx_1 <- fx_0 
    x_0 <- x_0 - fx_0 * s 
    fx_0 <- f(x_0) 

    output: k, x_0, fx_0 
    if |fx_0| < epsilon or |x_1 - x_0| < delta then stop 
end do 

そして、これは私自身の試みです:

def f(x: float) -> float: 
    return exp(x) - sin(x) == 0 

def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float: 
    fx0 = f(x0) 
    fx1 = f(x1) 
    return 0, x0, fx0 
    return 1, x1, fx1 

    for k in range(2, iter_max): 
     if abs(fx0) > abs(fx1): 
      x0 = x1 
      x1 = x0 
      fx0 = fx1 
      fx1 = fx0 

      s = (x1 - x0)/(fx1 - fx0) 
      x1 = x0 
      fx1 = fx0 
      x0 = x0 - fx0 * s 
      fx0 = f(x0) 

     return k, x0, fx0 

     if abs(fx0) < epsilon or abs(x**k - x**(k - 1))/ abs(x**(k)) <= delta: 
      break 

コードに従うと

root = secant(-3.5, -2.5, f, 0.00000000001, 0.000001, 10) 
print(root) 

私は(0、-3.5、False)を取得します。実際には何の反復もしません。どうすれば修正できますか?

編集:A = X_0、B = X_1とM = iter_max:ここでは擬似コード enter image description here


写真。 enter image description here

+1

あなたの質問は何ですか?問題やエラーはありますか? – eyllanesc

+2

戻り値を使用すると、関数内で次の行は実行されません。 – eyllanesc

+0

愚かな戻り値を使用すると、sec secantコードが次のように縮小されます。def secant(x0:float、x1:float、f、epsilon:float、 fx0 = f(x1) fx0 = f(x0) fx1 = f(x1) リターン0、x0、fx0' – eyllanesc

答えて

1

あなたの実装は以下のエラーがあります:
私はこのようなものにするために出力をしたいと思い

  • 最初は、関数fは関数の値を返さなければならないということであるから、あなたルートを取得したい場合は、ゼロと比較しないでください。

  • それが言う場合は、2番目のエラーは、アルゴリズムの目的を読み、その手順を理解していないことが原因で発生します


output: 0, x_0, fx_0 
output: 1, x_1, fx_1 

はiter_maxがあるとき、それは結果であることを示していますそれぞれ0または1である。値を交換する形で

  • 第三には、不十分であるそうでない場合は、あなたが次のことを実行するので、私は理解していないもう一つは、関連する情報に

  • を消去するので、あなたはピボットを使用する必要があります:abs(x**k - x**(k - 1))/ abs(x**(k))の代わりに、 abs(x1 - x0)

ですから、次のコードを取得し、両方の誤りを訂正:

def f(x: float) -> float: 
    return exp(x) - sin(x) 

def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float: 
    fx0 = f(x0) 
    fx1 = f(x1) 
    if iter_max == 0: 
     return 0, x0, fx0 

    elif iter_max == 1: 
     return 1, x1, fx1 

    for k in range(2, iter_max): 
     if abs(fx0) > abs(fx1): 
      tmp = x0 
      x0 = x1 
      x1 =tmp 
      tmp = fx0 
      fx0 = fx1 
      fx1 = tmp 

     s = (x1 - x0)/(fx1 - fx0) 
     x1 = x0 
     fx1 = fx0 
     x0 = x0 - fx0 * s 
     fx0 = f(x0) 
     if abs(fx0) < epsilon or abs(x1 - x0) <= delta: 
      break 
    return k, x0, fx0 


root = secant(-3.5, -2.5, f, 0.00000000001, 0.000001, 10) 

print(root) 

出力:

(5, -3.183063011933318, 4.7351012000262926e-14) 
+0

ありがとう、これは動作します!現在のルートの値と各反復後の現在のf値をkと表示する必要があります。また、浮動小数点数を20桁で印刷するよう指定するにはどうすればよいですか? – user405381

+0

さて、私はいくつかの考慮事項を今置いていますが、私の答えは正しいとマークしています。 – eyllanesc

+0

次の点を考慮したコードです:https://gist.github.com/eyllanesc/9c10b80dd30eceeb6223a914e1da9270 – eyllanesc