Opérations sur fonctions de transfert / système d'état

Répondre
Partager Rechercher
Bonjour,

J'ai une question mathématique, j'ai un système sous représentation du type:

dX/dt = AX + Bu, ou A est une matrice 4x4 et avec X=[u,w,q,h].

J'ai également: y = dw/dt - k.q, et je dois déterminer la fonction de transfert y/u.

La première approche consiste à utiliser des matrices C = I et D = 0 pour déterminer les fonctions de transfert w/u et q/u puis, avec matlab ou à la main, les dénominateurs étant égaux:

Code:
F_y = tf([F_w.num{1} 0] - k*F_q3.num{1},F_q3.den{1});
J'ai essayé de faire autrement, n'ayant pas besoin de sortir q, j'ai écrit C de cette façon:

C(3,:) = [A(2,1), A(2,2), A(2,3)-k, A(2,4)], ainsi C(3,:).X et D(3,1) = B(2,1) est supposé me donner CX + Du (ligne 3) = dw/dt - kq.

Les deux façons de faire calculées avec matlab me donnent des résultats différents ... je suis donc dans l'erreur à un moment ou à un autre ... mais je ne comprends pas ou.

PS: j'aurais aimé utiliser Tex, mais je n'arrive à pas grand chose de lisible, désolé !

PPS: A priori, c'est le calcul en modifiant la sortie du système d'état qui est bon, tant mieux car ça me paraissait le plus logique.

Dernière modification par Zangdar MortPartout ; 20/10/2015 à 05h25.
Message supprimé par son auteur.
Citation :
Publié par Tramp
J'ai toujours utilisé la fonction fft et pas tf, ça fait quoi quand tu fait tf(a,b) ;?
Il transforme a et b ?
Sinon une de tes deux formules doit être fausse mais si tu pouvais poser ça sur papier ça serait quand même vachement plus clair pour nous.

Quand tu plot les deux ça te donne quoi ?
J'ai fait ça vite fait:

2015-10-19 20.22.32.jpg

J'ai pas encore les plot car je suis en train de modifier le code pour sortir d'autres valeurs directement des matrices, mais je pourrais revenir à l'ancienne version. Dans tous les cas les deux FT sont différentes donc les plots seront différents

Edit: plus précis:

ss.png

L'idée, c'est que si je me contente des 4 premiers états et ne sors que les 4 premières sorties, je peux calculer les valeurs des autres sorties dans le domaine temporel de deux façons:

- Soit avec un modèle simulink qui reconstruit le signal à partir des 4 premiers.
- Soit en jouant avec les fonctions de transfert

En l’occurrence, la FT qui m'intéresse particulièrement est az, et le code matlab que j'ai montré plus haut ne donne pas le bon résultat alors que l'équation me semble la même:

Code:
F_az = tf([F_w.num{1} 0] - k*F_q.num{1},F_q.den{1});

Dernière modification par Zangdar MortPartout ; 20/10/2015 à 05h27.
Message supprimé par son auteur.
Ma première approche aurait été de résoudre le problème numériquement, et de me demander si ce n'est pas suffisant Alors ok, ça revient à botter en touche, et c'est une technique de gros feignant, mais des fois c'est suffisant, non ?
Tu veux dire quoi par numériquement ? Tu as besoin de calculer les fonctions d'une façon ou d'une autre sinon tu n'as pas de résolution.

Sinon dans le fond, je ne cherche pas vraiment à résoudre (c'est fait), je cherche surtout à comprendre ce qui cloche dans ma seconde approche. Ici le système est linéaire donc je suis supposé être capable de jouer de cette façon avec les fonctions de transfert. Et le cas pourrait se représenter sans que j'ai l'envie de mettre le système sous forme de représentation d'état.

Dernière modification par Zangdar MortPartout ; 20/10/2015 à 14h16.
Tiens oui c'est marrant, en dimension 1 les deux cas donnent la même chose :


- si on mesure pour obtenir :



- si on mesure directement :



or

Je me demande si c'est pas la même chose en dimension 4, sauf que les simplifications sont un peu moins triviales ?

edit : je viens de vérifier en dimension 2 et on trouve également le même résultat avec les deux méthodes.
Pour le prouver faudrait aller fouiller dans l'expression analytique de donc je crois que deux exemples suffiront bien

Dernière modification par kermo ; 20/10/2015 à 17h39.
Citation :
Publié par Zangdar MortPartout
Tu veux dire quoi par numériquement ? Tu as besoin de calculer les fonctions d'une façon ou d'une autre sinon tu n'as pas de résolution.
Tu as deux façons de résoudre de tels problèmes: l'approche analytique et l'approche numérique.

Si tu as tous les coefficients de ta matrice, tes paramètres et tes conditions initiales, tu peux calculer numériquement X(t) et y(t) en faisant le calcul numérique "à la main" pour chaque delta t.

C'est la grande différence du calcul analytique et du calcul numérique. Dans le premier cas, tu essais de dégager des règles simples en fonction des paramètres et des conditions de départ (comme les fonctions de transfert par exemple). Dans le second cas, tu calcules directement l'évolution de tes variables (ici X et y fonctions de t). Pour le dire simplement, le calcul numérique calcule avec des nombres, pas avec des lettres. A la fin, tu obtiens un résultat, mais il est impossible de prévoir le résultat pour d'autres paramètres, d'autres conditions initiales, ou pour des temps ultérieurs.

Edit:// Ce que j'appelle "calcul analytique" est plutôt appelé "calcul formel" en fait.
Oui enfin le calcul numérique je peux pas le faire, c'est un peu complexe comme calculs

C'est Matlab qui le fait pour moi. Et pour ça, j'ai besoin de lui donner les bonnes équations. Ça je le fais soit en modifiant mon système d'état (ce que j'ai fait), pour faire apparaitre les sorties que je veux (et je simule ensuite avec simulink), soit je garde le système tel quel et je dois calculer les fonctions qui me manquent.

