2013-07-12 5 views
0

Я новичок в Modelica, и мне интересно, можно ли написать какое-то уравнение динамического программирования. Предположим, что время дискретизируется целым числом i, а в моем конкретном приложении x является логическим, а f является булевой функцией от x.Modelica Time Dependent Equations

x(t_i) = f(x(t_{i+d})) 

Где d может быть положительным или отрицательным целым числом. Конечно, я бы инициализировал x соответственно, либо true, либо false.

Любая помощь или рекомендации были бы высоко оценены!

ответ

2

Это возможно. В Modelica дискретизация во времени обычно выполняется компилятором, вам нужно позаботиться об уравнениях (непрерывная динамика). В противном случае, если вы хотите генерировать события в отдельные моменты времени, вы можете сделать это, используя инструкции. Я предлагаю вам взглянуть на Introduction to Object-Oriented Modeling and Simulation with OpenModelica (PDF format, 6.6 MB) - более свежий урок (2012) от Peter Fritzson. Существует раздел, посвященный дискретным событиям и гибридным системам, который должен прояснить, как реализовать ваши уравнения в Modelica. Ниже вы можете найти пример из этого урока о модели прыгающего шара, поскольку вы можете видеть, что дискретация во времени не учитывается при написании динамических уравнений. Таким образом, непрерывная модель шара у = дера (ы), а = дер (v) и чем дискретная часть внутри когда это п, обрабатывающий контакт с землей:

model BouncingBall "the bouncing ball model" 
    parameter Real g=9.81; //gravitational acc. 
    parameter Real c=0.90; //elasticity constant 
    Real height(start=10),velocity(start=0); 
equation 
    der(height) = velocity; 
    der(velocity)=-g; 
    when height<0 then 
    reinit(velocity, -c*velocity); 
    end when; 
end BouncingBall; 

Надеется, что это помогает, Marco

0

Если я понимаю ваш вопрос, вы хотите использовать последние n оценки x, чтобы определить следующее значение x. Если да, то этот код показывает, как это сделать:

model BooleanHistory 
    parameter Integer n=10 "How many points to keep"; 
    parameter Modelica.SIunits.Time dt=1e-3; 
protected 
    Boolean x[n]; 
    function f 
    input Integer n; 
    input Boolean past[n-1]; 
    output Boolean next; 
    algorithm 
    next :=not past[1]; // Example 
    end f; 
initial equation 
    x = {false for i in 1:n}; 
equation 
    when sample(0,dt) then 
    x[2:n] = pre(x[1:(n-1)]); 
    x[1] = f(n, x[2:n]); 
    end when; 
end BooleanHistory;