Операторы событий: noEvent - PullRequest
0 голосов
/ 05 января 2020

Я использую Dymola для моделирования электрической цепи.

Когда я моделирую модель, показанную ниже, я получаю следующие ошибки (это потому, что, когда время = 1 >>> u будет u = 1 -time (1) = 0

, и это не может быть правильным в уравнении (Vb / (- u))) (Vb / 0)

, но я включил операторы noEvent, он должен перехватывать значения за пределами области определения, но я все равно получаю те же ошибки. Может ли кто-нибудь помочь?

code

log

code - noEvent

log - noEvent

1 Ответ

3 голосов
/ 05 января 2020

Как уже упоминал Матти, используйте встроенный код. Я не тестировал следующее решение, потому что для меня было бы слишком много работы, чтобы скопировать все вручную.

Прежде всего noEvent() только означает, что никакие пересечения нуля не будут проверяться для этого прерывистого изменения. В качестве небольшого примера, скажем, значение u превышает заданный порог где-то между t = 0.001 и t = 0.002, который (в этом примере) является одним временным шагом, предпринятым интегратором. Обычно интеграция прекращается, и инициируется процесс поиска, который ищет точный (с учетом погрешности) момент времени, когда событие действительно происходит. После этого процесс итерации будет возобновлен с этого момента. noEvent() останавливает это и не выполняет поиск, а просто регулярно работает. В некоторых случаях это может избежать ошибки, которую вы получаете по чистой случайности, но в этом случае это происходит в t = 1, который, кажется, все еще является частью траектории итерации.

Для деления на ноль ошибок, подобных этой, я всегда будет использовать эпсилон толерантность. Измените условие с u > 0 на что-то вроде u > e-6, и оно должно работать нормально.

И, пожалуйста, действительно прочитайте это: Как спросить

РЕДАКТИРОВАТЬ: Рабочий код

model switchedRLC " RLC Schaltungsmodell "
  constant Real e= 0.000001;
  type Voltage=Real(unit="V");
  type Current=Real(unit="A");
  type Resistance=Real(unit="Ohm");
  type Capacitance=Real(unit="F");
  type Inductance=Real(unit="H");
  parameter Voltage Vb=380 "Battery voltage";
  parameter Inductance L = 1;
  parameter Resistance R = 100;
  parameter Capacitance C = 1e-3;
  Real x;
  Voltage Vs;
  Voltage V;
  Current i_L;
  Current i_R;
  Current i_C;

equation 
  x=1-time;
  Vs = if x > -e then 0 else Vb/(-x);
  i_R = V/R;
  i_C = C*der(V);
  i_L=i_R+i_C;
  L*der(i_L) = (Vs-V);
end switchedRLC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...