python - 给定区间使用牛顿法求根
问题描述
我可以使用牛顿法通过从新的 x 值中减去旧的 x 值并检查收敛标准来计算函数的根。当给定一个封闭的间隔时,有没有办法做到这一点,例如
给定一个函数和区间 [a,b] = [0.1, 3.0],收敛标准将通过检查 [3.0 - 0.1] < 0.000001,即 [ba] < 0.000001 来计算。
我提供的代码是使用 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)
解决方案
听起来更像是通过将间隔减半来近似根。这是我使用 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
推荐阅读
- algorithm - 在大词流中查找前 K 个常用词
- haskell - Haskell 班次列表
- javascript - 在过滤列表和未过滤列表之间切换
- javascript - 向父窗口中的变量添加数字
- python - 找到不在区间列表中的最小数字
- c# - 从另一个程序集调用函数时出现 FatalExecutionEngineError
- javascript - 将颜色更改为单击的元素
- javascript - VusJS DOM 更新,当从下拉列表中选择一个新值时
- ruby-on-rails-4 - Icalendar ICS Rails:如何在没有订阅的情况下直接将事件发送到我的日历
- regex - 正则表达式给出额外的匹配组