@NLexpressions的格式问题

# code
using JuMP,Ipopt
G=[1.04209   -0.588235  -0.0  -0.453858;
-0.588235   1.069      0.0  -0.480769;
-0.0        0.0        0.0   0.0;
-0.453858  -0.480769   0.0   0.934627]
B=[-8.24288   2.35294   3.66667   1.89107;
  2.35294  -4.72738   0.0       2.40385;
  3.66667   0.0      -3.33333   0.0;
  1.89107   2.40385   0.0      -4.26159]
model=Model(Ipopt.Optimizer)
## 创建决策变量                                                               %创建决策变量
@variable(model, P[1:4])#P[1:n,1]定义一个稠密矩阵的变量;P[1:n]定义一个数组
@variable(model, Q[1:4])
@variable(model, U[1:4])
@variable(model, Ang[1:4])
@variable(model, Angle[1:4,1:4])
@NLexpressions(model,a2,begin 
for i=1:4
    for j=1:4
    a2=U[i]*((G[i,j]*cos(Angle[i,j])+B[i,j]*sin(Angle[i,j]))*U[i])  
end 
end   
end)

报错提示: no method matching @NLexpressions(::LineNumberNode, ::Module, ::Symbol, ::Symbol, ::Expr)
这里的LineNumberNode,Symbol应该填什么?
JuMP文档里没找到NLexpressions的例子。

LineNumberNode 是 julia 自动添加的,不用管。

我查了下源码,这个的用法和 @variable@expression 类似,只接受两个参数。你多传了一个。

"‘’
using JuMP,Ipopt
G=[1.04209 -0.588235 -0.0 -0.453858;
-0.588235 1.069 0.0 -0.480769;
-0.0 0.0 0.0 0.0;
-0.453858 -0.480769 0.0 0.934627]
B=[-8.24288 2.35294 3.66667 1.89107;
2.35294 -4.72738 0.0 2.40385;
3.66667 0.0 -3.33333 0.0;
1.89107 2.40385 0.0 -4.26159]
model=Model(Ipopt.Optimizer)
@variable(model, P[1:4])#P[1:n,1]定义一个稠密矩阵的变量;P[1:n]定义一个数组
@variable(model, Q[1:4])
@variable(model, U[1:n])
@variable(model, Ang[1:n])
@variable(model, Angle[1:n,1:n])
@NLexpressions(model,begin
for i=1:4
for j=1:4
a2=U[i]*((G[i,j]*cos(Angle[i,j])+B[i,j]*sin(Angle[i,j]))*U[i])
end
end
end)
‘’‘’
我把a2去掉了,但报出这样的问题:
LoadError: cos is not defined for type AbstractVariableRef. Are you trying to build a nonlinear problem? Make sure you use @NLconstraint/@NLobjective.
问:是不能用NLexpressions吗?我该怎么改才能用上这个NLexpressions?

看这个报错,我感觉是 @NLexpressions 不是一个公开的 API。
你可能要用 @NLconstraint/@NLobjective 这两个看起来更像是公开的 API。

https://jump.dev/JuMP.jl/v0.21.1/nlp/

我简化了问题,现在代码如下:
‘’’
using JuMP,Ipopt
PL=[0.3; 0.55; 0; 0]
model=Model(Ipopt.Optimizer)
@variable(model, P[1:4])#P[1:4,1]定义一个稠密矩阵的变量;
@variable(model, Angle[1:4,1:4])
@NLexpression(model,expr[i=1:4],P[i]-PL[i])
@NLexpression(model,cos(Angle)*expr)
‘’’
我想实现非线性矩阵乘法运算,但报错提示@NLexpression只能实现标量运算,那我要计算矩阵,要如何处理?是换一个优化包还是求解器还是有别的输入方式?