Ce qui laisse toujours mon interrogation en suspend: pourquoi la détermination de f(az,e) en utilisant la fonction "tf" de façon linéaire, ne donne pas le bon résultat.
Je me demande s'il n'y a pas des pôles et des zéros qui se compensent que tu donnes la fonction de transfert sous forme numérateur/dénominateur.

J'ai relancé un calcul en symbolique et on trouve bien que Y/U est le même dans les deux cas :
Code:
import sympy as sp

n = 4
s,k = sp.var(['s', 'k'])
Al = []
Bl = []
for i in xrange(n):
    Bl.append([sp.var('b'+ str(i))])
    Al.append([sp.var('a' + str(i) + str(j)) for j in xrange(n)])
A = sp.Matrix(Al)   # A = [[a00,a01,...],...,[...,akk]]
B = sp.Matrix(Bl)   # B = [b0,b1,...,bk]^t
X = (s*sp.eye(n) - A).inv()*B   # for u = 1

# we want to find dx1/dt + k.x2

# method 1: Y(s) = s.X1 + k.X2
Y1 = sp.simplify(s * X[0,0] + k*X[1,0])

# method 2: Y as a measurement with dx1/dt = A1.X + B1.u and k.x2 = k.x2
C = A[0,:].copy()
C[0,1] += k
D = sp.Matrix([[B[0,0]]])
Y2 = sp.simplify(C*X + D)[0,0]

print sp.simplify(Y1-Y2) # prints 0
Message supprimé par son auteur.
Citation :
Publié par Zangdar MortPartout
Oui enfin le calcul numérique je peux pas le faire, c'est un peu complexe comme calculs

C'est Matlab qui le fait pour moi. Et pour ça, j'ai besoin de lui donner les bonnes équations. Ça je le fais soit en modifiant mon système d'état (ce que j'ai fait), pour faire apparaitre les sorties que je veux (et je simule ensuite avec simulink), soit je garde le système tel quel et je dois calculer les fonctions qui me manquent.
Quand je dis "à la main", c'est via Matlab/Python/...
Le calcul ne me parait pas si complexe que ça: tu as deux systèmes linéaires indépendants (si j'ai bien compris, y ne dépend pas de X). Si tu connais les coefficients de A, de B et le paramètre k, tu peux résoudre X(t) et y(t) assez facilement.

"Les bonnes équations", tu les as déjà: on calcul X(t) et y(t) de manière assez bête (par intervalles de temps). Les vraies questions sont: quel delta t ? jusqu'à quel t ? Malheureusement, dans le calcul numérique ces questions restent toujours en suspend et on fixe ces valeurs assez arbitrairement (après corrections si besoin).

Citation :
Mdr même matlab on l'utilise pas au même niveau
C'est Python avec Simpy, sa bibliothèque pour faire du calcul formel.

Dernière modification par Adau - Vagdish ; 20/10/2015 à 20h16.
Comme je l'ai dit: la bonne réponse je l'ai déjà, les tracés je les ai, j'ai tout, et je peux jouer très facilement avec un modèle d'état. Pour ce qui est du calcul des valeurs dans le domaine temporel, je laisse ça à Simulink qui gère très bien tout seul comme un grand.

Je m'intéresse à savoir pourquoi la seconde méthode ne donne pas le résultat attendu. Elle devrait, donc je dois me tromper quelque part. C'est ça qui m'intéresse.

Citation :
Je me demande s'il n'y a pas des pôles et des zéros qui se compensent que tu donnes la fonction de transfert sous forme numérateur/dénominateur.
J'utilise minreal :/ (sinon j'obtiens un ordre 8 pour la fonction). Et ensuite je factorise en polynômes de premier et second ordre, je suis vraiment à la réalisation minimale.
Citation :
Publié par Zangdar MortPartout
Comme je l'ai dit: la bonne réponse je l'ai déjà, les tracés je les ai, j'ai tout, et je peux jouer très facilement avec un modèle d'état. Pour ce qui est du calcul des valeurs dans le domaine temporel, je laisse ça à Simulink qui gère très bien tout seul comme un grand.

Je m'intéresse à savoir pourquoi la seconde méthode ne donne pas le résultat attendu. Elle devrait, donc je dois me tromper quelque part. C'est ça qui m'intéresse.
Ok pardon, j'avais mal compris
Edit:// Oui en fait j'ai lu ton premier message en travers
Citation :
Publié par Zangdar MortPartout
J'utilise minreal :/ (sinon j'obtiens un ordre 8 pour la fonction). Et ensuite je factorise en polynômes de premier et second ordre, je suis vraiment à la réalisation minimale.
Ben le code que j'ai indiqué plus haut sort la transformée de Laplace de dx1/dt + k.x2 avec A et B symboliques, et pour de l'ordre 2, 3 et 4 on trouve la même fonction de transfert Y(s).

Donc effectivement il y a un truc qui cloche. Ceci dit en ordre 4 il lui faut quelques minutes pour simplifier les expressions trouvées avec les deux approches.
Après, j'ai pas Matlab donc je peux pas tester plus loin
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés