On considère un circuit linéaire comportant N noeuds et on note Vi le potentiel électrique du noeud i. Le circuit comporte une source de tension idéale (l'entrée du filtre) dont le potentiel sera pris par convention égal à 1. Par définition, la masse est un noeud du circuit dont le potentiel est nul.
Pour un noeud k auquel sont attachés des dipôles linéaires passifs, la loi des noeuds s'écrit :
où la somme porte sur les noeuds reliés au noeud k par un dipôle d'admittance Yi. Les admittances dont définies comme des fonctions de la variable s=jω.
Le système d'équations linéaires pour les potentiels se met sous la forme AV+B=0 où A est une matrice de fractions rationnelles, V et B deux vecteurs colonnes. La ligne k de la matrice A correspond au noeud k.
L'ajout d'une source de tension continue (constante) entre les noeuds na et nb introduit pour ces deux noeuds l'équation :
Une source de tension commandée en tension (STCT) entre les noeuds na et nb, commandée par la la d.d.p. entre les noeuds nx et ny, introduit l'équation :
pour les noeuds na et nb.
Si la sortie du filtre est la tension au noeud ns, la transmittance de Laplace du filtre est le potentiel de ce noeud :
La réponse en régime sinuoïdal est donnée par la fonction de transfert :
On suppose qu'à l'instant initial t=0 les condensateurs sont déchargés et les inductances n'ont pas de courant. Dans ce cas, la transformée de Laplace du signal de sortie est :
où est la transformée de Laplace du signal d'entrée. Pour un échelon de tension appliqué en entrée, on a :
La réponse impulsionnelle s'obtient avec :
Module scilab : télécharger.
Les fonction suivantes transforment soit la matrice A seulement, soit les matrices A et B. Les sources de tension doivent être définies après les dipôles passifs car elles désactivent la loi des noeuds.
function [P]=ajouter_dipole(A,na,nb,Y) P=A P(na,na)=P(na,na)+Y P(na,nb)=P(na,nb)-Y P(nb,nb)=P(nb,nb)+Y P(nb,na)=P(nb,na)-Y endfunction
Ajout de dipôles passifs particuliers :
function [P]=ajouter_resistance(A,na,nb,R) P=ajouter_dipole(A,na,nb,1/R) endfunction function [P]=ajouter_capacite(A,na,nb,C) P=ajouter_dipole(A,na,nb,poly(0,'s')*C) endfunction function [P]=ajouter_inductance(A,na,nb,L) P=ajouter_dipole(A,na,nb,1/(poly(0,'s')*L)) endfunction
Ajout d'une source de tension continue :
function [P,Q]=ajouter_source_tension_continue(A,B,na,nb,U) P=A Q=B N=size(P,'c') P(na,:)=zeros(1,N) P(nb,:)=zeros(1,N) P(na,na)=1 P(na,nb)=-1 Q(na)=-U P(nb,nb)=-1 P(nb,na)=1 Q(nb)=-U endfunction
Ajout d'une source de tension commandée en tension :
function [P,Q]=ajouter_source_STCT(A,B,na,nb,nca,ncb,g) P=A Q=B N=size(P,'c') P(na,:)=zeros(1,N) P(nb,:)=zeros(1,N) P(na,na)=1 P(na,nb)=-1 P(na,nca)=-g P(na,ncb)=g Q(na)=0 P(nb,nb)=-1 P(nb,na)=1 P(nb,nca)=-g P(nb,ncb)=g Q(nb)=0 endfunction
Ajouter une masse, c.a.d. annuler un potentiel :
function [P,Q]=ajouter_masse(A,B,n0) P=A Q=B P(n0,:)=zeros(1,size(P,'c')) P(n0,n0)=1 Q(n0)=0 endfunction
Si ne désigne le noeud de l'entrée du filtre, on pose Vne=1. De cette manière, le potentiel Vk donne directement la fonction de transfert obtenue en plaçant la sortie sur le noeud k :
function [P,Q]=definir_entree(A,B,ne) P=A Q=B N=size(P,'c') P(ne,:)=zeros(1,N) P(ne,ne)=1 Q(ne)=-1 endfunction
Pour chaque pulsation ω, la matrice de fractions rationnelles A est évaluée avec la fonction horner, puis le système est résolu.
function [w,db,phi]=reponse(A,B,noeud,lgmin,lgmax,np) w=logspace(lgmin,lgmax,np) H=w for i=1:np, M=horner(A,%i*w(i)) [x0,ker]=linsolve(M,B) H(i)=x0(noeud) end; [db,phi]=dbphi(H) endfunction
Soit le circuit RLC suivant :
Figure pleine pageLa fonction suivante définie le circuit :
getf('simulineaire.sci'); function [A,B]=circuitRLC(R,L,C) N=4 A=zeros(N,N) B=zeros(N,1) A=ajouter_resistance(A,1,2,R) A=ajouter_inductance(A,2,3,L) A=ajouter_capacite(A,3,4,C) [A,B]=ajouter_masse(A,B,4) [A,B]=definir_entree(A,B,1) endfunction
Définition du circuit et tracé du diagramme de Bode pour le noeud 3
[A,B]=circuitRLC(10,1e-3,1e-6); [w,db,phi]=reponse(A,B,3,2,6,200);
plot1=scf(); plot2d(w,db,style=5,logflag='ln'); xtitle('Circuit RLC','log f','GdB');plot1.pdf
plot2=scf(); plot2d(w,phi,style=5,logflag='ln'); xtitle('Circuit RLC','log f','phi');plot2.pdf
Module Mathematica : télécharger.
ajouterDipole[A_,na_,nb_,Y_]:=Module[{P}, P=A; P[[na,na]]=P[[na,na]]+Y; P[[na,nb]]=P[[na,nb]]-Y; P[[nb,nb]]=P[[nb,nb]]+Y; P[[nb,na]]=P[[nb,na]]-Y; Return[P]; ] ajouterResistance[A_,na_,nb_,R_]:=ajouterDipole[A,na,nb,1/R]; ajouterCapacite[A_,na_,nb_,C_]:=ajouterDipole[A,na,nb,C*s]; ajouterInductance[A_,na_,nb_,L_]:=ajouterDipole[A,na,nb,1/(L*s)]; ajouterSourceTensionContinue[A_,B_,na_,nb_,U_]:=Module[{P,Q,d,n}, P=A; Q=B; d = Dimensions[A]; n = d[[2]]; P[[na]]=Table[0,{n}]; P[[nb]]=Table[0,{n}]; P[[na,na]]=1; P[[na,nb]]=-1; P[[nb,nb]]=-1; P[[nb,na]]=1; Q[[nb]]=-U; Return[{P,Q}]; ] ajouterSourceTensionSTCT[A_,B_,na_,nb_,nx_,ny_,g_]:=Module[{P,Q,d,n}, P=A; Q=B; d = Dimensions[A]; n = d[[2]]; P[[na]]=Table[0,{n}]; P[[nb]]=Table[0,{n}]; P[[na,na]]=1; P[[na,nb]]=-1; P[[nb,nb]]=-1; P[[nb,na]]=1; P[[na,nx]]=-g; P[[na,ny]]=g; P[[nb,nx]]=-g; P[[nb,ny]]=g; Q[[nb]]=0; Return[{P,Q}]; ] ajouterMasse[A_,B_,n0_]:=Module[{P,Q,d,n}, P=A; Q=B; d = Dimensions[A]; n = d[[2]]; P[[n0]]=Table[0,{n}]; P[[n0,n0]]=1; Q[[n0]]=0; Return[{P,Q}]; ] definirEntree[A_,B_,ne_]:=Module[{P,Q,d,n}, P=A; Q=B; d = Dimensions[A]; n = d[[2]]; P[[ne]]=Table[0,{n}]; P[[ne,ne]]=1; Q[[ne]]=-1; Return[{P,Q}]; ]
Transmittance de Laplace pour une sortie sur le noeud ns :
transfert[A_,B_,ns_]:=Module[{v}, v=LinearSolve[A,-B]; Return[v[[ns]]]; ]
bodeGain[h_,lgmin_,lgmax_,Gmin_,Gmax_]:=Module[{}, Return[Plot[20*Log[10,Abs[h/.{s->I*2*Pi*10^p}]],{p,lgmin,lgmax},PlotRange->{{lgmin,lgmax},{Gmin,Gmax}},AxesLabel->{"log f","GdB"}]]; ] bodePhase[h_,lgmin_,lgmax_]:=Module[{}, Return[Plot[180/Pi*Arg[h/.{s->I*2*Pi*10^p}],{p,lgmin,lgmax},AxesLabel->{"log f","phi"}]]; ]
La fonction suivante prend en argument la transmittance de Laplace et le temps maximal, et renvoit la courbe de réponse temporelle :
reponseEchelon[h_,tmax_,vmin_,vmax_]:=Module[{r}, r=InverseLaplaceTransform[h/s,s,t]; Return[Plot[r/.{t->temps},{temps,0,tmax},PlotRange->{{0,tmax},{vmin,vmax}},AxesLabel->{"t","V"}]]; ]
On définit de même la réponse imulsionnelle :
reponseImpulsion[h_,tmax_,vmin_,vmax_]:=Module[{r}, r=InverseLaplaceTransform[h,s,t]; Return[Plot[r/.{t->temps},{temps,0,tmax},PlotRange->{{0,tmax},{vmin,vmax}},AxesLabel->{"t","V"}]]; ]
On reprend l'exemple traité plus haut :
Get['simulineaire.m']; circuitRLC[R_,L_,C_]:=Module[{A,B,n}, n=4; A=Table[0,{n},{n}]; B=Table[0,{n}]; A=ajouterResistance[A,1,2,R]; A=ajouterInductance[A,2,3,L]; A=ajouterCapacite[A,3,4,C]; {A,B}=ajouterMasse[A,B,4]; {A,B}=definirEntree[A,B,1]; Return[{A,B}]; ] {A,B}=circuitRLC[10,10^-3,10^-6];
Fonction de transfert pour le noeud 3 :
h=transfert[A,B,3]
1000000000/(1000000000 + 10000*s + s^2)
Diagramme de Bode :
bodeGain[h,2,6,-80,20]plot3.pdf
bodePhase[h,2,6]plot4.pdf
Réponse à un échelon :
reponseEchelon[h,2*10^-3,0,2]plot5.pdf
Le calcul peut être fait de manière formelle :
{A,B}=circuitRLC[R,L,C]; h=transfert[A,B,3]/.s->I*omega