Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k, problema)
2
%cpbusqueda
3
% [k, X, Y] = cpbusqueda(F, signoX, signoXF)
4
%
5
% Busca un k para el que existe un crecimiento proporcional usando
6
% cpdistancia.
7
%
8
% [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k0)
9
% F recetas en tiempo discreto o continuo
10
% signoX signo de las intensidades; por defecto X >= 0
11
% signoXF signo de los balances materiales; por defecto X F(k) = 0
12
% k0 factor con el que se inicia la iteraci�n; por defecto 1
13
% k factor para el que existe un crecimiento proporcional
14
% X intensidades para las que existe un crecimiento proporcional
15
% Y multiplicadores de Lagrange del juego correspondiente
16
% u valor del juego para k
17
% pasos n�mero de iteraciones
18
% kno factor el que no existe un crecimiento proporcional
19
% Xno intensidades para las que no existe un crecimiento proporcional
20
% Yno multiplicadores de Lagrange del juego correspondiente
21
% uno valor del juego para kno
22
23
% necesita cpdistancia.m, forma0.m, forma1.m
24
25
if nargin < 2, signoX = []; end
26
if nargin < 3, signoXF = []; end
27
if nargin < 4, k = []; end
28
if nargin < 5, problema = []; end
29
30
cero = 1e-14; %define la precisi�n del cero
31
X = []; Y = []; u = []; pasos = []; kno = 0; %define las variables
32
if isempty(k), k = 1; end %define k como 1 si no est� ya definida
33
34
if isempty(problema) %
35
for pasos = 1:100 %inicia una iteraci�n de hasta 100 pasos
36
[u, X, Y] = cpdistancia(forma0(F, k), signoX, signoXF); %comprueba si existe un crecimiento proporcional para k
37
if u >= -cero, break, end %si existe un crecimiento proporcional sale del bucle
38
kno = k; Xno = X; Yno = Y; uno = u; %se almacenan las variables
39
du = X * forma1(F, k) * Y; %calcula du/dk
40
if abs(du) < cero %si du/dk = 0
41
k = k / 2; %el nuevo k pasa a ser la mitad del anterior
42
else %en caso contrario
43
k = k - u / du; %se aplica la f�rmula de Newton
44
if k < kno / 2, k = kno / 2; end %el nuevo k no puede ser menos de la mitad del anterior
45
if k > kno * 2, k = kno * 2; end %el nuevo k no puede ser m�s del doble del anterior
46
end %
47
end %repite la iteraci�n
48
if pasos >= 100, disp('Atenci�n, se ha superado el n�mero m�ximo de iteraciones para ksi'); end
49
end %
50
51
if or(nargout < 6, kno > k), return; end %si no se pide un kno o si se encontr� ya uno interrumpe
52
53
if isempty(problema), kno = k * 2; else kno = k; k = []; end %
54
for pasos2 = 1:20 %inicia una iteraci�n de hasta 20 pasos
55
[uno, Xno, Yno] = cpdistancia(forma0(F, kno), signoX, signoXF); %comprueba si existe un crecimiento proporcional para kno
56
if uno < -cero, break, end %si no existe sale de la iteraci�n
57
kno = kno * 2; %duplica k
58
end %repite la iteraci�n
59
if pasos2 >= 20, disp('Atenci�n, se ha superado el n�mero m�ximo de iteraciones para kno'); end
60
pasos = [pasos, pasos2];
61
62