能否通过scipy.optimize.minimize为优化副产物变量添加约束?
关于使用scipy.optimize.minimize实现带中间变量约束的优化问题咨询
问题概述
我需要通过scipy.optimize.minimize寻找8个刚度与阻尼参数(kx1、cx1、kz1、cz1、kx23、cx23、kz23、cz23),使系泊缆的最大张力(T_max_1、T_max_23)达到设定值,具体模型如下:
系泊缆1的刚度与阻尼模型
T1x = kx1 * (x + x2_1) + cx1 * (dx + dx2_1) T1z = kz1 * (z - z2_1) + cz1 * (dz + dz2_1) T_check1 = np.sqrt(T1x**2 + T1z**2) T_diff1 = T_check1 - T_max_1 # 计算实际张力与设定值的差值
其中辅助变量的计算逻辑:
x2_1 = r*(1 - np.cos(np.radians(rty))) z2_1 = r*np.sin(np.radians(rty)) dx2_1 = r*np.sin(np.radians(rty))*np.radians(drty) dz2_1 = r*np.cos(np.radians(rty))*np.radians(drty)*(-1)
系泊缆2、3的刚度与阻尼模型(参数相同)
T23x = kx23 * (x - x2_23) + cx23 * (dx + dx2_23) T23z = kz23 * (z + z2_23) + cz23 * (dz + dz2_23) T_check23 = np.sqrt(T23x**2 + T23z**2) T_diff23 = T_check23 - T_max_23 # 计算实际张力与设定值的差值
其中辅助变量的计算逻辑:
x2_23 = r23*(1 - np.cos(np.radians(rty))) z2_23 = r23*np.sin(np.radians(rty)) dx2_23 = r23*np.sin(np.radians(rty))*np.radians(drty) dz2_23 = r23*np.cos(np.radians(rty))*np.radians(drty)*(-1)
优化目标
目标函数为张力差值的平方和:
T_diff1**2 + T_diff23**2
已知条件与约束
- 预定义常量:T_max_1、T_max_23、r、r23
- 依赖优化参数的变量:x、z、rty、dx、dz、drty是含优化参数的微分方程解的参数最大值,其值由待优化的刚度与阻尼参数决定
- 优化参数边界:所有参数需大于等于0
bound_moor = (0.0, np.inf) bnds = (bound_moor, bound_moor, bound_moor, bound_moor, \ bound_moor, bound_moor, bound_moor, bound_moor)
- 需要添加的额外约束:
- 中间变量约束:
-6 < x < 6 - 参数关系约束:
kx1>kx23、cx1>cx23、kz1>kz23、cz1>cz23
- 中间变量约束:
已尝试的优化方案
方案1:整合微分方程与优化逻辑,单独定义约束函数
将微分方程求解与优化逻辑整合为一个仅返回目标值的函数,同时定义x的约束函数(注:此处存在逻辑错误,误将优化参数组当成包含中间变量x的集合):
def constraint1(variables): x, _, _, _, _, _, _, _ = variables return x + 6 # 确保x > -6 def constraint2(variables): x, _, _, _, _, _, _, _ = variables return 6 - x # 确保x < 6
同时添加参数关系约束后,将优化放入循环处理多案例,但程序始终无法运行完成。
方案2:函数返回目标值与x,通过lambda定义约束
让微分方程求解函数同时返回目标值与中间变量x,再定义约束:
def objective_function(params): return differential_equation(params)[0]
constr_xup = {'type': 'ineq', 'fun': lambda params: 6 - differential_equation(params)[1]} constr_xdown = {'type': 'ineq', 'fun': lambda params: differential_equation(params)[1] + 6}
但程序同样无法运行完成。
咨询问题
查阅资料了解到“中间变量约束”“动态优化”等概念,想确认:是否可以通过scipy.optimize.minimize实现该需求,还是需要使用其他工具?
内容的提问来源于stack exchange,提问作者Achmad A
相关产品推荐
相关产品推荐

