You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:40