Filter löschen
Filter löschen

Info

Diese Frage ist geschlossen. Öffnen Sie sie erneut, um sie zu bearbeiten oder zu beantworten.

Reinitialization for a piecewise-defined DAE set of equations

2 Ansichten (letzte 30 Tage)
Nicolas Mira Gebauer
Nicolas Mira Gebauer am 19 Okt. 2020
Geschlossen: MATLAB Answer Bot am 20 Aug. 2021
I am trying to model an electrical thyristor, which has the following switching equations:
ON-status: Vak >= Vf & vg > Vgt; or when Iak > Il
OFF-status: Else
For this, I am modelling a piecewise function as follows:
sCond = piecewise(Vak >= Vf & vg > Vgt | Iak > Il, 1, 0);
So, when sCond is 1, the status is ON; and when sCond is 0, the status is OFF.
By having such piecewise-defined function, I can use it to multiply it in my electric system's equations, which are strategically defined so that when sCond = 1, I will obtain a DAE system for the ON topology, and when sCond = 0, I will obtain a different DAE system which represents the OFF topology.
e =
piecewise(1/10000 < i_L2(t) | 0 <= u_KL1(t) - u_KL2(t), (50*sin(100*pi*t))/pi + i_L1(t)/(100*pi) + (91*i_L2(t))/(100*pi) - (20*u_KL1(t))/pi + (10*u_KL2(t))/pi, (50*sin(100*pi*t))/pi + i_L1(t)/(100*pi) - (10*u_KL1(t))/pi)
piecewise(1/10000 < i_L2(t) | 0 <= u_KL1(t) - u_KL2(t), i_L3(t)/(10*pi) - (91*i_L2(t))/(100*pi) + (10*u_KL1(t))/pi - (20*u_KL2(t))/pi, i_L3(t)/(10*pi) - (91*i_L2(t))/(100*pi) - (20*u_KL2(t))/pi)
u_KL1(t) - i_L1(t)/1000 - 5*sin(100*pi*t)
piecewise(1/10000 < i_L2(t) | 0 <= u_KL1(t) - u_KL2(t), u_KL1(t) - (91*i_L2(t))/1000 - u_KL2(t), - (91*i_L2(t))/1000 - u_KL2(t))
u_KL2(t) - i_L3(t)/100
%Thus, when the sCond = 0, e would be:
L1*diff(i_L1(t), t) + RL1*i_L1(t) == u_KL1(t) - US*sin(phiS + 2*pi*f*t)
L2*diff(i_L2(t), t) + RL2*i_L2(t) == -u_KL2(t)
L3*diff(i_L3(t), t) + RL3*i_L3(t) == u_KL2(t)
u_KL1(t)/(2*L1*f*pi) == (US*sin(phiS + 2*pi*f*t))/(2*L1*f*pi) + (RL1*i_L1(t))/(2*L1*f*pi)
u_KL2(t)*(1/(2*L2*f*pi) + 1/(2*L3*f*pi)) == (RL3*i_L3(t))/(2*L3*f*pi) - (RL2*i_L2(t))/(2*L2*f*pi)
%Otherwise, when sCond = 1, e would be:
L1*diff(i_L1(t), t) + RL1*i_L1(t) == u_KL1(t) - US*sin(phiS + 2*pi*f*t)
L2*diff(i_L2(t), t) + RL2*i_L2(t) == u_KL1(t) - u_KL2(t)
L3*diff(i_L3(t), t) + RL3*i_L3(t) == u_KL2(t)
u_KL1(t)*(1/(2*L1*f*pi) + 1/(2*L2*f*pi)) - u_KL2(t)/(2*L2*f*pi) == (US*sin(phiS + 2*pi*f*t))/(2*L1*f*pi) + (RL1*i_L1(t))/(2*L1*f*pi) + (RL2*i_L2(t))/(2*L2*f*pi)
u_KL2(t)*(1/(2*L2*f*pi) + 1/(2*L3*f*pi)) - u_KL1(t)/(2*L2*f*pi) == (RL3*i_L3(t))/(2*L3*f*pi) - (RL2*i_L2(t))/(2*L2*f*pi)
It's all working well, except for one thing.
I am not being able to correctly reinitialize the variables when an event is detected (when sCond changes from 0 to 1 or viceversa). In fact, my code is only works when I manually change the initial values at each event-reinitialization using the values that I previously know that should be consistent, but I need to do it automatically for when I expand my problem. Is there a formal way to do this? I tried using decic() by giving it the previous's step values but apparently it does not recognize that the DAE set of equations e is changing from ON to OFF, thus it tries to use these previous's step values and thus says that it needs a better guess.
  1 Kommentar
Nicolas Mira Gebauer
Nicolas Mira Gebauer am 20 Okt. 2020
I forgot to mention that the change of state (from ON to OFF) produces a discontinuity on the variables.

Antworten (0)

Diese Frage ist geschlossen.

Produkte


Version

R2017a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by