2

我正在尝试使用 python 中的插值方法(不是内置方法)来获取给定间隔的函数的根。

我已经完成了以下操作并且不知道我哪里出错了,我已经通过二分法完成了它,尽管唯一的区别是测试点。

x1 和 x2 是区间的两端,f 是函数,epsilon 是公差

def interpolation (x1,x2,f,epsilon):
 i = 1
 n = 100
 while i<n:
    m =  (f(x2)- f(x1))/(x2-x1)
    b = f(x2) - m*(x2) 
    p = b
    print (i,p,f(p))
    if f(p) == 0 or b< epsilon:
        print ('The root is at ',p,'after',i,'iterations')
        break
    i+= 1
    if f(x1)*f(p) > 0:           #Equal signs
        x1 = p
    else:
        x2 = p

使用 f = sin(x^2) 运行它只会返回 100 次振荡迭代,如下所示:

代码

  (80, 1.3266674970489443, 0.98214554271216425)
  (81, 1.4900968376899661, 0.79633049173817871)
  (82, 1.3266674970489443, 0.98214554271216425)
  (83, 1.4900968376899661, 0.79633049173817871) 
4

2 回答 2

2

看起来您正在尝试使用割线方法解决此问题。插值法需要三个初始值。

我不太确定您使用代码的方向,但我可以对其进行一些调整,如下所示:

i = 1
n = 100
while i<n:
    print x1, x2
    m =  (f(x2)- f(x1))/(x2-x1)
    b = f(x2) - m*(x2) 
    p = -b/m #root for this line

    # are we close enough?
    if abs(f(p)) < epsilon:
        print ('The root is at ',p,'after',i,'iterations')
        break
    i+= 1

    x1 = x2
    x2 = p

根据我的起始位置 1,2,它在 4 次迭代中解决了它:

1 2
2 1.52648748495
1.52648748495 1.75820676726
1.75820676726 1.7754676477
('The root is at ', 1.7724406948343991, 'after', 4, 'iterations')
于 2012-11-20T19:17:13.930 回答
0

如果您真正想要的是解决问题(而不是开发练习解决方案),我建议您使用现成的模块。

我的第一选择是scipy.optimize.bisect()文档

该模块也有其他方法,例如 Newton-Raphson 等。

于 2012-11-20T18:44:14.150 回答