📌 目录

  1. 模块简介
  2. 函数最小化
  3. 最小二乘法拟合
  4. 非线性约束优化
  5. 求解线性规划问题
  6. 示例:优化应用
  7. 出站链接与参考资料

1. 模块简介

scipy.optimize 是 SciPy 中用于求解优化问题的模块。它包含了多种优化算法和方法,能够处理最小化、最大化、约束优化等问题。该模块提供了多种求解常见优化问题的工具,如函数最小化、线性规划、非线性约束优化等。

主要功能:

  • 无约束优化:如最小化无约束目标函数。
  • 约束优化:如含有线性或非线性约束的优化问题。
  • 最小二乘法拟合:用于数据拟合和回归分析。
  • 线性规划:求解线性约束的最优化问题。

2. 函数最小化

基本的函数最小化

SciPy 提供了多种优化算法来最小化目标函数,常见的如 minimize 函数。minimize 函数可以处理无约束和约束优化问题。

from scipy.optimize import minimize

# 定义目标函数
def objective(x):
    return x**2 + 3*x + 2

# 执行最小化
result = minimize(objective, 0)  # 初始猜测为 0

print(f"最小化结果:{result.x}, 最小值:{result.fun}")

使用不同的算法

可以通过指定 method 参数来选择不同的优化算法,如 'Nelder-Mead''BFGS''Powell' 等。

result = minimize(objective, 0, method='BFGS')
print(f"最小化结果:{result.x}, 最小值:{result.fun}")


3. 最小二乘法拟合

最小二乘法用于拟合数据,尤其是线性回归和非线性回归分析。scipy.optimize.least_squares 函数用于最小化残差的平方和,常用于数据拟合问题。

from scipy.optimize import least_squares
import numpy as np

# 定义一个非线性模型
def model(x, a, b):
    return a * np.exp(-b * x)

# 数据拟合
x_data = np.linspace(0, 10, 100)
y_data = model(x_data, 3, 0.5) + np.random.normal(0, 0.5, size=100)

# 定义残差函数
def residuals(params, x, y):
    return model(x, *params) - y

# 执行最小二乘拟合
result = least_squares(residuals, [1, 1], args=(x_data, y_data))

print(f"拟合参数:{result.x}")


4. 非线性约束优化

SciPy 也支持带有非线性约束的优化问题,可以通过 constraints 参数指定约束条件。

from scipy.optimize import minimize

# 定义目标函数
def objective(x):
    return x[0]**2 + x[1]**2

# 定义约束条件
def constraint(x):
    return x[0] + x[1] - 1  # x[0] + x[1] = 1

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

# 定义约束字典
con = {'type': 'eq', 'fun': constraint}

# 执行带约束的最小化
result = minimize(objective, x0, constraints=con)

print(f"最小化结果:{result.x}, 最小值:{result.fun}")


5. 求解线性规划问题

线性规划是求解线性约束下的优化问题,scipy.optimize.linprog 函数用于求解标准的线性规划问题。

from scipy.optimize import linprog

# 目标函数:max c^T x
c = [-1, -2]  # 因为 linprog 是求最小化,所以要取负号

# 约束条件:Ax <= b
A = [[2, 1], [1, 1]]
b = [20, 15]

# 求解线性规划问题
result = linprog(c, A_ub=A, b_ub=b)

print(f"最优解:{result.x}")


6. 示例:优化应用

示例:路径优化问题

在某些应用场景中,如物流、交通等,需要求解最短路径优化问题。通过最小化路径长度,可以得到最优的路径。

from scipy.optimize import minimize
import numpy as np

# 定义目标函数:计算两点之间的距离
def distance(x, points):
    return np.sqrt((x[0] - points[0][0])**2 + (x[1] - points[0][1])**2)

# 目标点
points = np.array([[0, 0], [3, 4]])

# 最小化路径长度
result = minimize(distance, [0, 0], args=(points,))

print(f"最短路径:{result.x}")


🔗 出站链接与参考资料

📘 官方文档

📚 实用教程与资源