Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function F = formapolinomioinverso(nombrefuncion, K, grado, X)
2
%formapolinomioinverso
3
% F = formapolinomioinverso(funcion)
4
%
5
% Construye una aproximaci�n en forma de recetas en tiempo discreto de
6
% unas recetas en tiempo continuo, definidas en un script o con el
7
% comando inline; un ejemplo de este ultimo caso seria
8
% F = inline('[-280+575/k,-12; -120,-8+20/k; -280+400/k, -12]')
9
%
10
% F = formapolinomioinverso(funcion, K, grado)
11
% funcion nombre de la funci�n con las recetas en tiempo continuo
12
% K factores sobre los que se calcula la aproximaci�n
13
% grado n�mero de pasos temporales para el tiempo discreto
14
% F aproximaci�n con recetas en tiempo discreto
15
%
16
% Si K es un escalar la aproximaci�n se hace en el intervalo [K/2, K*3/2]
17
18
if nargin < 2, K = []; end
19
if nargin < 3, grado = []; end
20
if nargin < 4, X = []; end
21
22
if isempty(K), K = 1; end %si K no est� definido es 1
23
if size(K(:),1) == 1, K = (K/2:K/5:K*3/2); end %si K es un escalar la aproximaci�n se efectua en [K/2, K*3/2] con 6 puntos
24
puntos = size(K, 2); %determina el n�mero de factores para los que se hace la aproximaci�n
25
if isempty(grado), grado = fix((puntos+3)/2); end %define el grado del polinomio inverso por defecto
26
if grado > puntos, grado = puntos; end %el grado debe ser menor o igual al numero de puntos analizados
27
%
28
if isempty(X) %si el problema est� escrito con una matriz de flujos actualizados
29
F0 = feval(nombrefuncion, K(1)); %calcula la magnitud de los flujos actualizados para K(1)
30
else %si el problema est� escrito con funciones de producci�n actualizadas
31
F0 = feval(nombrefuncion, K(1), X); %calcula la magnitud de los flujos actualizados para K(1) y X
32
end %
33
[filas, columnas] = size(F0); %establece el tama�o del problema
34
Fk = zeros(filas, columnas, puntos); %crea la variable para almacenar los resultados
35
Fk(:, :, 1) = F0; %almacena la magnitud de los flujos actualizados para K(1)
36
for c1 = 2:puntos %para el resto de K analizadas
37
if isempty(X) %si el problema est� escrito con una matriz de flujos actualizados
38
Fk(:,:,c1) = feval(nombrefuncion, K(c1)); %calcula la magnitud de los flujos actualizados para K(1)
39
else %si el problema est� escrito con funciones de producci�n actualizadas
40
Fk(:,:,c1) = feval(nombrefuncion, K(c1), X); %calcula la magnitud de los flujos actualizados para K(1) y X
41
end %
42
end %
43
x = 1 ./ K; %define x como 1 / K analizadas
44
y = zeros(1, puntos); %define y
45
for c1 = 1:filas %para cada fila
46
for c2 = 1:columnas %para cada columna
47
y(:) = Fk(c1, c2, :); %extrae y
48
F(c1, c2, :) = ajusta(x, y, puntos, grado); %calcula los coeficientes del polinomio inverso
49
end %
50
end %
51
52
53
54
55
56
57
function A = ajusta(x, y, fil, col) %funci�n para el c�lculo de los coeficientes de un polinomio inverso
58
M = zeros(fil, col); %crea la matriz del sistema lineal
59
for c1 = 1:fil %para cada fila
60
for c2 = 1:col %para cada columna
61
M(c1, col-c2+1) = x(c1) .^ (col-c2); %establece la matriz
62
end %
63
end %
64
A = (M \ y')'; %resuelve el sistema lineal para establecer los coeficientes del polinomio
65
66