Modelica 如何解决此代码中与维度相关的错误?

Modelica 如何解决此代码中与维度相关的错误?,modelica,dymola,Modelica,Dymola,我在Modelica中编写了一个代码,用于为我的硕士论文训练前馈两层神经网络。代码接收六个元素的向量(u[nin]),并提供两个元素y[nout]的输出向量。当我在dymola中翻译代码时,我收到一个错误,指出特定代码行中包含的部分的维度必须相等。一旦我删除了这一行,代码就被成功地翻译了。我真的花了很多努力试图解决这个错误,但徒劳无功!如果您能在这个问题上给予帮助,我们将不胜感激 代码如下:(请注意,导致翻译错误生成的行在代码中标记为/) 一旦我使用LogSig删除这些行,我就可以让OpenMo

我在Modelica中编写了一个代码,用于为我的硕士论文训练前馈两层神经网络。代码接收六个元素的向量(u[nin]),并提供两个元素y[nout]的输出向量。当我在dymola中翻译代码时,我收到一个错误,指出特定代码行中包含的部分的维度必须相等。一旦我删除了这一行,代码就被成功地翻译了。我真的花了很多努力试图解决这个错误,但徒劳无功!如果您能在这个问题上给予帮助,我们将不胜感激

代码如下:(请注意,导致翻译错误生成的行在代码中标记为/)


一旦我使用LogSig删除这些行,我就可以让OpenModelica为您生成一条错误消息:
[a.mo:59:3-59:71]错误:参数类型与运算矩阵乘法不兼容,左类型:实数[6],右类型:实数[1,10]

[a.mo:59:3-59:71]错误:无法解析表达式类型0.01*u*转置(yj)。操作数在组件中具有类型Real[6],Real[1,10]。


u
yj'
具有维度
6
1,10

查看代码,相关等式右侧矩阵的大小似乎不匹配


尝试将u定义为大小为6x1的2D矩阵。

您在命令行中测试过这一行吗?这可以通过在工作区中创建模型中使用的变量,然后在命令行中运行注释掉的行来检查大小是否正确来完成。您可以在Dymola命令行中执行此操作,但我对OpenModelica不够熟悉,无法判断您是否可以在那里执行相同的检查。

您确实应该包括您收到的准确错误消息。我试图重现您的问题,但您没有为
LogSig
提供函数签名。请你至少把它包括进去好吗。否则,就无法重现您的错误。
model NN_block
Modelica.Blocks.Interfaces.RealInput
        u[nin] "Connector of Real input signals"
annotation (Placement(transformation(extent={{-140,-20},{-100,20}},
    rotation=0)));
Modelica.Blocks.Interfaces.RealOutput y[nout]
annotation (Placement(transformation(extent={{100,-10},{120,10}})));
parameter Integer nin2=1;
parameter Integer nin=6;
parameter Integer nout=2;
Real wji[10,6];
Real delta_wij[6,10];
Real bj[10,1];
Real delta_bjT[1,10];
Real wkj[2,10];
Real delta_wjk[10,2];
Real bk[2,1];
Real delta_bkT[1,2];
Real E;
Real ek[1,2];
Real yj[10,1];

Modelica.Blocks.Interfaces.BooleanOutput Input_trigger
                                               annotation (Placement(
    transformation(extent={{100,-46},{120,-26}}), iconTransformation(extent=
       {{100,-46},{120,-26}})));
Modelica.Blocks.Interfaces.RealInput eTau1 annotation (Placement(
    transformation(extent={{-182,36},{-142,76}}), iconTransformation(
    extent={{10,-10},{-10,10}},
    rotation=90,
    origin={-44,90})));
Modelica.Blocks.Interfaces.RealInput eTau2 annotation (Placement(
    transformation(extent={{-148,46},{-108,86}}), iconTransformation(
    extent={{10,-10},{-10,10}},
    rotation=90,
    origin={50,90})));
annotation (Placement(transformation(extent={{-10,-10},{10,10}},
    rotation=-90,
    origin={-50,90}), iconTransformation(
    extent={{-10,-10},{10,10}},
    rotation=-90,
    origin={0,90})));
algorithm 
E:=1;
wji:=0.5*ones(10,6);
bj:=0.25*ones(10,1);
wkj:=0.75*ones(2,10);
bk:=0.6*ones(2,1);
delta_wij:=zeros(6,10);
delta_bjT:=zeros(1,10);
delta_wjk:=zeros(10,2);
delta_bkT:=zeros(1,2);

while E>0.01 loop
Input_trigger:=true;
y:=wkj*NeuralNetwork.Utilities.LogSig(wji*u+bj[:,1])+bk[:,1];
yj[:,1]:=NeuralNetwork.Utilities.LogSig(wji*u+bj[:,1]);
ek:=[eTau1,eTau2];
E:=0.5*(eTau1^2+eTau2^2);
if E>0.01 then
// delta_wij:=0.01*u*transpose(yj)*(ones(10,1)-yj)*ek*wkj+0.9*delta_wij;
  delta_bjT:=0.01*transpose(yj)*(ones(10,1)-yj)*ek*wkj + 0.9*delta_bjT;
  delta_wjk:=0.01*yj*ek + 0.9*delta_wjk;
  delta_bkT:=0.01*ek + 0.9*delta_bkT;
  wji:=wji+transpose(delta_wij);
  bj:=bj+transpose(delta_bjT);
  wkj:=wkj+transpose(delta_wjk);
  bk:=bk+transpose(delta_bkT);
else
  break;
end if;
end while;

annotation (Placement(transformation(extent={{-140,44},{-100,84}})),
          uses(Modelica(version="3.2")), Icon(graphics={Rectangle(
      extent={{-100,-100},{100,80}},
      lineColor={0,0,255},
      lineThickness=1), Text(
      extent={{-68,20},{78,-16}},
      lineColor={0,0,255},
      lineThickness=1,
      textString="Two-LayerNeural Network")}),
Diagram(graphics));
end NN_block;