📌 目录

  1. 模块简介
  2. 函数最小化(minimize
  3. 约束与边界条件
  4. 曲线拟合(curve_fit
  5. 根查找(非线性方程组)
  6. 示例:非线性曲线拟合与成本优化
  7. 出站链接与参考资料

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)


🔗 出站链接与参考资料

📘 官方文档

📚 实用教程与资源