关于 scipy-optimization
scipy-optimization 是一项指导使用 SciPy 优化模块解决工程设计问题的 Skill,面向需要优化泵设计和系统参数的工程人员。内容涵盖约束与无约束优化、曲线拟合、全局及多目标优化。
主要功能
- 01约束与无约束优化
- 02最小二乘曲线拟合
- 03多峰问题的全局优化
- 04多目标权衡
- 05泵设计优化示例
适用场景
- 01优化泵几何参数与效率
- 02根据试验数据拟合性能曲线
- 03在设计约束下调整系统参数
- 04权衡泵效与生命周期成本
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ soljourner/ claude-engineering-skills --skill scipy-optimization安装后在 Claude Code 中输入/scipy-optimization确认已加载。
附带文件examples.pyreference.md
详细介绍
用于工程设计的 SciPy 优化
概述
scipy.optimize 模块提供了一套全面的优化算法,可用于解决工程设计问题。本技能侧重于将这些方法应用于泵设计优化、系统参数调优和性能分析。
主要功能:
- 无约束优化:在不受限制的情况下寻找最优参数
- 有约束优化:在设计约束和边界条件下进行优化
- 曲线拟合:将模型拟合到实验数据
- 全局优化:在多峰问题中寻找全局最小值
- 多目标优化:平衡相互竞争的设计目标
优化方法
1. minimize() - 无约束和有约束优化
大多数优化任务的主力函数。
from scipy.optimize import minimize
import numpy as np
# Basic usage
def objective(x):
"""Objective function to minimize"""
return x[0]**2 + x[1]**2
result = minimize(objective, x0=[1.0, 1.0])
print(f"Optimal point: {result.x}")
print(f"Optimal value: {result.fun}")
常用算法:
'Nelder-Mead':无需导数,稳健但较慢'BFGS':拟牛顿法,适用于平滑函数,速度快'L-BFGS-B':带边界条件的 BFGS'SLSQP':带约束的序列最小二乘法'trust-constr':通用有约束优化(优先使用)
2. least_squares() - 曲线拟合与残差最小化
专用于以下形式的问题:最小化 sum(residuals^2)
from scipy.optimize import least_squares
def residuals(params, x_data, y_data):
"""Calculate residuals between model and data"""
a, b, c = params
y_model = a * x_data**2 + b * x_data + c
return y_model - y_data
# Fit quadratic to data
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([2.1, 3.9, 9.2, 15.8, 25.1])
result = least_squares(residuals, x0=[1, 1, 1], args=(x_data, y_data))
主要特性:
- 支持对变量设置边界
- 稳健损失函数(可处理异常值)
- 高效处理大型残差问题
- 返回雅可比矩阵信息
3. differential_evolution() - 全局优化
使用进化算法寻找全局最小值。对于多峰问题必不可少。
from scipy.optimize import differential_evolution
def complex_function(x):
"""Function with multiple local minima"""
return np.sin(x[0]) * np.cos(x[1]) + (x[0] - 1)**2 + (x[1] + 2)**2
# Search over bounds
bounds = [(-5, 5), (-5, 5)]
result = differential_evolution(complex_function, bounds)
适用场景:
- 预期存在多个局部最小值
- 没有梯度信息
- 需要稳健的全局解
- 可以接受较长的计算时间
4. 有约束优化
在等式和不等式约束下进行优化。
from scipy.optimize import minimize, NonlinearConstraint, LinearConstraint
def objective(x):
return x[0]**2 + x[1]**2
# Equality constraint: x[0] + x[1] = 1
def eq_constraint(x):
return x[0] + x[1] - 1
# Inequality constraint: x[0]^2 + x[1]^2 >= 0.5
def ineq_constraint(x):
return x[0]**2 + x[1]**2 - 0.5
constraints = [
{'type': 'eq', 'fun': eq_constraint},
{'type': 'ineq', 'fun': ineq_constraint}
]
result = minimize(objective, x0=[0.5, 0.5],
method='SLSQP', constraints=constraints)
工程应用
1. 泵效率最大化
优化泵的几何参数(叶轮直径、叶片角度、宽度),以最大化设计点的效率。
问题表述:
- 目标:最大化效率 η(D, β, b)
- 约束:
- 最小流量要求
- 最大功耗
- 几何约束(例如,D_min ≤ D ≤ D_max)
- NPSH 要求
方法:
def pump_efficiency(params):
"""Calculate pump efficiency (negative for minimization)"""
D, beta, b = params # diameter, blade angle, width
# Simplified efficiency model
Q = calculate_flow_rate(D, beta, b)
H = calculate_head(D, beta, b)
P = calculate_power(D, beta, b)
eta = (rho * g * Q * H) / P
return -eta # Negative for maximization
bounds = [(0.1, 0.5), (20, 45), (0.02, 0.1)] # D, beta, b
result = minimize(pump_efficiency, x0=[0.3, 30, 0.05],
method='L-BFGS-B', bounds=bounds)
2. 叶轮几何优化
针对特定工作点优化叶片型线、盖板轮廓和轮毂几何形状。
主要考量:
- 进口/出口速度三角形
- 叶片载荷分布
- 汽蚀性能(NPSH)
- 结构完整性(应力限值)
3. 系统成本最小化
寻找泵的最佳尺寸和运行转速,以降低生命周期总成本。
成本构成:
- 资本成本(泵 + 电机 + VFD)
- 能源成本(运行小时数 × 效率)
- 维护成本
- 更换成本(NPV)
问题表述:
def total_cost(params):
"""Total lifecycle cost"""
pump_size, speed_rpm = params
# Capital cost
capital = cost_pump(pump_size) + cost_motor(pump_size, speed_rpm)
# Operating cost (20 year life)
annual_energy = operating_hours * power(pump_size, speed_rpm) * electricity_rate
operating = annual_energy * 20
# Maintenance
maintenance = maintenance_rate * capital * 20
return capital + operating + maintenance
4. 多目标优化
平衡相互竞争的目标(例如,效率与成本、流量与扬程)。
帕累托前沿方法:
def weighted_objectives(params, weight):
"""Combine objectives with weighting"""
eta = pump_efficiency(params)
cost = pump_cost(params)
# Normalize and combine
return -weight * eta + (1 - weight) * cost
# Sweep weights to find Pareto front
pareto_solutions = []
for w in np.linspace(0, 1, 21):
result = minimize(lambda x: weighted_objectives(x, w),
x0=[0.3, 30, 0.05], bounds=bounds)
pareto_solutions.append(result.x)
5. 实验数据曲线拟合
将泵特性曲线(H-Q、η-Q、P-Q)拟合到测试数据。
应用场景:
- 根据测试数据建立性能模型
- 将性能外推至非设计工况
- 识别解析模型中的经验系数
示例:
from scipy.optimize import curve_fit
def pump_curve(Q, a, b, c):
"""Quadratic head-flow relationship"""
return a - b * Q - c * Q**2
# Fit to test data
Q_test = np.array([0, 50, 100, 150, 200]) # m³/h
H_test = np.array([120, 115, 105, 90, 70]) # m
params, covariance = curve_fit(pump_curve, Q_test, H_test)
print(f"H = {params[0]:.2f} - {params[1]:.4f}*Q - {params[2]:.6f}*Q²")
最佳实践
1. 问题表述
- 缩放变量:将变量归一化到相近的量级(0-1 或 -1 至 1)
- 选择良好的初始猜测:从接近预期解的值开始
- 定义明确的边界:避免出现不符合物理规律的解
- 构造平滑的目标函数:避免不连续性
2. 算法选择
- 函数平滑且有梯度:使用
'BFGS'或'L-BFGS-B' - 有约束:使用
'SLSQP'或'trust-constr' - 有噪声/不连续:使用
'Nelder-Mead'或无导数方法 - 存在多个局部最小值:先使用
differential_evolution,再进行细化 - 曲线拟合:使用
curve_fit或least_squares
3. 收敛技巧
- 尝试多个初始猜测值
- 使用合理的容差(不要设得过小)
- 尽可能提供解析梯度
- 检查优化成功标志
- 验证结果在物理上的可行性
4. 约束的表述
- 将不等式约束表示为 g(x) ≥ 0
- 将等式约束表示为 h(x) = 0
- 保持约束平滑且可微
- 避免冗余约束
常见陷阱
- 缩放不佳:变量的量级相差悬殊
- 初始猜测值不佳:从远离可行区域的位置开始
- 算法错误:对非光滑函数使用基于梯度的方法
- 容差过小:要求的精度超出可实现范围
- 忽略边界:未将变量限制在物理范围内
- 未进行验证:未检查解是否符合工程实际
性能优化技巧
- 向量化运算:使用 NumPy 数组代替循环
- 提供雅可比矩阵:解析梯度速度更快、准确度更高
- 使用合适的方法:如果局部优化足够,就不要使用全局优化
- 缓存开销较大的计算:存储中间结果
- 从简单模型开始:逐步提高复杂度
与泵设计工作流集成
1. Define design variables (D, β, b, ω, etc.)
2. Establish objective function (maximize η, minimize cost)
3. Define constraints (Q_min, NPSH, stress limits)
4. Set bounds (physical limits)
5. Choose optimization algorithm
6. Run optimization with multiple initial guesses
7. Validate results (CFD, analytical checks)
8. Perform sensitivity analysis
9. Generate documentation and plots
示例工作流
import numpy as np
from scipy.optimize import minimize, differential_evolution
import matplotlib.pyplot as plt
# Step 1: Define problem
def objective(x):
D, beta = x
return -calculate_efficiency(D, beta)
def constraint_flow(x):
D, beta = x
return calculate_flow_rate(D, beta) - Q_min
def constraint_power(x):
D, beta = x
return P_max - calculate_power(D, beta)
# Step 2: Set up optimization
bounds = [(0.2, 0.6), (20, 50)]
constraints = [
{'type': 'ineq', 'fun': constraint_flow},
{'type': 'ineq', 'fun': constraint_power}
]
# Step 3: Solve with global optimizer first
result_global = differential_evolution(
objective, bounds, constraints=constraints
)
# Step 4: Refine with local optimizer
result_local = minimize(
objective, x0=result_global.x,
method='SLSQP', bounds=bounds,
constraints=constraints
)
# Step 5: Report results
print(f"Optimal diameter: {result_local.x[0]:.3f} m")
print(f"Optimal blade angle: {result_local.x[1]:.1f}°")
print(f"Maximum efficiency: {-result_local.fun:.2%}")
参考资料
- SciPy 优化文档
- 优化方法教程
- 用于问题表述的工程优化教材
- 提供实际约束和模型的泵设计手册
评论
支持 Markdown