【问题标题】:Finding The Root Using Newtons Method Given A Certain Interval给定区间使用牛顿法求根
【发布时间】:2019-11-12 10:46:17
【问题描述】:

我可以使用牛顿法计算函数的根,方法是从新的 x 值中减去旧的 x 值并检查收敛标准。给定一个封闭区间时有没有办法做到这一点,例如

给定一个函数和区间 [a,b] = [0.1, 3.0],将通过检查 [3.0 - 0.1]

我提供的代码是使用 x 值计算收敛标准。我试图弄清楚是否有一种方法可以使用区间而不是 x 值。

from math import *

x = 1.0 #initial value

for j in range(1, 101):
    xnew = (x**2 + cos(x)**2 -4*x)/(2*(x - cos(x)*sin(x) -2))

    if abs(xnew - x) < 0.000001:
        break
    x = xnew

print('Root = %0.6f ' % xnew)
print('Number of iterations = %d' % j)

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow! :-) 这似乎是一个数学问题,而不是一个编码问题。如果您了解数学并且正在努力将其转换为代码,那么您能否发布更多关于您试图将其转换为 python 程序的数学?如果您不了解数学,那么这不是 SO 的主题,但您可以通过 math.stackexchange 询问!

标签: python newtons-method


【解决方案1】:

听起来更像是通过将间隔减半来近似根。这是我使用 sympy 为不同功能进行模块化的一种方法(尽管希望您仍然会发现它很有用):

def halving_the_interval(f_x, interval, i):

    v1 = f_x.evalf(subs={x : interval[0]})
    v2 = f_x.evalf(subs={x : interval[1]})

    # half of interval
    half = (interval[0] + interval[1]) / float(2)

    # f_(half)
    v3 = f_x.evalf(subs={x: half})

    if (abs(interval[1] - interval[0]) > 0.000001):
        # check intervals for where root lies
        # recursive step on new interval, update iterations
        if (v1 < 0 and v3 > 0):
            halving_the_interval(f_x, [interval[0],half], i+1)
        else:
            halving_the_interval(f_x, [half, interval[1]], i+1)
    else:
        print ("Root =  %0.6f " % half)
        print ("Number of iterations = %d" % i)

halving_the_interval(x**2 - 2, [1,2], 0)

使用函数x^2 - 2 = 0 进行测试应该在 sqrt(2) 处找到根,即。 ~1.41。

$ halving_the_interval(x**2 - 2, [1,2], 0)

根 = 1.414214

迭代次数 = 20

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2014-03-07
    • 2015-07-28
    • 2020-03-06
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多