Возврат нескольких выходов массива из функции в параметр - PullRequest
0 голосов
/ 02 мая 2018

У меня есть функция, которая возвращает два массива неравных размеров (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)) для переменных, которые могут вызвать проблемы.

Спасибо за вашу помощь, даже если это подтверждает, что мне не повезло.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Решение Скотта Дж работает, но его также можно решить и другими способами - это может быть или не быть лучше. Одна общая идея заключается в следующем:

  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);
0 голосов
/ 02 мая 2018

Как обычно, в тот момент, когда вы публикуете что-то, вы получаете прозрение.

Добавление некоторой дополнительной информации вместе с определением параметра позволило мне сделать то, что мне нужно.

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;
...