Я хочу смоделировать контроллер для модели масса-пружина, которая работает на основе энергии:
model model
//constants
parameter Real m = 1;
parameter Real k = 1;
parameter Real Fmax = 3;
parameter Real x0 = 1;
parameter Real x1 = 2;
parameter Real t1 = 1;
//variables
Real x, v, a, xy, vm;
initial equation
x = x0;
v = 2;
equation
v = der(x);
a = der(v);
m * a + k * x = F;
algorithm
vm := sign(xy - x)*sqrt(2 * (Fmax * abs(xy - x) + k * (xy^2 - x^2) / 2) / m);
// step signal
if time < t1 then
xy := x0;
else
xy := x1;
end if;
if xy == x then
F := k * x;
else
F := sign(vm - v) * Fmax;
end if;
end model;
Но это приводит к сообщению об ошибке:
Ошибка перевода
Произошла ошибка при выравнивании модели
Я был бы признателен, если бы вы могли помочь мне узнать, в чем проблема и как я могу ее исправить.
P.S.1. SIMULINK также не может завершиться!
P.S.2. Новую версию кода можно увидеть здесь.
//variables
, код будет работать в Dymola. В качестве примечания:xy==y
рекомендуется делать с некоторым допуском. Также может быть опасно давать модели имяmodel
... - person Markus A.   schedule 20.02.2019Translation Warning In component <NO COMPONENT>, in relation xy == x, == on Real numbers is only allowed inside functions.
, и оно застревает на 18%! - person Foad   schedule 20.02.2019if xy == x then
наif abs(xy - x) < 1e-6 then
должна выполнить работу, которую вы планировали. Конечно, вы можете настроить1e-6
под свои нужды. Один документ, который я нашел после быстрого поиска, это docs.microsoft.com/en-us/dotnet/api/. Это должно объяснить проблему довольно хорошо (хотя я не прочитал ее полностью)... - person Markus A.   schedule 20.02.2019v
иvm
имеют одинаковые значения. Трудно сказать, не полностью понимая модель (что не совсем просто, просто глядя на уравнения)... - person Markus A.   schedule 20.02.2019vm
— максимальная скорость массы, при которой кинетическая энергия может быть поглощена пружиной и внешней силой до достижения целиxy
. в основном контроллер проверяет кинетическую энергию, если она меньше, чем требуется, чтобы добраться до точки так быстро, как может двигаться система, он наливает энергию, в противном случае, если ее слишком много, он замедляется, чтобы достичь этой максимальной скорости. - person Foad   schedule 20.02.2019Simulation Interval > Interval > 0.01
2.Integration > euler
- person Foad   schedule 20.02.2019