我想用Gekko来解决一个优化问题。非线性约束在函数中生成,并作为向量传递.因为有向量,所以我使用m.Equations和m.Array。为了使它尽可能简单,我简化了我的问题,使代码保持简短和简单。我认为我的错误在于我如何使用m.Equations。错误信息是:
异常:@error:方程定义没有等式(=)或不等式(>,<)假停止.
这是我的密码:
import numpy as np
from gekko import GEKKO
def powerf(x):
U = np.array([[x[2]], [x[3] * m.exp(x[4] * 1j)]])
G = np.array([[x[0] + x[1] * 1j], [0]])
L = np.array([[0],[1]])
y = np.array([[-18.8301*1j, 18.8566*1j], [18.8566*1j, -18.8301*1j]])
I = np.matmul(y, U)
Iconj = np.real(I) - np.imag(I) * 1j
S = np.matmul(np.diagflat(Iconj), U)
P = np.real(S) - np.real(G) + np.real(L)
Q = np.imag(S) - np.imag(G) + np.imag(L)
return np.concatenate((P,Q)).reshape(4,)
m = GEKKO()
x = m.Array(m.Var,5)
ig = [0, 0, 1, 1, 0]
lb = [0, -2, 0.95, 0.95, -np.pi]
ub = [5, 2, 1.10, 1.10, np.pi]
for i in range(len(x)):
x[i].value = ig[i]
x[i].lower = lb[i]
x[i].upper = ub[i]
m.Equations([powerf(x) == np.zeros(4,)])
m.Obj(x[0])
m.solve()发布于 2021-05-24 21:15:36
m.Equations()函数需要一个方程列表。这里有一种方式可以摆出这样的姿势:
y = powerf(x)
m.Equations([y[i]==0 for i in range(4)])生成的模型可以用m.open_folder()查看。
Model
Variables
v1 = 0, <= 5, >= 0
v2 = 0, <= 2, >= -2
v3 = 1, <= 1.1, >= 0.95
v4 = 1, <= 1.1, >= 0.95
v5 = 0, <= 3.141592653589793, >= -3.141592653589793
End Variables
Equations
((((((((((-0-18.8301j))*(v3))+((18.8566j)*(((v4)*(exp(((v5)*(1j))))))))-0j))*(v3))+((0)*(((v4)*(exp(((v5)*(1j))))))))-(v1+((v2)*(1j))))+0)=0
(((((0)*(v3))+((((((18.8566j)*(v3))+(((-0-18.8301j))*(((v4)*(exp(((v5)*(1j))))))))-0j))*(((v4)*(exp(((v5)*(1j))))))))-0)+1)=0
True
True
minimize v1
End Equations
End Model列表中的方程3和4似乎没有Gekko变量,因此它们返回True。另一件要考虑的事情是,Gekko目前不支持本机虚数,所以这个问题需要修改为虚值和实值的独立变量,例如x_real[i]和x_im[i]。目标的一个更易读的形式是m.Minimize(x[0])。
https://stackoverflow.com/questions/67658487
复制相似问题