Open Modelica 中的矩阵乘法

Ele*_*ena 2 matrix matrix-multiplication modelica openmodelica

我做了一个简单的模型,但似乎不起作用。我收到此错误:“太多方程,超定系统。该模型有 6 个方程和 2 个变量”并且sum_vs = sum_vs + v[1] * A[1,1] 的大小为 1 但0 个变量 ()

我整个早上都在盯着这段代码,这是一个简单的例子,因为我想让它在未来变得更复杂(更大的维度)。这是代码:

model MatrixMultiplication
parameter Real A[2,2]=[1,2;1,2];
parameter Real v[2]={1,2};
parameter Real sum_vs=0; //counter
Real vs[2];
equation
for i in 1:2 loop
  for j in 1:2 loop
     sum_vs = sum_vs + v[j] * A[i,j];
  end for;
  vs[i]=sum_vs;
end for;
end MatrixMultiplication;
Run Code Online (Sandbox Code Playgroud)

理想的结果是vs[1,2]=A[2,2]*v[2];

谢谢!

Mar*_* A. 7

您定义的方程从根本上来说是有缺陷的,即sum_vs = sum_vs + v[j] * A[i,j];根本不是一个有效的方程。您所写的是作业而不是方程,请参阅https://mbe.modelica.university/behavior/equations/equations/以了解 Modelica 中的方程是什么。您需要确保理解平衡模型的概念,其中方程和未知数的数量必须相同。

另外错误是:

  • 在其声明中分配一个值sum_vs将不允许您定义附加方程
  • a 的值parameter在该部分中无法更改equation,因为它在模拟期间是恒定的,并且 a 中的值equation可以更改。

如果你想在 Modelica 中进行这种“编程”(由于各种原因通常不推荐),你需要定义一个algorithm- 而不是equation- 部分。重新构建为算法的示例看起来像(不确定它是否给出了您期望的结果,因为我不理解“理想结果”方程):

model MatrixMultiplication
  parameter Real A[2,2]=[1,2;1,2];
  parameter Real v[2]={1,2};
  Real sum_vs;
  Real vs[2];

algorithm 
  for i in 1:2 loop
    for j in 1:2 loop
       sum_vs :=sum_vs + v[j]*A[i, j];
    end for;
    vs[i]:=sum_vs;
  end for;
end MatrixMultiplication;
Run Code Online (Sandbox Code Playgroud)

关于 和 方程部分之间的差异algorithm,例如阅读方程和算法部分之间的差异

有效的方程可以通过以下代码定义:

model MatrixMultiplication
  parameter Real A[2,2]=[1,2;1,2];
  parameter Real v[2]={1,2};
  Real vs[2];

equation 
  vs = A * v;
end MatrixMultiplication;
Run Code Online (Sandbox Code Playgroud)

再说一遍,我不确定这是否是您想要计算的。但至少它是一个有效的方程。