逐次抛物插值搜索的代码
时间: 2024-04-13 14:05:43 浏览: 40
以下是逐次抛物插值搜索的 Python 代码实现:
```python
import math
def parabolic_interpolation(func, x1, x2, x3, tol):
"""
参数:
func: 目标函数
x1, x2, x3: 初始搜索点
tol: 相邻两次函数值的差异小于 tol 时停止搜索
"""
# 计算初始的函数值
f1 = func(x1)
f2 = func(x2)
f3 = func(x3)
while True:
# 计算拟合二次函数的系数
c1 = f1
c2 = (f2 - f1) / (x2 - x1)
c3 = ((f3 - f1) / (x3 - x1) - (f2 - f1) / (x2 - x1)) / (x3 - x2)
# 计算极小点
xm = 0.5 * (x1 + x2 - c2 / c3)
# 计算新的函数值
fm = func(xm)
# 计算误差
err = abs(fm - f2)
# 如果误差小于阈值,则停止搜索
if err < tol:
return xm
# 更新搜索点
if xm > x2:
if fm < f2:
x1, x2, x3 = x2, xm, xm + 2 * (xm - x2)
f1, f2, f3 = f2, fm, func(x3)
else:
x1, x2, x3 = x1, x2, xm
f1, f2, f3 = f1, f2, fm
else:
if fm < f2:
x1, x2, x3 = xm + 2 * (xm - x2), xm, x2
f1, f2, f3 = func(x1), fm, f2
else:
x1, x2, x3 = x2, xm, x1 + 2 * (x2 - x1)
f1, f2, f3 = fm, f2, func(x3)
```
其中,参数 `func` 是目标函数,`x1`、`x2`、`x3` 是初始搜索点,`tol` 是相邻两次函数值的差异小于该值时停止搜索。函数返回找到的极小点。