Python Pyomo建模语言中约束计算的错误

Python Pyomo建模语言中约束计算的错误,python,constraints,pyomo,Python,Constraints,Pyomo,大家好 因此,我有以下错误: 计算约束5965时出错:无法计算sqrt'(0)。 错误:pyomo.opt:Solver(asl)返回非零返回代码(1) 错误:pyomo.opt:有关诊断信息,请参阅上面的解算器日志 解算器(asl)未正常退出 实际上,问题出在代码的以下部分: def热极限(i、j、k型): 如果行\u加载\u限制==真: P_branch_ij=(model.V_magn[i,k]**2)*np.float(real(Y_矩阵[i,j])-model.V_magn[i,k]*

大家好

因此,我有以下错误:

计算约束5965时出错:无法计算sqrt'(0)。 错误:pyomo.opt:Solver(asl)返回非零返回代码(1) 错误:pyomo.opt:有关诊断信息,请参阅上面的解算器日志

解算器(asl)未正常退出

实际上,问题出在代码的以下部分:

def热极限(i、j、k型):
如果行\u加载\u限制==真:
P_branch_ij=(model.V_magn[i,k]**2)*np.float(real(Y_矩阵[i,j])-model.V_magn[i,k]*model.V_magn[j,k]*(np.float(real(Y_矩阵[i,j])cos(model.V_角度[i,k]-model.V_角度[j,k])+np float(imag(Y_矩阵[i,j])*sin角度[i,k]-model.V角度[k]))
Q_branch_ij=(model.V_magn[i,k]**2)*np.float(imag(Y_矩阵[i,j])+model.V_magn[i,k]*model.V_magn[j,k]*(np.float((实(Y_矩阵[i,j]))*sin模型V_角[i,k]-模型V_角[j,k])-np float(imag(Y_矩阵[i,j])*cos(模型V角[i,k]-模型k])*

return(sqrt((P_branch_ij**2)+(Q_branch_ij**2))

这在技术上不是Pyomo的问题,而是您的公式的问题

当解算器将p_branch_ij和Q_branch_ij的值驱动为0时,ASL(解算器可执行文件的一部分)抛出错误(这可能是由于非活动行或错误的初始值造成的)。在0处,
sqrt(0)的导数
未定义。此数值错误导致解算器退出而不返回解

有几种可能的解决办法:

  • 正如您在编辑中指出的,您可以尝试不同的初始变量值。当解算器从不同的起点开始时,它可能不会采用将
    p_branch_ij
    Q_branch_ij
    驱动为零的路径。这种方法的缺点是,在获得一个初始值之前,您可能需要尝试许多不同的初始值这不会使解算器通过
    sqrt(0)
    ,也不能保证找到一个有效的解算器(特别是如果问题的解决方案确实是0!)

  • 绑定变量,使总分支功率(
    p\u branch\u ij**2+Q\u branch\u ij**2
    )永远不会达到零。这有点棘手,因为你不能用一个简单的约束来实现:大多数解算器在解算过程中都被允许违反约束,致命的错误是如果解算器试图计算
    sqrt(0)的导数
    。幸运的是,大多数解算器总是尊重变量边界。因此,为了防止解算器计算
    sqrt'(0)
    ,您需要定义中间Pyomo变量(而不仅仅是Python表达式)对于
    PQ2_branch_ij
    ,然后将变量下限设置为大于0的值。这种方法的缺点是,您现在正在解决另一个问题,如果原始问题的解决方案确实为0,则可能会迫使自己采用次优解决方案

  • model.PQ2\u branch\u ij=Var(branch\u from\u to,scenario\u set,bounds=(1e-8,无))
    def compute_PQ2_branch_ij(m,i,j,k):
    P_-branch_-ij=(m.V_-magn[i,k]**2)*np.float(实(Y_矩阵[i,j])-m.V_-magn[i,k]*m.V_-magn[j,k]*(np.float(实(Y_矩阵[i,j])cos(m.V_角[i,k]-m.V_角[j,k])+np float(imag(Y_矩阵[i,j])*sin m.V角[i,k]-m.V角[k])
    Q_-branch_-ij=(m.V_-magn[i,k]**2)*np.float(imag(Y_-matrix[i,j])+m.V_-magn[i,k]*m.V_-magn[j,k]*(np.float((实(Y_-matrix[i,j]))*sin m.V_角[i,k]-m.V_角[j,k])-np float(imag(Y_-matrix[i,j])*cos])*
    返回m.PQ2_branch_ij[i,j,k]==P_branch_ij**2+Q_branch_ij**2
    def thermal_lim_ineq_con(m,i,j,k):
    
    return sqrt(m.PQ2_branch_ij)这在技术上不是Pyomo的问题,而是您的公式的问题

    当解算器将p_branch_ij和Q_branch_ij的值驱动为0时,ASL(解算器可执行文件的一部分)抛出错误(这可能是由于非活动行或错误的初始值造成的)。在0处,
    sqrt(0)的导数
    未定义。此数值错误导致解算器退出而不返回解

    有几种可能的解决办法:

  • 正如您在编辑中指出的,您可以尝试不同的初始变量值。当解算器从不同的起点开始时,它可能不会采用将
    p_branch_ij
    Q_branch_ij
    驱动为零的路径。这种方法的缺点是,在获得一个初始值之前,您可能需要尝试许多不同的初始值这不会使解算器通过
    sqrt(0)
    ,也不能保证找到一个有效的解算器(特别是如果问题的解决方案确实是0!)

  • 绑定变量,使总分支功率(
    p\u branch\u ij**2+Q\u branch\u ij**2
    )永远不会达到零。这有点棘手,因为你不能用一个简单的约束来实现:大多数解算器在解算过程中都被允许违反约束,致命的错误是如果解算器试图计算
    sqrt(0)的导数
    。幸运的是,大多数解算器总是尊重变量边界。因此,为了防止解算器计算
    sqrt'(0)
    ,您需要定义中间Pyomo变量(而不仅仅是Python表达式)对于
    PQ2_branch_ij
    ,然后将变量下限设置为大于0的值。这种方法的缺点是,您现在正在解决另一个问题,如果原始问题的解决方案确实为0,则可能会迫使自己采用次优解决方案

  • model.PQ2\u branch\u ij=Var(branch\u from\u to,scenario\u set,bounds=(1e-8,无))
    def compute_PQ2_branch_ij(m,i,j,k):
    P_-branch_-ij=(m.V_-magn[i,k]**2)*np.float(实(Y_-matrix[i,j])-m.V_-magn[i,k]*m.V_-magn[j,
    
    model.V_magn[i, k]