用逐次抛物插值搜索求函数在某区间上的极小值,并记录步数。代码
时间: 2024-02-09 20:10:43 浏览: 129
在python中利用最小二乘拟合二次抛物线函数的方法
逐次抛物插值搜索(Sequential Parabolic Interpolation,SPI)可以用于求函数在某个区间上的极小值。下面是使用逐次抛物插值搜索求函数 $f(x) = x^2+5\sin(x)$ 在 $[0, 5]$ 区间上的极小值的 Python 代码,并记录了迭代的步数:
```python
import numpy as np
def f(x):
return x**2 + 5*np.sin(x)
def sequential_parabolic_interpolation_search(a, b, eps):
x1 = a
x2 = (a + b) / 2
x3 = b
k = 0
while (abs(x3 - x1) > eps):
y1, y2, y3 = f(x1), f(x2), f(x3)
a0 = y1
a1 = (y2 - y1) / (x2 - x1)
a2 = ((y3 - y2) / (x3 - x2) - a1) / (x3 - x1)
x_min = 0.5 * (x1 + x2 - a1 / a2)
y_min = f(x_min)
if (x_min > x2):
if (y_min < y3):
x1 = x2
x2 = x_min
else:
x1 = x_min
x2 = x3
else:
if (y_min < y1):
x3 = x2
x2 = x_min
else:
x3 = x_min
x2 = x1
k += 1
return x_min, y_min, k
x_min, y_min, k = sequential_parabolic_interpolation_search(0, 5, 0.0001)
print("最小值 x =", x_min)
print("最小值 y =", y_min)
print("迭代步数 k =", k)
```
其中,`a` 和 `b` 是区间的左右端点,`eps` 是误差容限。算法不断缩小区间,直到误差小于容限。在每一步中,根据当前的三个点,用二次插值公式计算极小值点,然后将区间缩小到包含极小值点的一侧。
阅读全文