📌 目录

  1. scipy.optimize 模块简介
  2. 函数最小化(minimize
  3. 多变量约束优化
  4. 求解非线性方程组(fsolve
  5. 最小二乘拟合(curve_fit
  6. 根查找(root_scalar, brentq
  7. 示例:非线性回归模型拟合
  8. 出站链接与参考资料

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()


🔗 出站链接与参考资料

📘 官方文档

📚 实用资源