Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [sk, sX, sY, sm, U, iU] = perturbacion(F, G, k, X, Y, problema, grado)
2
%perturbacion
3
% [sk, sX, sY] = perturbacion(F, G, k, X, Y)
4
%
5
% Series perturbativas para el problema de autovalores, para VN o para TE.
6
%
7
% [sk, sX, sY, sm, U, iU] = perturbacion(F, G, k, X, Y, problema, grado)
8
% F recetas en tiempo discreto con los procesos de producci�n
9
% G recetas en tiempo discreto con la perturbaci�n
10
% k autovalor o factor
11
% X autovector por la izquierda o intensidades
12
% Y autovector por la derecha o valores
13
% problema para autovalores 0, para VN 1 (por defecto), y para TE 2
14
% grado grado de la serie (por defecto 100)
15
% sk serie para el factor
16
% sX serie para las intensidades
17
% sY serie para los valores
18
% sm serie para el multiplicador de la normalizaci�n
19
% U matriz de coeficientes del sistema lineal
20
% iU inversa de la matriz de coeficientes
21
%
22
% F y G deben tener la misma dimensi�n. Las series usan el formato de los
23
% polinomios en Matlab-Octave. Podemos aproximar la soluci�n de VN (o
24
% para los otros problemas) para las recetas F + h*G para un escalar h
25
% dado con el comando
26
% formapolyval(sk, h) para obtener el factor
27
% formapolyval(sX, h)' para las intensidades
28
% formapolyval(sY, h) para los valores
29
% siempre que estemos dentro del radio de convergencia y aplicaci�n de
30
% las series.
31
32
if nargin < 6, problema = []; end
33
if nargin < 7, grado = []; end
34
35
if isempty(problema), problema = 1; end %por defecto calcula las series para VN
36
if isempty(grado), grado = 100; end %por defecto el grado de las series es 100
37
38
[filas, columnas, ancho] = size(F); %establece el tama�o del problema
39
if problema == 0, fbas = (X == X); cbas = (Y == Y); else fbas = (X ~= 0); cbas = (Y ~= 0); end %determina los procesos y materias b�sicos
40
if problema == 1, q = 1; else q = 0; end %si q es 1, k(h) - X(h)(A + h M)Y(h) = 0; si q es 0, 1 - X(h)(A + h M)Y(h) = 0
41
if sum(fbas) ~= sum(cbas), disp(['Atenci�n, la soluci�n no es cuadrada']); end %avisa si la soluci�n no es cuadrada
42
X0 = X(fbas); %extrae las intensidades de los procesos b�sicos
43
for c2 = 1:ancho-2 %para el resto de pasos temporales
44
X0 = [X0, X(fbas)./k^c2]; %completa las intensidades que simbolizan la evoluci�n de los procesos
45
end %
46
if ancho > 2 %si hay m�s de dos pasos temporales
47
Yr = F(fbas,cbas,ancho)*Y(cbas)./k; Y0 = Yr; %calcula el Yr de la materia que simboliza el proceso en el �ltimo paso temporal y lo agrega a los valores
48
for c2 = ancho-1:-1:3 %para el resto de pasos temporales
49
Yr = (F(fbas,cbas,c2)*Y(cbas) + Yr)./k; Y0 = [Yr;Y0]; %calcula Yr de la materia que simboliza el proceso para ese paso temporal y lo agrega a los valores
50
end %
51
Y0 = [Y(cbas); Y0]; %agrega el Y de las materias b�sicas a los valores
52
else %si s�lo hay dos pasos temporales
53
Y0 = Y(cbas); %los valores son los de las materias b�sicas
54
end %
55
[A, B] = formaab(F(fbas,cbas,:)); %establece A y B para los procesos y materias b�sicos
56
[M, N] = formaab(G(fbas,cbas,:)); %establece M y N para los procesos y materias b�sicos
57
58
[sk, sXn, sYn, sm, U, iU] = serieperturbacion(A, B, M, N, k, X0, Y0, q, grado, sum(fbas)); %calcula las series
59
60
sX = zeros(filas, grado+1); %define la variable para almacenar la serie de las X
61
sX(fbas, :) = sXn(1:sum(fbas), :); %extrae las series de las intensidades de los procesos b�sicos y las a�ade
62
sY = zeros(columnas, grado+1); %define la variable para almacenar la serie de los Y
63
sY(cbas, :) = sYn(1:sum(cbas), :); %extrae las series de los valores de las materias b�sicas y las a�ade
64
65
66
67
68
function [k, X, Y, m, U, iU] = serieperturbacion(A, B, M, N, k0, X0, Y0, q, grado, filasf)
69
%Resuelve sucesivamente el sistema lineal U dZn = Rn para cada grado n
70
% | 0 -A*Y0 B-k0*A 1| |Xn| | |
71
% |(-A*Y0)' q -X0*A 0| |kn| = |Rn|
72
% |(B-k0*A)' (-X0*A)' 0 0| |Yn| | |
73
% | 1 0 0 0| |mn| | |
74
[filas, columnas] = size(A); %establece el tama�o del problema
75
normaliza = [ones(filasf,1); zeros(filas-filasf,1)]; %establece que la suma de las X de los procesos que se inician sea cte
76
U = [zeros(filas), -A*Y0 , B-k0*A , normaliza ; %establece la matriz del sistema lineal
77
(-A*Y0)' , q , -X0*A , 0 ; %
78
(B-k0*A)' , (-X0*A)', zeros(columnas) , zeros(columnas,1); %
79
normaliza' , 0 , zeros(1,columnas), 0 ]; %
80
iU = inv(U); %calcula U^-1
81
r = grado+1; %establece el n�mero de elementos de las series
82
X=zeros(filas,r); k=zeros(1,r); Y=zeros(columnas,r); m=zeros(1,r); %define dX, dk, dY, dm para almacenar las soluciones
83
X(:,r-(0))=X0'; k(r-(0))=k0; Y(:,r-(0))=Y0; m(:,r-(0))=0; %establece los t�rminos de grado 0
84
for cn = 1:grado %para cada grado n
85
ci = 0; %construye Rn con los t�rminos para i = 0
86
Rn = [M*Y(:,r-(cn-ci-1))*k(r-(ci)) - N*Y(:,r-(cn-1)) ; %
87
X(:,r-(ci))'*M*Y(:,r-(cn-ci-1)) ; %
88
(k(r-(ci))*X(:,r-(cn-ci-1))'*M - X(:,r-(cn-1))'*N)'; %
89
0 ]; %
90
for ci = 1:cn-1 %a�ade a Rn los t�rminos para i = 1:n-1
91
Rn = Rn + [k(r-(ci))*A*Y(:,r-(cn-ci)) + M*Y(:,r-(cn-ci-1))*k(r-(ci)) ;
92
X(:,r-(ci))'*A*Y(:,r-(cn-ci)) + X(:,r-(ci))'*M*Y(:,r-(cn-ci-1));
93
(k(r-(ci))*X(:,r-(cn-ci))'*A + k(r-(ci))*X(:,r-(cn-ci-1))'*M)' ;
94
0 ];
95
end %
96
Zn = iU * Rn; %resuelve el sistema lineal con Zn = U^-1 Rn
97
X(:,r-(cn)) = Zn(1:filas); %extrae de la soluci�n Xn
98
k(r-(cn)) = Zn(filas+1); %extrae de la soluci�n kn
99
Y(:,r-(cn)) = Zn(filas+2:filas+columnas+1); %extrae de la soluci�n Yn
100
m(r-(cn)) = Zn(filas+columnas+2); %extrae de la soluci�n mn
101
end %
102
103