Python插值错误

时间:2012-11-20 18:25:52

标签: python interpolation

我试图在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) 

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:0)

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

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

这个模块也有其他方法,比如Newton-Raphson等。

相关问题