简体   繁体   English

使用 Gekko 错误解决 BVP 问题:@error: Equation Definition Equation 没有等式 (=) 或不等式 (>,<) false STOPPING

[英]Solving BVP problem with Gekko Error: @error: Equation Definition Equation without an equality (=) or inequality (>,<) false STOPPING

I am trying to solve a BVP problem (Cosserat rod ODE) with gekko.我正在尝试用 gekko 解决 BVP 问题(Cosserat rod ODE)。 The goal is to find the initial conditions nsol and msol (which correspond to the internal forces and moments of the rod) that minimize the cost function (the position of the final point of the rod), when integrating, the cosserat equations gives us P, R, nsol, msol, which correspond to the position, orientation, internal forces and moment in a section of the rod.目标是找到最小化成本的初始条件 nsol 和 msol(对应于杆的内力和力矩) ,R,nsol,msol,分别对应position,方位,内力和力矩在杆的一个截面。

but I keep getting this error:但我不断收到此错误:

Exception: @error: Equation Definition Equation without an equality (=) or inequality (>,<) false STOPPING...例外:@error:方程式定义方程式没有等式(=)或不等式(>,<)错误停止...

I am a beginner with gekko and although I have seen multiple threads with the same error, the source of the error seems to be different everytime.我是 gekko 的初学者,虽然我看到多个线程出现相同的错误,但错误的来源似乎每次都不同。 Could anyone please point me in the right direction?谁能指出我正确的方向? Thank you very much非常感谢

import numpy as np
import math
from scipy import integrate
import matplotlib.pyplot as plt
from gekko import GEKKO

E = 200e7 
nu = 0.3
G = E/(2*(1+nu))
r = 0.01
rho = 8000
g = np.array([0, 0, 0])
ray = 1
A = np.pi*r**2
I = (np.pi*r**4)/4
J = 2*I
L = 1
Lfin = 1.5

Kse = np.diag([G*A, G*A, E*A])
Kbt = np.diag([E*I, E*I, G*J])



def antisym(y):
    AS = np.array([[0, -y[2], y[1]], [y[2], 0, -y[0]], [-y[1], y[0], 0]])
    return AS


m = GEKKO()

dl = 81
m.time = np.linspace(0, L, dl)

# Parameters

R = m.Array(m.Var, (3,3))
P = m.Array(m.Var, (3))

R[0,0].value = 1
R[1,1].value = 1
R[2,2].value = 1
R[0,1].value = 0
R[0,2].value = 0
R[1,0].value = 0
R[1,2].value = 0
R[2,0].value = 0
R[2,1].value = 0


P[0].value = 0
P[1].value = 0
P[2].value = 0


#R = m.Array(m.Var, (3,3),lb=0,ub=1, value = np.eye(3))
#P = m.Array(m.Var, (3), value = np.zeros(3))
v = m.Array(m.Var, (3))
u = m.Array(m.Var, (3))



# Variables
nsol = m.Array(m.Var, (3), value = 0)
msol = m.Array(m.Var, (3), value = 0)


test = np.zeros(dl)
test[-1] = 1.0
final = m.Param(value = test)

# Equations

m.Equation(v == np.dot(np.dot(np.diag((1/(G*A), 1/(G*A), 1/(E*A))), np.transpose(R)), nsol) + np.array([0,0,1]))
m.Equation(u == np.dot(np.dot(np.diag((1/(E*I), 1/(E*I), 1/(G*J))), np.transpose(R)), msol) + np.array([0,0,0]))


for i in range(2):
    m.Equation(P[i].dt() == np.dot(R[i, :],v))
        
for i in range(2):
    for j in range(2):
        m.Equation(R[i, j].dt() == np.dot(R[i, :], antisym(u)[:, j]))

for i in range(2):
    m.Equation(nsol[i].dt() == 0)

m.Equation(msol[0].dt() == -(P[1].dt()*nsol[2]-P[2].dt()*nsol[1]))
m.Equation(msol[1].dt() == -(P[2].dt()*nsol[0]-P[0].dt()*nsol[2]))  
m.Equation(msol[2].dt() == -(P[0].dt()*nsol[1]-P[1].dt()*nsol[0]))  
    
# Objective

m.Minimize(P[2]*final - Lfin)

m.options.IMODE = 6
m.solve()

One way to troubleshoot these types of errors is to inspect the gk0_model.apm model file in the run directory m.path .解决这些类型错误的一种方法是检查运行目录m.path中的gk0_model.apm model 文件。 I modified the code to open the folder with m.open_folder() and the apm file:我修改了代码以使用m.open_folder()apm文件打开文件夹:

Model
Parameters
    p1
