Как уже упоминал Матти, используйте встроенный код. Я не тестировал следующее решение, потому что для меня было бы слишком много работы, чтобы скопировать все вручную.
Прежде всего 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;