Obtain first answer of a multiple answers solve

2 views (last 30 days)
Hi, I am trying to make a program that solves power electronics equations for me to save a lot of time. Anyways, I have equations containing trigonometric functions and when I'm solving them, I get the message that MATLAB cannot find an explicit solution. I'm guessing it's because there are multiple answers (maybe infinite) to my equation, but as a matter of fact, I only need the first answer after 0. I already assumed t > 0 and now I would like to have the nearest positive solution to 0 possible. A sample of my code is below in which vGS, iD and vD are all functions of t and the rest are constants.
if true
% syms t %Temps
assume (t > 0)
syms vGS(t) %Tension Gate-Source du MOSFET en fonction du temps
syms iD(t) %Courant de Drain du MOSFET en fonction du temps
syms vD(t) %Tension Drain du MOSFET en fonction du temps
syms VDp %Tension de Drain du MOSFET de l'étape précédente
syms IDp %Courant de Drain du MOSFET de l'étape précédente
%
%
vGS(t) = (VT+VF)-VF*exp(-t/T3)*(cos(w3*t)+(sin(w3*t)/(w3*T3)));
iD(t) = gfs*VF-gfs*VF*exp(-t/T3)*(cos(w3*t)+sin(w3*t)/(w3*T3));
vD(t) = V_D-gfs*w3*Ll*VF*exp(-t/T3)*(1+(1/((w3^2)*(T3^2))))*sin(w3*t);
solt = double(solve(iD(t) == I0, t));
solt1 = double(solve(vD(t) == iD(t)*RDS_ON, t));
if(solt < solt1)
Time2 = solt;
VDp = vD(solt);
else
Time2 = solt1;
IDp = iD(solt1);
end
end
  3 Comments
Louis-Félix Baillargeon
Louis-Félix Baillargeon on 22 Aug 2018
constants. Here is my whole code:
if true
% %CONSTANTE DU CIRCUIT À DÉTERMINER
V_DR_m = 0; %Tension d'attaque minimale de la gate du MOSFET
V_DR_p = 15; %Tension d'attaque maximale de la gate du MOSFET
Rg = 5; %Résistance connectée à la gate du MOSFET
%NOTE: On assume qu'une charge inductive possède sa roue libre. Dans ce
%cas-ci, Lload correspond à une inductance couplée par exemple l'inductance
%couplée d'un Flyback ou simplement un transformateur.
Lload = 0; %Inductance de la charge COUPLÉE
L_Trace = 50*10^(-3); %Longueur de trace entre la charge et le MOSFET (po)
W_Trace = 20*10^(-3); %Largeur de la trace entre la charge et le MOSFET (po)
%NOTE: On peut considérer que H_Trace = Épaisseur PCB / (Nombre layer - 1)
H_Trace = 13.33*10^(-3); %Distance entre trace et plan de masse (po)
V_D = 100; %Tension du BUS DC
I0 = 5; %Courant DC de la charge (courant DC d'une demi-impulsion pour AC)
%
%CONSTANTE DU MOSFET À DÉTERMINER
Rg_FET = 5; %Résistance parasite de la gate de MOSFET
Cgd = 100*10^(-12); %Capacitance de Miller Drain-Gate du MOSFET
Cgs = 2000*10^(-12); %Capacitance de Miller Gate-Source du MOSFET
Llead = 10*10^(-9); %Inductance parasite de la lead du MOSFET (8nH si inconnu)
VT = 6; %Tension de mise en conduction du MOSFET (threshold)
gfs = 1; %Transconductance du MOSFET
RDS_ON = 0.001; %Résistance du MOSFET à l'état passant
%
%VARIABLES DU CIRCUIT
syms t %Temps
assume (t > 0)
syms vGS(t) %Tension Gate-Source du MOSFET en fonction du temps
syms iD(t) %Courant de Drain du MOSFET en fonction du temps
syms vD(t) %Tension Drain du MOSFET en fonction du temps
syms VDp %Tension de Drain du MOSFET de l'étape précédente
syms IDp %Courant de Drain du MOSFET de l'étape précédente
%
%--------------Calcul inductance de fuite du circuit de puissance (approx)--------------
Ltrace = 0.00508*L_Trace*(log(2*L_Trace/(W_Trace+H_Trace))+0.5+0.2235*(W_Trace+H_Trace)/L_Trace)*10^(-6);
Ll_Load = 0.05 * Lload; %Approximation de l'inductance de fuite de l'inductance couplée
Ll = Ltrace+Ll_Load+Llead*2; %Inductance de fuite approxmative du circuit
%--------------INTERVALLES DU TURN ON--------------
%INTERVALLE 1
%Mise à ON du gate driver. Intervalle se terminant lorsque
%la tension de gate atteint la tension de mise en conduction
%du MOSFET VT.
R_DR = Rg_FET+Rg;
tauG = R_DR*(Cgd+Cgs);
%
vGS(t) = ((V_DR_m-V_DR_p)*exp(-t/tauG))+V_DR_p;
solt = double(solve(vGS(t) == VT, t));
Time1 = solt;
clear solt
%
%INTERVALLE 2
%Mise à ON du MOSFET à l'atteinte de sa tension de seuil
%VT (threshold voltage)
T3 = (2*Ll*Cgd*gfs)/(Cgs);
w3 = (sqrt(4*Ll*Cgd*R_DR*gfs-(R_DR^2)*(Cgs^2)))/(2*Ll*Cgd*R_DR*gfs);
VF = V_DR_p - VT;
%
vGS(t) = (VT+VF)-VF*exp(-t/T3)*(cos(w3*t)+(sin(w3*t)/(w3*T3)));
iD(t) = gfs*VF-gfs*VF*exp(-t/T3)*(cos(w3*t)+sin(w3*t)/(w3*T3));
vD(t) = V_D-gfs*w3*Ll*VF*exp(-t/T3)*(1+(1/((w3^2)*(T3^2))))*sin(w3*t);
solt = double(vpasolve(iD(t) == I0, t, R_DR*(Cgs+Cgd)));
solt1 = double(vpasolve(vD(t) == (iD(t)*RDS_ON), t, R_DR*(Cgs+Cgd)));
if(solt < solt1)
Time2 = solt;
VDp = vD(solt);
else
Time2 = solt1;
IDp = iD(solt1);
end
end
I've succeeded to get a good answer with numeric solve, but its kind of annoying to have to give an approximate since its a code to save time and be lazy in a way.
Walter Roberson
Walter Roberson on 22 Aug 2018
solt1 appears to have no real-valued solutions. V_D would have to be smaller for a solution. Roughly 8.9 at most, it looks to me.

Sign in to comment.

Accepted Answer

Louis-Félix Baillargeon
Louis-Félix Baillargeon on 22 Aug 2018
You are right! I just verified with my TI Nspire and as you say I've done something wrong. Thanks!

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!