📌 目录
- 模块简介
- 函数最小化
- 最小二乘法拟合
- 非线性约束优化
- 求解线性规划问题
- 示例:优化应用
- 出站链接与参考资料
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}")
🔗 出站链接与参考资料
📘 官方文档
scipy.optimize
官方手册:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
发表回复