Return 从函数到参数的多个数组输出
Return multiple array outputs from function to parameter
我有一个函数 returns 两个大小不等的数组 (A,B)。这些用于确定模型的初始条件,因此我希望将它们每个都定义为模型中的 parameter
数组。这可能吗?如果可能,怎么做?
下面是部分伪代码:
函数
function myfunc
input Real[:] alpha;
input Real[:] beta;
output Real[size(alpha,1)] A;
output Real[size(beta,1)] B;
algorithm
//equations, etc.
end myfunc;
型号
model mymodel
parameter Real[2] alpha = {1,2};
parameter Real[3] beta = {3,4,5};
parameter Real (A_start,Bstart) = myfunc(alpha,beta)
Real[size(alpha ,1)] A(start=A_start);
Real[size(beta,1)] B(start=B_start);
equation
//equations, etc.
end mymodel;
我试过好几件事都失败了。一种成功的方法使用初始方程部分。但是,它要求我,例如,将 A_start
定义为变量并在方程部分添加 der(A_start) = 0
,并阻止我提供非固定的猜测值(即 A(start=A_start)
) 到变量,这可能会导致问题。
感谢您的帮助,即使它确认我运气不好。
像往常一样,当你 post 某事时,你会顿悟。
通过添加一些额外的信息以及参数定义,我可以做我需要的事情。
model mymodel
parameter Real[2] alpha = {1,2};
parameter Real[3] beta = {3,4,5};
// Adding fixed=false was the missing key
parameter Real A_start(fixed=false);
parameter Real B_start(fixed=false);
Real[size(alpha ,1)] A(start=A_start);
Real[size(beta,1)] B(start=B_start);
initial equation
(A_start,Bstart) = myfunc(alpha,beta)
equation
//equations, etc.
end mymodel;
Scott G 的解决方案有效,但也可以通过其他方式解决 - 可能会更好,也可能不会更好。一种常见的想法如下:
record R
Real A[:],B[:];
end R;
function bar
input Real[:] alpha;
input Real[:] beta;
output R r(redeclare Real A[size(alpha,1)],redeclare Real B[size(beta,1)]);
algorithm
(r.A,r.B):=myfunc(alpha,beta);
end bar;
parameter R r=bar(alpha,beta);
Real[size(alpha, 1)] A(start=r.A);
Real[size(beta,1)] B(start=r.B);
我有一个函数 returns 两个大小不等的数组 (A,B)。这些用于确定模型的初始条件,因此我希望将它们每个都定义为模型中的 parameter
数组。这可能吗?如果可能,怎么做?
下面是部分伪代码:
函数
function myfunc
input Real[:] alpha;
input Real[:] beta;
output Real[size(alpha,1)] A;
output Real[size(beta,1)] B;
algorithm
//equations, etc.
end myfunc;
型号
model mymodel
parameter Real[2] alpha = {1,2};
parameter Real[3] beta = {3,4,5};
parameter Real (A_start,Bstart) = myfunc(alpha,beta)
Real[size(alpha ,1)] A(start=A_start);
Real[size(beta,1)] B(start=B_start);
equation
//equations, etc.
end mymodel;
我试过好几件事都失败了。一种成功的方法使用初始方程部分。但是,它要求我,例如,将 A_start
定义为变量并在方程部分添加 der(A_start) = 0
,并阻止我提供非固定的猜测值(即 A(start=A_start)
) 到变量,这可能会导致问题。
感谢您的帮助,即使它确认我运气不好。
像往常一样,当你 post 某事时,你会顿悟。
通过添加一些额外的信息以及参数定义,我可以做我需要的事情。
model mymodel
parameter Real[2] alpha = {1,2};
parameter Real[3] beta = {3,4,5};
// Adding fixed=false was the missing key
parameter Real A_start(fixed=false);
parameter Real B_start(fixed=false);
Real[size(alpha ,1)] A(start=A_start);
Real[size(beta,1)] B(start=B_start);
initial equation
(A_start,Bstart) = myfunc(alpha,beta)
equation
//equations, etc.
end mymodel;
Scott G 的解决方案有效,但也可以通过其他方式解决 - 可能会更好,也可能不会更好。一种常见的想法如下:
record R
Real A[:],B[:];
end R;
function bar
input Real[:] alpha;
input Real[:] beta;
output R r(redeclare Real A[size(alpha,1)],redeclare Real B[size(beta,1)]);
algorithm
(r.A,r.B):=myfunc(alpha,beta);
end bar;
parameter R r=bar(alpha,beta);
Real[size(alpha, 1)] A(start=r.A);
Real[size(beta,1)] B(start=r.B);