【问题标题】:How can i fix this problem? There are 4 redundant equations我该如何解决这个问题?有4个冗余方程
【发布时间】:2022-10-21 04:55:00
【问题描述】:

太容易了,但我无法修复它。非常感谢。

错误:
有4个冗余方程

代码:

model Test1
  Real T[4];
  Real S[3];
  Real alpha;
  Real beta;
equation 
  T[1] = 5;
  for i in 1:3 loop 
    if T[i] > 2 then 
      alpha = 2;
      beta = 1;
    else
      alpha = 1;
      beta = 2;
    end if;
    S[i] = T[i] - 1;
    T[i + 1] = T[i] - (alpha * 2) / (2 * S[i] + beta);
  end for;
end Test1;

【问题讨论】:

    标签: modelica


    【解决方案1】:

    您有多个“分配”给alphabeta

    for 循环的每次迭代中,都会为alphabeta 设置一个新方程,导致4 个太多。

    解决方法将使用“算法”部分而不是“方程式” 这将根据您的需要在局部平衡变量和方程。

    model Test1
      Real T[4];
      Real S[3];
      Real alpha;
      Real beta;
    algorithm 
      T[1] := 5;
      for i in 1:3 loop
        if T[i] > 2 then
          alpha := 2;
          beta := 1;
        else
          alpha := 1;
          beta := 2;
        end if;
        S[i] := T[i] - 1;
        T[i + 1] := T[i] - (alpha*2)/(2*S[i] + beta);
        T[i + 1] := T[i];
      end for;
    end Test1;
    

    【讨论】:

    • 哦,我明白了,非常感谢你,还有一个问题,这段代码是一个测试,如果它是T[100] 或更多,我可以在for 循环中分配alphabeta
    • 如果您想在equation 部分的循环中分配alphabeta,它们的大小必须与T 相同。
    【解决方案2】:

    如果您使用equation-section(参见MBE: equations),您需要确保您拥有相同数量的方程和未知数/变量。在您的代码中,alphabeta 并非如此。原因是,这些只是两个变量,但对于每个变量,for-loop 中会生成三个方程。所以你有六个方程和两个未知数,这是四个冗余方程的差。

    有多种方法可以解决此问题:

    1.平衡方程的数量

    通过只为alphabeta 生成一个方程:您需要根据向量T[:] 的哪个条目来决定if 语句应分配变量。使用条目 3,这可能类似于以下代码:

    model Test1
      Real T[4];
      Real S[3];
      Real alpha;
      Real beta;
    
    equation 
      T[1] = 5;
      
      for i in 1:3 loop
        S[i] = T[i] - 1;
        T[i + 1] = T[i] - (alpha * 2) / (2 * S[i] + beta);
      end for;
      
      if T[3] > 2 then
        alpha = 2;
        beta = 1;
      else
        alpha = 1;
        beta = 2;
      end if;  
        
    end Test1;
    

    2.使用作业

    除了生成方程,Modelica 还可以处理命令式代码。这样,变量可以被多次赋值,只有最后一次赋值设置当前时间步的值。

    下面的algorithm 将两次覆盖alphabeta 的值,并使用上次分配的值。

    model Test1
      Real T[4];
      Real S[3];
      Real alpha;
      Real beta;
    
    algorithm 
      T[1] :=5;
    
      for i in 1:3 loop
        if T[i] > 2 then
          alpha :=2;
          beta :=1;
        else
          alpha :=1;
          beta :=2;
        end if;
    
        S[i] :=T[i] - 1;
        T[i + 1] :=T[i] - (alpha*2)/(2*S[i] + beta);
    
      end for;
    end Test1;
    

    笔记

    通常,最好使用equations 而不是algorithm。如果分配的顺序很重要,算法是正确的方法。 可以在here 找到更多信息。

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 2020-02-14
      • 2021-07-31
      • 2020-12-28
      • 2019-12-03
      • 2020-09-20
      相关资源
      最近更新 更多