写一段二分法求解单峰函数最小值问题的代码并绘制寻优过程
时间: 2024-10-04 15:01:49 浏览: 26
C++实现二分法求连续一元函数根
当然可以。二分法是一种常用的数值搜索算法,用于在有序区间内查找最小值。对于单峰函数,我们假设它有一个唯一的全局最小点。以下是使用Python实现的一个简单例子:
```python
import numpy as np
import matplotlib.pyplot as plt
# 假设有一个一维单峰函数f(x)
def f(x):
return x**2 - 4*x + 3
# 二分查找函数
def binary_search(func, lower_bound, upper_bound, tolerance=1e-6):
while abs(upper_bound - lower_bound) > tolerance:
mid = (lower_bound + upper_bound) / 2
if func(mid) < func(lower_bound): # 如果中间值更小,更新下界
upper_bound = mid
else: # 否则,更新上界
lower_bound = mid
return lower_bound
# 定义初始区间
x_min_initial = 0
x_max_initial = 5
# 使用二分法找到最小值
x_min = binary_search(f, x_min_initial, x_max_initial)
# 绘制函数和寻优过程
x_values = np.linspace(x_min_initial, x_max_initial, 1000)
y_values = f(x_values)
plt.plot(x_values, y_values, label='Function')
plt.scatter([x_min], [f(x_min)], color='red', label='Minimum')
# 迭代二分过程,画出每个迭代的搜索范围
binary_range = [(x_min_initial, x_max_initial)]
for i in range(5): # 只显示前5次迭代简化展示
x_min = binary_search(f, binary_range[-1][0], binary_range[-1][1])
plt.axvline(x=x_min, color='blue', linestyle='dashed', alpha=0.5)
binary_range.append((binary_range[-1][0], x_min))
plt.annotate(f"Step {i+1}: [{binary_range[i]}-{binary_range[i+1]}]", xy=(x_min, f(x_min)), xytext=(-30, 30), textcoords="offset points", ha="right")
plt.legend()
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Binary Search for Minimum of a Single Peak Function')
plt.grid(True)
plt.show()
阅读全文