End Parameters
Variables
    v1 = 1
    v2 = 0
    v3 = 0
    v4 = 0
    v5 = 1
    v6 = 0
    v7 = 0
    v8 = 0
    v9 = 1
    v10 = 0
    v11 = 0
    v12 = 0
    v13 = 0
    v14 = 0
    v15 = 0
    v16 = 0
    v17 = 0
    v18 = 0
    v19 = 0
    v20 = 0
    v21 = 0
    v22 = 0
    v23 = 0
    v24 = 0
End Variables
Equations
    False
    False
    $v10=((((v1)*(v13))+((v2)*(v14)))+((v3)*(v15)))
    $v11=((((v4)*(v13))+((v5)*(v14)))+((v6)*(v15)))
    $v1=((((v1)*(0))+((v2)*(v18)))+((v3)*((-v17))))
    $v2=((((v1)*((-v18)))+((v2)*(0)))+((v3)*(v16)))
    $v4=((((v4)*(0))+((v5)*(v18)))+((v6)*((-v17))))
    $v5=((((v4)*((-v18)))+((v5)*(0)))+((v6)*(v16)))
    $v19=0
    $v20=0
    $v22=(-((($v11)*(v21))-(($v12)*(v20))))
    $v23=(-((($v12)*(v19))-(($v10)*(v21))))
    $v24=(-((($v10)*(v20))-(($v11)*(v19))))
    minimize (((v12)*(p1))-1.5)
End Equations

End Model

The first two equations are listed as False .前两个方程列为False This means that python evaluated the == is a comparative statement versus a symbolic expression.这意味着 python 评估==是比较语句与符号表达式。 Gekko symbolic expressions are needed to compile the model into byte-code for automatic differentiation.需要 Gekko 符号表达式将 model 编译为字节码以进行自动微分。 In this case, the equations:在这种情况下,方程:

m.Equation(v == np.dot(np.dot(np.diag((1/(G*A), 1/(G*A), 1/(E*A))),\
                        np.transpose(R)), nsol) + np.array([0,0,1]))
m.Equation(u == np.dot(np.dot(np.diag((1/(E*I), 1/(E*I), 1/(G*J))),\ 
                        np.transpose(R)), msol) + np.array([0,0,0]))

are vectors and should be scalars.是向量,应该是标量。

# Equations
r1 = np.dot(np.dot(np.diag((1/(G*A), 1/(G*A), 1/(E*A))), \
                   np.transpose(R)), nsol) + np.array([0,0,1])
r2 = np.dot(np.dot(np.diag((1/(E*I), 1/(E*I), 1/(G*J))), \
                   np.transpose(R)), msol) + np.array([0,0,0])
for i in range(3):
    m.Equation(v[i]==r1[i])
    m.Equation(u[i]==r2[i])

This gives an unbounded solution error when attempting to solve.这在尝试求解时会出现无限的求解错误。 Adding a lower bound of -1000 and upper bound of 1000 for all variables gives a successful solution.为所有变量添加-1000的下限和1000的上限可提供成功的解决方案。 If variables at at the bound, it may indicate that the problem is over-specified or unbounded without the artificial bounds.如果变量在边界处,则可能表明问题在没有人为边界的情况下被过度指定或无界。

import numpy as np
import math
from scipy import integrate
import matplotlib.pyplot as plt
from gekko import GEKKO

E = 200e7 
nu = 0.3
G = E/(2*(1+nu))
r = 0.01
rho = 8000
g = np.array([0, 0, 0])
ray = 1
A = np.pi*r**2
I = (np.pi*r**4)/4
J = 2*I
L = 1
Lfin = 1.5

Kse = np.diag([G*A, G*A, E*A])
Kbt = np.diag([E*I, E*I, G*J])



def antisym(y):
    AS = np.array([[0, -y[2], y[1]], [y[2], 0, -y[0]], [-y[1], y[0], 0]])
    return AS


m = GEKKO()

dl = 81
m.time = np.linspace(0, L, dl)

# Parameters

R = m.Array(m.Var, (3,3), lb=-1000, ub=1000)
P = m.Array(m.Var, (3), lb=-1000, ub=1000)

R[0,0].value = 1
R[1,1].value = 1
R[2,2].value = 1
R[0,1].value = 0
R[0,2].value = 0
R[1,0].value = 0
R[1,2].value = 0
R[2,0].value = 0
R[2,1].value = 0

P[0].value = 0
P[1].value = 0
P[2].value = 0

#R = m.Array(m.Var, (3,3),lb=0,ub=1, value = np.eye(3))
#P = m.Array(m.Var, (3), value = np.zeros(3))
v = m.Array(m.Var, (3), lb=-1000, ub=1000)
u = m.Array(m.Var, (3), lb=-1000, ub=1000)

# Variables
nsol = m.Array(m.Var, (3), value = 0, lb=-1000, ub=1000)
msol = m.Array(m.Var, (3), value = 0, lb=-1000, ub=1000)

test = np.zeros(dl)
test[-1] = 1.0
final = m.Param(value = test)

