📌 目录

  1. scipy.optimize 模块简介
  2. 无约束优化:minimize 函数
  3. 约束优化:带约束的 minimize
  4. 多变量优化
  5. 非线性最小二乘拟合:curve_fit
  6. 全局优化:differential_evolution
  7. 示例:曲线拟合与数据拟合
  8. 出站链接与参考资料

1. scipy.optimize 模块简介

scipy.optimize 提供了广泛的优化算法,包括:

  • 无约束最小化
  • 约束最小化
  • 非线性最小二乘拟合
  • 全局优化(遗传算法、粒子群等)
  • 数值求解(线性方程、方程组)

该模块对许多应用场景非常重要,如机器学习中的模型训练、工程中的结构优化、经济学中的资源分配等。


2. 无约束优化:minimize 函数

scipy.optimize.minimize 是最常用的最小化函数,支持多种优化算法。

基本用法

from scipy.optimize import minimize

# 目标函数
def objective(x):
    return x**2 + 5*x + 10

# 初始猜测
x0 = [0]

# 无约束最小化
result = minimize(objective, x0)
print(result.x)  # 最优解

优化算法选择

minimize 函数支持不同的优化算法,如:

  • 'BFGS'(拟牛顿法)
  • 'Nelder-Mead'(单纯形法)
  • 'Powell'(Powell 法)
  • 'CG'(共轭梯度法)
result = minimize(objective, x0, method='Nelder-Mead')


3. 约束优化:带约束的 minimize

通过设置约束条件来限制优化过程。

等式约束

# 等式约束:x + y = 1
cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 1})

result = minimize(objective, [0, 0], constraints=cons)
print(result.x)  # 最优解

不等式约束

# 不等式约束:x >= 0
cons = ({'type': 'ineq', 'fun': lambda x: x[0]})

result = minimize(objective, [-1], constraints=cons)
print(result.x)  # 最优解


4. 多变量优化

优化多个变量的目标函数。

# 多变量目标函数:f(x, y) = x^2 + y^2
def objective_multivariable(x):
    return x[0]**2 + x[1]**2

# 初始猜测
x0 = [1, 1]

# 多变量优化
result = minimize(objective_multivariable, x0)
print(result.x)  # 最优解


5. 非线性最小二乘拟合:curve_fit

用于数据拟合,常用于实验数据与模型的拟合。

示例:线性拟合

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# 模拟数据:y = 2*x + 1 + noise
x_data = np.linspace(0, 10, 100)
y_data = 2 * x_data + 1 + np.random.normal(0, 1, size=100)

# 拟合函数:y = a*x + b
def model(x, a, b):
    return a * x + b

# 使用 curve_fit 拟合
params, covariance = curve_fit(model, x_data, y_data)

# 绘图展示
plt.scatter(x_data, y_data, label="Data")
plt.plot(x_data, model(x_data, *params), color='red', label="Fitted line")
plt.legend()
plt.show()

print("拟合参数:", params)


6. 全局优化:differential_evolution

适用于寻找全局最优解,尤其在多峰函数中。

示例:全局最小化

from scipy.optimize import differential_evolution

# 目标函数:多峰函数
def objective(x):
    return x**2 * np.sin(x)

# 设置搜索范围
bounds = [(-10, 10)]

# 全局优化
result = differential_evolution(objective, bounds)
print("全局最优解:", result.x)


7. 示例:曲线拟合与数据拟合

示例:指数衰减拟合

# 模拟数据:y = A * exp(-b * x) + noise
def model_exp(x, A, b):
    return A * np.exp(-b * x)

# 模拟 x 和 y 数据
x_data = np.linspace(0, 10, 100)
y_data = 5 * np.exp(-0.5 * x_data) + np.random.normal(0, 0.1, size=100)

# 使用 curve_fit 拟合
params, _ = curve_fit(model_exp, x_data, y_data)

# 绘图展示
plt.scatter(x_data, y_data, label="Data")
plt.plot(x_data, model_exp(x_data, *params), color='red', label="Fitted curve")
plt.legend()
plt.show()

print("拟合参数:", params)


🔗 出站链接与参考资料

📘 官方文档

🎓 教程与实战