Files
CalWay_Python/按方法整理/非线性方程-抛物线法.py
2025-06-16 20:44:29 +08:00

66 lines
1.7 KiB
Python

import math
#抛物线法解方程
def MullerSolve(fx,x0,x1,x2,err1,err2,N):
count = 0
f0 = fx(x0)
f1 = fx(x1)
f2 = fx(x2)
q = (x2 - x1) / (x1 - x0)
p = 0
a = 0
b = 0
c = 0
while True:
p = (x2 - x0) / (x1 - x0)
a = q**2 * f0 - q*p*f1 + q*f2
b = q**2 *f0 - p**2 *f1 + (p + q)*f2
c = p*f2
h1 = 0
if b < 0:
h1 = -2 * c / (b - (b**2 - 4*a*c)**0.5)
else:
h1 = -2 * c / (b + (b**2 - 4*a*c)**0.5)
x3 = x2 + h1 * (x2 - x1)
f3 = fx(x3)
print(f"k={count}: x{count}={x0:.5}, f(x{count})={f0:.5}; x{count+1}={x1:.5}, f(x{count+1})={f1:.5}; x{count+2}={x2:.5}, f(x{count+2})={f2:.5}; x{count+3}={x3:.5}, f(x{count+3})={f3:.5}")
print(f"p={p:.5}, q={q:.5}, a={a:.5}, b={b:.5}, c={c:.5}, h={h1:.5}")
k = err1 + 1
if abs(f3) < 1:
k = abs(x3 - x2)
else:
k = abs(x3 - x2) / abs(f3)
if abs(f3) < err2 or k < err1:
return x3, 1
count += 1
if count > N:
return None, 0
x0 = x1
x1 = x2
x2 = x3
f0 = f1
f1 = f2
f2 = f3
q = h1
if __name__ == "__main__":
err1 = 1e-5 # 精度要求 P152
err2 = 1e-5 # 精度要求 P152
N = 100 # 最大迭代次数
x0 = 0.3 # 初始值1
x1 = 0.5 # 初始值2
x2 = 0.4 # 初始值3
fx = lambda x: 8*x**4 - 8*x**2 + 1 #原函数
result, status = MullerSolve(fx, x0, x1, x2, err1, err2, N)
if status == 1:
print(f"fx收敛 解为: {result}")
else:
print("fx不收敛")