python中的简单迭代

时间:2019-06-11 15:21:36

标签: python

帮助编写代码。我在做什么错了?

我的目标是通过一种精确度为ξ = 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')

1 个答案:

答案 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)本身并不是下一个猜测。

由于您没有发布算法,所以我不确定该错误(两次您硬编码过三次的表达式)与迭代过程之间的关系。