]> AND Private Git Repository - cours-mesi.git/blob - tel/TPmatlab/interpolation/TP2e/elem_simp.m
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ajout de partiels
[cours-mesi.git] / tel / TPmatlab / interpolation / TP2e / elem_simp.m
1 function [ch_pol,ch_elem,coef]=elem_simp(x,N)\r
2 % décompose certaines fractions rationnelles en éléments simples\r
3 %\r
4 % variables d'entrée\r
5 % x est le vecteur réel des poles de la fraction rationnelle,\r
6 % dont sera issu par la fonction poly, le dénominateur D(x).\r
7 % N est le numérateur de la fraction rationnelle,\r
8 % passé comme un polynome matlab, c'est-à-dire un vecteur.\r
9 %\r
10 % variables de sortie\r
11 % ch_pol est une chaine représentant la partie polynomiale, quotient\r
12 % obtenu dans la division euclidienne de N par D(x)=(x-x1)...(x-xn).\r
13 % ch_elem est une chaine représentant les éléments simples\r
14 % au sens ordinaire en fonction de coefficients fournis dans coef.\r
15 % coef peut etre forcé à une écriture symbolique (ici rationnelle).\r
16 \r
17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
18 %       Fonctions connexes appelées\r
19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
20 \r
21 % Tests d'entrée généraux\r
22 if nargin~=2\r
23     error('Nombre de chapms incorrect');\r
24 end\r
25 if isreal(x)==0\r
26     error('Les poles doivent etre réels pour l''instant');\r
27 end\r
28 \r
29 \r
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
31 % Mise sous forme conventionnelle de la fraction\r
32 % calcul du dénominateur\r
33 D=poly(x);\r
34 [Q,R]=deconv(N,D);\r
35 % désormais on travaille avec R/D qui correspond à l'étude\r
36 % proposée au début dans le tp.\r
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
38 \r
39 \r
40 % Premier élément du résultat\r
41 ch_pol=poly2str(Q,'x');\r
42 \r
43 \r
44 % recherche de l'existence de poles multiples dans x\r
45 % tri de x pour faciliter le repérage des redondances\r
46 x=sort(x);\r
47 % détection du nombre de poles multiples\r
48 pol_mult=sum(diff(x)==0);\r
49 \r
50 % ALGORITHME GENERAL\r
51 \r
52 switch pol_mult\r
53 case 0,\r
54     % il s'agit de l'étude demandée dans ce tp.\r
55     \r
56     der=polyder(D);\r
57     coef=polyval(R,x)./polyval(der,x);\r
58     ch_elem=[];\r
59     for i=1:size(x,2)\r
60         switch sign(x(i))\r
61         case 1,\r
62             ch=['/(x-' num2str(x(i)) ')'];\r
63         case -1,\r
64             ch=['/(x+' num2str(-x(i)) ')'];\r
65         case 0,\r
66             ch='/x';\r
67         end\r
68         ch_elem=[ch_elem ' + a' num2str(i) ch];\r
69     end\r
70     % à supprimer éventuellement par transformation en commentaire!\r
71     coef=sym(coef,'r');\r
72     \r
73 otherwise\r
74     % étude à compléter par l'utilisateur...\r
75     % Voir indications dans le fichier de documentation.\r
76     disp('Il existe au moins un pole multiple. Développez l''étude générale.')\r
77 end\r
78 \r
79 \r
80 \r
81 \r
82 \r
83 \r