まず、によって定義された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:ここでは擬似コード
あなたの質問は何ですか?問題やエラーはありますか? – eyllanesc
戻り値を使用すると、関数内で次の行は実行されません。 – eyllanesc
愚かな戻り値を使用すると、sec secantコードが次のように縮小されます。def secant(x0:float、x1:float、f、epsilon:float、 fx0 = f(x1) fx0 = f(x0) fx1 = f(x1) リターン0、x0、fx0' – eyllanesc