帮助编写代码。我在做什么错了?
我的目标是通过一种精确度为ξ = 10^-5f(x)
(或ε = 0.00001
)的迭代方法来找到方程的根。
等式:2.056x^43+3x^31+4x^12+x^8-3,478 = 0
。
代码:
# -*- coding: utf-8 -*-
import math
#Definition of function
def phi (x):
return 2.056*(x**43)+3*(x**31)+4*(x**12)+(x**8)-3.478
#Recursive search function
def findRoot (f, x, q, epsilon):
fx=f(x)
#Checking the ending condition
if (1 / (1-q) * abs (fx-x) <epsilon):
print 'Root value', fx
print '1 / (1-q) * abs (fx-x)=', 1 / (1-q) * abs (fx-x)
else:
print 'Current approximation', fx
print '1 / (1-q) * abs (fx-x)=', 1 / (1-q) * abs(fx-x)
findRoot (f, fx, q, epsilon)
findRoot(phi, 0.5, 0.5, 0.00001)
执行
Current approximation -3.4731171861
1 / (1-q) * abs (fx-x)= 7.94623437221
Current approximation -3.66403074312e+23
1 / (1-q) * abs (fx-x)= 7.32806148624e+23
Traceback (most recent call last):
File "Zavd1f.py", line 17, in <module>
findRoot(phi, 0.5, 0.5, 0.00001)
File "Zavd1f.py", line 16, in findRoot
findRoot (f, fx, q, epsilon)
File "Zavd1f.py", line 16, in findRoot
findRoot (f, fx, q, epsilon)
File "Zavd1f.py", line 8, in findRoot
fx=f(x)
File "Zavd1f.py", line 5, in phi
return 2.056*(x**43)+3*(x**31)+4*(x**12)+(x**8)-3.478
OverflowError: (34, 'Numerical result out of range')
答案 0 :(得分:0)
此迭代方法只是简单地重复应用函数值作为参数。仅当您的初始猜测在收敛范围内时,此方法才有效。你不是。您需要实现一种算法,该算法在每次迭代时都会获取 closer 。
当前算法的初始猜测值为0.5;升到高幂(8足够高)接近0,所以我们得到的结果非常接近常数项。
f(0.5) => -3.47...
f(-3.47) => -3.66...e+23 (really big)
f(really_big) => out of bounds
所以...这是您的起始值,您的算法或该算法的实现。
我稍微玩了一下您的代码;我认为,您可能正在尝试实现对分算法(从q = 0.5开始)或牛顿方法。无论哪种情况,您都忽略了编写下一个猜测的代码。
您只需使用f(x)作为根的下一个猜测,即x
值。这是不正确的。您需要记住,这是一个y
值;您可以使用它计算更好地猜测下一个x
值。 f(x)
本身并不是下一个猜测。
由于您没有发布算法,所以我不确定该错误(两次您硬编码过三次的表达式)与迭代过程之间的关系。