📌 目录
scipy.optimize
模块简介- 函数最小化(
minimize
) - 多变量约束优化
- 求解非线性方程组(
fsolve
) - 最小二乘拟合(
curve_fit
) - 根查找(
root_scalar
,brentq
) - 示例:非线性回归模型拟合
- 出站链接与参考资料
1. scipy.optimize
模块简介
scipy.optimize
提供了大量用于:
- 无约束与有约束的最小化问题求解
- 线性规划问题求解
- 非线性方程系统求根
- 拟合模型参数
- 优化求解器选择与边界控制
2. 函数最小化(minimize
)
用于最小化一个可导或不可导函数:
from scipy.optimize import minimize
# 定义目标函数
def f(x):
return x**2 + 3*x + 2
res = minimize(f, x0=0)
print("最小值点:", res.x)
print("函数值:", res.fun)
常用算法包括:BFGS
, Nelder-Mead
, Powell
, CG
等。
3. 多变量约束优化
# 多变量目标函数
def f(x):
return x[0]**2 + x[1]**2
# 约束条件
cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 1})
res = minimize(f, x0=[0.5, 0.5], constraints=cons)
支持的约束形式包括:
- 等式约束(
type='eq'
) - 不等式约束(
type='ineq'
)
4. 求解非线性方程组(fsolve
)
用于求一组非线性方程的根:
from scipy.optimize import fsolve
def equations(vars):
x, y = vars
return [x**2 + y - 4, x - y**2 + 1]
sol = fsolve(equations, (1, 1))
print("解:", sol)
5. 最小二乘拟合(curve_fit
)
用于参数化模型拟合数据(非线性最小二乘):
from scipy.optimize import curve_fit
import numpy as np
# 生成模拟数据
x = np.linspace(0, 4, 50)
y = 2.5 * np.exp(-1.3 * x) + np.random.normal(size=len(x)) * 0.2
# 定义拟合函数
def model(x, a, b):
return a * np.exp(-b * x)
# 拟合
params, _ = curve_fit(model, x, y)
print("拟合参数:", params)
6. 根查找(root_scalar
, brentq
)
用于查找标量函数的零点:
from scipy.optimize import root_scalar
def f(x):
return x**3 - x - 2
sol = root_scalar(f, bracket=[1, 2], method='brentq')
print("零点:", sol.root)
也可以使用 newton
方法:
sol = root_scalar(f, x0=1.5, method='newton', fprime=lambda x: 3*x**2 - 1)
7. 示例:非线性回归模型拟合
import matplotlib.pyplot as plt
# 非线性模型
def model_func(x, a, b, c):
return a * np.exp(-b * x) + c
xdata = np.linspace(0, 4, 50)
ydata = model_func(xdata, 2.5, 1.3, 0.5) + np.random.normal(size=50) * 0.2
popt, pcov = curve_fit(model_func, xdata, ydata)
plt.plot(xdata, ydata, 'bo', label='数据')
plt.plot(xdata, model_func(xdata, *popt), 'r-', label='拟合')
plt.legend()
plt.title("非线性最小二乘拟合")
plt.show()
🔗 出站链接与参考资料
📘 官方文档
scipy.optimize
官方手册:
https://docs.scipy.org/doc/scipy/reference/optimize.html
发表回复