我试图在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)
答案 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等。