Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [K, X, Y] = autovalor(F, positivos)
2
%autovalor
3
% [K, X, Y] = autovalor(F)
4
%
5
% Calcula los autovalores y los autovectores para el problema
6
% polin�mico inverso
7
% X (f0 + f1/k + f2/k^2 + f3/k^3 + ...) = 0
8
% (f0 + f1/k + f2/k^2 + f3/k^3 + ...) Y = 0
9
% 1 + X (-f1/k^2 - 2 f2/k^3 - 3 f3/k^4 + ...) Y = 0
10
%
11
% [K, X, Y] = autovalor(F, positivos)
12
% F recetas en tiempo discreto
13
% positivos si no es [] devuelve s�lo los autovalores positivos
14
% K autovalores soluci�n
15
% X autovectores por la izquierda
16
% Y autovectores por la derecha
17
%
18
% Los autovectores por la izquierda son vectores-fila y los autovectores
19
% por la derecha son vectores-columna.
20
21
% necesita forma1.m, formaab.m
22
23
if nargin < 2, positivos = []; end
24
cero = 1e-6; %define la precisi�n del cero
25
[filas, columnas, ancho] = size(F); %determina el tama�o del problema
26
[A, B] = formaab(F, 1); %convierte F(k) a la forma -A + B/k
27
[X1, K1] = eig(B', A'); %resuelve el problema de autovalores y autovectores por la izquierda
28
[Y2, K2] = eig(B, A); %resuelve el problema de autovalores y autovectores por la derecha
29
K = []; X = []; Y = []; %crea las variables para almacenar las soluciones
30
for c1 = 1:size(K1, 2) %para cada autovalor del problema por la izquierda
31
Knn = K1(c1, c1); %extrae el autovalor
32
if or(isempty(positivos), and(abs(imag(Knn))<cero, real(Knn)>cero)) %si positivos es [] o si Knn es real y Knn > 0
33
if and(Knn == Knn, and(abs(Knn)<Inf, abs(Knn)>cero))%si Knn >< NaN y Knn >< +-Inf y Knn >< 0
34
DF = forma1(F, Knn); %calcula F'(k)
35
Xnn = X1(1:filas, c1)'; %extrae el X de los procesos que se inician
36
s = sum(Xnn); if abs(s) > cero, Xnn = Xnn ./ s; end %normaliza X para que sum(X) = 1
37
for c2 = 1:size(K2, 2) %para cada autovalor por la derecha
38
if abs(Knn - K2(c2, c2)) < cero %si el autovalor por la izquierda y la derecha coinciden
39
Ynn = Y2(1:columnas, c2); %extrae el Y de las materias
40
q = -Xnn*DF*Ynn; if abs(q)>cero, Ynn = Ynn ./ q; end %normaliza Y para que 1 + X F'(k) Y = 0
41
K = [K, Knn]; X = [X; Xnn]; Y = [Y, Ynn]; %almacena la soluci�n
42
end
43
end
44
end
45
end
46
end
47
48
49