帮助编写代码。我做错了什么?
我的目标是通过精确的迭代方法找到方程的根:ξ = 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')发布于 2019-06-11 15:49:43
这种迭代方法简单地重复应用函数值作为参数。这只有当你最初的猜测是在收敛半径之内时才能起作用。你的不是。您需要实现一个与每次迭代更接近的算法。
目前的算法最初猜测为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)本身并不是下一个猜测。
由于您没有发布算法,我不确定错误的两倍(您硬编码三次的表达式)应该如何与迭代过程相关。
https://stackoverflow.com/questions/56546943
复制相似问题