Diagonalizzazione di una matrice a valori polinomiali
La funzione Grado calcola il grado del polinomio f nell'indeterminata x.
Grado[f_,x_]:=Exponent[f,x]
L'algoritmo DiagPoli determina una matice diagonale equivalente alla matrice ad elementi polinomiali A.
INPUT: la matrice ad elementi polinomiali A da diagonalizzare.
OUTPUT: la matrice diagonale equivalente ad A.
DiagPoli[A_,x_]:=Block[{i,j,a,b,d,Mat=A,L},
While[Priorità[Mat]=!={},
L=Priorità[Mat];i=L[[1]];j=L[[2]];
If[i<j,
If[ Mat[[i,j-1]]==0 ,
Mat[[All,j-1]]=Mat[[All,j-1]]+Mat[[All,j]]
];
If[ Grado[Mat[[i,j-1]],x]==Grado[Mat[[i,j]],x],
If[ CC[Mat[[i,j-1]],x]==1,
Mat[[All,j]]=
Expand[Mat[[All,j]]-CC[Mat[[i,j]],x]*Mat[[All,j-1]] ],
Mat[[All,j-1]]=
Expand[Mat[[All,j-1]]+(1-CC[Mat[[i,j-1]],x])/CC[Mat[[i,j]],x]*
Mat[[All,j]]]
],
a=CC[Mat[[i,j-1]],x]; b= CC[Mat[[i,j]],x];
d=Abs[Grado[Mat[[i,j-1]],x]-Grado[Mat[[i,j]],x]];
If[Grado[Mat[[i,j-1]],x]< Grado[Mat[[i,j]],x] ,
If[Mat[[i,j]]-(b/a*x^d)*Mat[[i,j-1]]=!=0,
Mat[[All,j]]=Expand[Mat[[All,j]]-(b/a*x^d)*Mat[[All,j-1]]] ,
Mat[[All,j]]=Expand[Mat[[All,j]]+(1-b/a*x^d)*Mat[[All,j-1]]]
]
];
If[Grado[Mat[[i,j-1]],x]> Grado[Mat[[i,j]],x] ,
If[Expand[Mat[[i,j-1]]-(a/b*x^d)*Mat[[i,j]]]=!=0,
Mat[[All,j-1]]=Expand[Mat[[All,j-1]]-(a/b*x^d)*Mat[[All,j]]],
Mat[[All,j-1]]=
Expand[Mat[[All,j-1]]+(1-a/b*x^d)*Mat[[All,j]] ]
]
]
]
];
If[i>j,
If[ Mat[[i-1,j]]==0 ,
Mat[[i-1]]=Mat[[i-1]]+Mat[[i]]
];
If[ Grado[Mat[[i-1,j]],x]==Grado[Mat[[i,j]],x],
If[ CC[Mat[[i-1,j]],x]==1,
Mat[[i]]=Expand[Mat[[i]]-CC[Mat[[i,j]],x]*Mat[[i-1]] ],
Mat[[i-1]]=
Expand[Mat[[i-1]]+(1-CC[Mat[[i-1,j]],x])/CC[Mat[[i,j]],x]*
Mat[[i]]]
],
a=CC[Mat[[i-1,j]],x];
b=CC[Mat[[i,j]],x];
d=Abs[Grado[Mat[[i-1,j]],x]-Grado[Mat[[i,j]],x]];
If[Grado[Mat[[i-1,j]],x]< Grado[Mat[[i,j]],x] ,
If[Expand[Mat[[i,j]]-(b/a*x^d)*Mat[[i-1,j]]]=!=0,
Mat[[i]]=Expand[Mat[[i]]-(b/a*x^d)*Mat[[i-1]]],
Mat[[i]]=Expand[Mat[[i]]+(1-b/a*x^d)*Mat[[i-1]]]
]
];
If[Grado[Mat[[i-1,j]],x]> Grado[Mat[[i,j]],x] ,
If[Expand[Mat[[i-1,j]]-(a/b*x^d)*Mat[[i,j]]]=!=0,
Mat[[i-1]]=Expand[Mat[[i-1]]-(a/b*x^d)*Mat[[i]]],
Mat[[i-1]]=Expand[Mat[[i-1]]+(1-a/b*x^d)*Mat[[i]]]
]
]
]
]
] ;
Mat]
Esempi:
B={{-1+x,0,0},{1,x,1}}
{{-1+x,0,0},{1,x,1}}
DiagTest[B]
False
DiagPoli[B,x]
{{1,0,0},{0,1-x,0}}
Torna all'elenco dei capitoli
Non ci sono commenti in questa pagina. [Scrivi commento]