Вопрос по – Как переопределить уравнения по умолчанию?

1

Все производные классы должны наследовать некоторые уравнения по умолчанию от своего базового класса. Если уравнение по умолчанию недопустимо для производного класса, его следует переопределить. Этот минималистичный пример ниже несколько глупый.

Я на правильном пути, чтобы достичь вышеупомянутой цели? Или есть лучший способ выразить это на языке Modelica?

<code>package Pkg

  partial class Equations
    Real x;
  end Equations;

  class DefaultEquations
    extends Equations;
    equation
      x = 0.0;
  end DefaultEquations;

  class Base
    replaceable class T = DefaultEquations;
    replaceable T equations extends Equations;
  end Base;

end Pkg;

model TestEquations

  import Pkg.*;

  class CustomEquation
    extends Equations;
    equation
      x = 3;
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare class T = CustomEquation);
  end CustomizedClass;

  CustomizedClass customized;

end TestEquations;
</code>

Ваш Ответ

1   ответ
3

Если я понимаю вашу цель, есть очень простой способ сделать это. Рассмотрим эту альтернативу:

package Pkg
  partial class Equations
    Real x;
  end Equations;

  class DefaultEquations
    extends Equations(x=0);
  end DefaultEquations;

  class Base
    replaceable class T = DefaultEquations;
    replaceable T equations extends Equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  class CustomEquation
    extends Equations(x=3);
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare class T = CustomEquation);
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

Но вы можете упростить его еще больше, если вы хотите устранить все переопределения:

package Pkg
  class Equations
    Real x;
  end Equations;

  class Base
    Equations equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  class CustomizedClass
    extends Base(equations(x=3));
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

... и еще больше, если вам не нужны все уровни наследования:

package Pkg
  class Equations
    Real x;
  end Equations;
end Pkg;

model TestEquations
  import Pkg.*;

  Equations equations(x=3);
end TestEquations;

Эти модификации (x=3 части) работают для переменных так же, как для параметров. Таким образом, вы можете взять «уравнение инициализации»; для любой переменной (часть, которая появляется после объявления переменной) и переопределить. Ограничение этого подхода состоит в том, что он не позволяет переопределять общие уравнения, просто уравнения, которые явно решают одну переменную.

Update (May 2nd, 2012)

Если вам нужно работать с общими уравнениями (включая возможность введения внутреннего состояния), вам также придется решать проблему «балансировки». уравнения. То есть Modelica (v 3+) включает в себя определенную семантику того, что считается частичной (неинстанцируемой) моделью, а не частичной моделью. Дело в том, что вам нужно предоставить компилятору достаточно информации о том, что будет вычислено внутри и что будет предоставлено извне, чтобы он мог определить, является ли определение действительно частичным или нет.

В общем, вы должны определить частичную модель / блок для описания потенциальных внешних взаимодействий, а затем использовать заменяемые компоненты для подстановки уравнений. На основе вашего исходного примера это может выглядеть примерно так:

package Pkg
  partial block Equations
    input Real y; // Input for any information it will need in the calculation
    output Real x; // Output to indicate something the model will compute
  end Equations;

  block DefaultEquations
    extends Equations;
  equation
    x = 0;
  end DefaultEquations;

  class Base
    replaceable DefaultEquations equations constrainedby Equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  block CustomEquation
    extends Equations
  equation
    x*x + y*y = 25.0; // example of non explicit equation
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare CustomEquation equations);
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

Я должен добавить, что (по крайней мере, в вашем примере выше), вы могли бы полностью устранитьBase а такжеCustomizedClass, Но я оставил их, потому что я предполагаю, что они каким-то образом соответствуют вашей реальной проблеме. Наконец, я никогда не используюclass в реальном коде (я пытаюсь быть более конкретным), поэтому я изменил некоторые из ваших определений наblock определения.

Error: User Rate Limit Exceeded Ali
Error: User Rate Limit Exceeded Ali

Похожие вопросы