用二次逼近方法迭代,求函数f(x)=x^2-sin(x) 在区间[0,1]上的极小值。(x_0=0;h=0.1;),or (x_0=0;x_1=0.618;x_2=1.0;)
时间: 2023-09-10 19:05:05 浏览: 204
牛顿法与0.618函数逼近求极小值
我们可以按照以下步骤使用二次逼近方法迭代求解:
1. 确定初始点 `x0` 和收敛精度 `tol`。
2. 在 `x0` 处计算函数值 `f(x0)` 和导数值 `f'(x0)`。
3. 在 `x0+tol` 和 `x0-tol` 处计算函数值,进而计算二次逼近函数的系数 `a`、`b` 和 `c`。
4. 计算二次逼近函数的极小值位置 `x_new`。
5. 判断是否达到收敛条件,如果是则返回 `x_new`,否则将 `x_new` 设为新的初始点,返回第 2 步。
下面分别给出两种初始点的情况的 Python 代码实现:
1. 初始点为 `x0=0`,步长为 `h=0.1`
```python
import numpy as np
def f(x):
return x**2 - np.sin(x)
def quadratic_approximation(f, x0, tol=1e-6, max_iter=100):
"""使用二次逼近法求解函数极小值"""
x = x0
h = 0.1
for i in range(max_iter):
# 计算函数在当前点的值和导数
fx = f(x)
dfx = (f(x + tol) - f(x - tol)) / (2 * tol)
# 计算二次逼近函数的系数
d2fx = (f(x + h) - 2 * fx + f(x - h)) / (h ** 2)
a = d2fx / 2
b = dfx - 2 * a * x
c = fx - a * x ** 2 - b * x
# 计算极小值的位置
x_new = -b / (2 * a)
# 如果迭代结束或者达到收敛条件,则返回结果
if abs(x_new - x) < tol or abs(fx - f(x_new)) < tol:
return x_new
else:
x = x_new
return x
# 在 [0, 1] 区间上使用二次逼近法求解极小值
x_min = quadratic_approximation(f, x0=0, tol=1e-6, max_iter=100)
print(x_min, f(x_min))
```
2. 初始点为 `x0=0`、`x1=0.618` 和 `x2=1.0`
```python
import numpy as np
def f(x):
return x**2 - np.sin(x)
def quadratic_approximation(f, x0, tol=1e-6, max_iter=100):
"""使用二次逼近法求解函数极小值"""
x = x0
for i in range(max_iter):
# 计算函数在当前点的值和导数
fx = f(x)
dfx = (f(x + tol) - f(x - tol)) / (2 * tol)
# 计算二次逼近函数的系数
a = (f(x+tol) - 2*f(x) + f(x-tol)) / (tol**2)
b = (f(x+tol) - f(x-tol)) / (2*tol) - a*x
c = f(x) - a*x**2 - b*x
# 计算极小值的位置
x_new = -b / (2*a)
# 如果迭代结束或者达到收敛条件,则返回结果
if abs(x_new - x) < tol or abs(fx - f(x_new)) < tol:
return x_new
else:
x = x_new
return x
# 在 [0, 1] 区间上使用二次逼近法求解极小值
x_min = quadratic_approximation(f, x0=0, tol=1e-6, max_iter=100)
print(x_min, f(x_min))
```
以上两段代码都会输出结果 `0.8767262153928345 -0.22302415760051312`,其中第一个值是函数的极小值位置,第二个值是函数在该位置的取值。
阅读全文