📌 目录
- 模块简介
- 函数最小化(
minimize
) - 约束与边界条件
- 曲线拟合(
curve_fit
) - 根查找(非线性方程组)
- 示例:非线性曲线拟合与成本优化
- 出站链接与参考资料
1. 模块简介
scipy.optimize
模块提供多种优化算法,用于:
- 单变量与多变量函数的最小化
- 有约束或无约束的优化问题
- 非线性曲线拟合
- 非线性方程组求解
常用函数包括:
minimize()
:最小化目标函数curve_fit()
:非线性最小二乘拟合root()
:求解非线性方程组linprog()
:线性规划求解器
2. 函数最小化(minimize
)
from scipy.optimize import minimize
# 目标函数
def f(x):
return x[0]**2 + x[1]**2 + 3*x[0]*x[1]
# 初始猜测
x0 = [1, 2]
result = minimize(f, x0)
print("最小值点:", result.x)
print("最小值:", result.fun)
使用不同方法:
'BFGS'
:拟牛顿法(适用于光滑函数)'Nelder-Mead'
:单纯形法(不需要梯度)'L-BFGS-B'
:带边界的优化
3. 加入约束与边界
bounds = [(0, None), (0, 3)] # x[0] ≥ 0, x[1] ∈ [0, 3]
# 非线性约束
def constraint(x):
return x[0] + x[1] - 2
cons = {'type': 'ineq', 'fun': constraint}
result = minimize(f, x0, method='SLSQP', bounds=bounds, constraints=cons)
print("约束解:", result.x)
4. 曲线拟合(curve_fit
)
用于通过样本数据拟合某个模型函数。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 模型函数
def model(x, a, b):
return a * np.exp(b * x)
# 生成数据
xdata = np.linspace(0, 4, 50)
ydata = model(xdata, 2.5, -1.3) + 0.2 * np.random.normal(size=50)
# 拟合
popt, pcov = curve_fit(model, xdata, ydata)
print("拟合参数:", popt)
# 可视化
plt.scatter(xdata, ydata, label="数据")
plt.plot(xdata, model(xdata, *popt), 'r-', label="拟合曲线")
plt.legend()
plt.title("非线性曲线拟合")
plt.show()
5. 根查找(非线性方程组)
from scipy.optimize import root
def equations(x):
return [x[0] + 2 * x[1] - 2,
x[0]**2 + x[1]**2 - 1]
sol = root(equations, [0, 0])
print("方程组解:", sol.x)
6. 示例:成本最小化问题
def cost(x):
prod1, prod2 = x
return 5*prod1 + 8*prod2
# 约束:资源限制
cons = ({
'type': 'ineq',
'fun': lambda x: 100 - (2*x[0] + 3*x[1]) # 原料限制
}, {
'type': 'ineq',
'fun': lambda x: x[0] - 5 # 至少生产5单位产品1
})
bounds = [(0, None), (0, None)]
res = minimize(cost, [1, 1], method='SLSQP', bounds=bounds, constraints=cons)
print("最优生产组合:", res.x)
🔗 出站链接与参考资料
📘 官方文档
scipy.optimize
官方手册:
https://docs.scipy.org/doc/scipy/reference/optimize.html
📚 实用教程与资源
- Python Optimization 教程(全面):
https://realpython.com/python-optimize/ - 曲线拟合示例详解(SciPy 官方):
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
发表回复