# Equations
r1 = np.dot(np.dot(np.diag((1/(G*A), 1/(G*A), 1/(E*A))), \
                   np.transpose(R)), nsol) + np.array([0,0,1])
r2 = np.dot(np.dot(np.diag((1/(E*I), 1/(E*I), 1/(G*J))), \
                   np.transpose(R)), msol) + np.array([0,0,0])
for i in range(3):
    m.Equation(v[i]==r1[i])
    m.Equation(u[i]==r2[i])

for i in range(2):
    m.Equation(P[i].dt() == np.dot(R[i, :],v))
        
for i in range(2):
    for j in range(2):
        m.Equation(R[i, j].dt() == np.dot(R[i, :], antisym(u)[:, j]))

for i in range(2):
    m.Equation(nsol[i].dt() == 0)

m.Equation(msol[0].dt() == -(P[1].dt()*nsol[2]-P[2].dt()*nsol[1]))
m.Equation(msol[1].dt() == -(P[2].dt()*nsol[0]-P[0].dt()*nsol[2]))  
m.Equation(msol[2].dt() == -(P[0].dt()*nsol[1]-P[1].dt()*nsol[0]))  
    
# Objective

m.Minimize(P[2]*final - Lfin)

m.options.IMODE = 6
#m.open_folder()
m.solve()

Successful Solution Summary:成功解决方案总结:

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0 -1.2000000e+02 1.00e+00 1.24e-02   0.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1 -6.2000001e+02 4.70e-14 3.40e-01  -3.0 4.00e+04    -  6.60e-01 1.00e+00f  1
   2 -1.1150000e+03 8.00e-14 6.43e-04   1.0 5.86e+04    -  1.00e+00 6.76e-01f  1
   3 -1.1199121e+03 9.48e-14 3.86e-08  -1.1 3.93e+02    -  9.98e-01 1.00e+00f  1
   4 -1.1199991e+03 7.96e-14 2.43e-10  -3.1 6.97e+00    -  9.98e-01 9.99e-01f  1
Reallocating memory for MA57: lfact (156431)
   5 -1.1200000e+03 6.50e-14 2.43e-13  -9.0 7.03e-02    -  9.99e-01 9.99e-01f  1

Number of Iterations....: 5

                                   (scaled)                 (unscaled)
Objective...............:  -1.1200000091288521e+03   -1.1200000091288521e+03
Dual infeasibility......:   2.4264487412842937e-13    2.4264487412842937e-13
Constraint violation....:   6.4955110402786716e-14    6.4955110402786716e-14
Complementarity.........:   9.8229036600334927e-07    9.8229036600334927e-07
Overall NLP error.......:   9.8229036600334927e-07    9.8229036600334927e-07


Number of objective function evaluations             = 6
Number of objective gradient evaluations             = 6
Number of equality constraint evaluations            = 6
Number of inequality constraint evaluations          = 0
Number of equality constraint Jacobian evaluations   = 6
Number of inequality constraint Jacobian evaluations = 0
Number of Lagrangian Hessian evaluations             = 5
Total CPU secs in IPOPT (w/o function evaluations)   =      0.117
Total CPU secs in NLP function evaluations           =      0.181

EXIT: Optimal Solution Found.
 
 The solution was found.
 
 The final value of the objective function is   -1120.00000912885     
 
 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :   0.334799999982351      sec
 Objective      :   -1120.00000000000     
 Successful solution
 ---------------------------------------------------

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 GEKKO MHE 时的方程定义错误(没有等式或不等式的方程) - Equation Definition Error (Equation without an equality or inequality) while using GEKKO MHE GEKKO 错误:在约束和目标内调用函数时,“没有等式 (=) 或不等式 (&gt;,&lt;) 的等式” - GEKKO Error: "Equation without an equality (=) or inequality (>,<)" when calling functions within constraint and objective 由于 GEKKO 中的用户定义函数导致的“没有等式 (=) 或不等式 (&gt;,&lt;)”的错误 - "Equation without an equality (=) or inequality (>,<)" error due to user-defined functions in GEKKO 如何修复 Python Gekko APMoniter 求解器错误:没有等式的方程 - How to fix Python Gekko APMoniter solver error: Equation without an equality 如何解决@error:GEKKO 中的方程定义 - How to solve @error: Equation Definition in GEKKO 在壁虎中求解方程 - Solving an Equation in gekko 例外:@error:Gekko 中的最大方程长度 - Exception: @error: Max Equation Length in Gekko 用numpy求解矩阵方程的错误 - Error solving Matrix equation with numpy Gekko - 如何修复 Python Gekko Max 方程错误 - 元素数 - GEKKO - How to fix Python Gekko Max Equation error - number of elements 使用 scipy solve_bvp 解决边界值问题(扩散反应方程) - Solving a boundary value problem (diffusion-reaction equation) with scipy solve_bvp
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM