function [x,itnewton]=sisecnl20(namefun,nameder,x0)
if nargin==0
%x0=linspace(1,100,30); [x,itnewton]=sisecnl('sumidero','nameder',x0)
x0=linspace(1,100,30);
namefun='sumidero';
nameder='nameder';
end
%global mu;global N;global deltay;global L; global v0
% x=sis(np,met,x0,tol1,tol2)
% Esta funci´on resuelve un sistema de ecuaciones no lineales
% con los siguientes m´etodos:
% met=1, Newton con J analitico
% met=2, Newton con J por dif. finitas
% met=3, Broyden
% En las funciones namefun y nameder deben definirse la funci´on
% y el J analitico con el que sea trabajar (np).
% Funciones externas: Jdif, mgc.
met=menu('metodo no lineal','Newton','Dif.Finitas','Broyden');
caso=menu('metodo lineal','EGPP','mgc');
itnewton=0;
x=x0;
tol1=1.e-7
tol2=1.e-1;
er=1.;
ef=1.;
[n,m]=size(x);
if n==1; n=m; x=x'; end
p=zeros(n,1);
f=feval(namefun,x)
if met==1 | met==3
J=feval(nameder,x)
end
if met==2
J=Jdif(namefun,x);
end
while er>=tol1 & itnewton<300
% itnewton=itnewton;
if caso==1
p=-J\(f');
else
[p,itergc]=mgc(J,-f,p,tol2);
end
x0=x;
itnewton=itnewton+1;
x=x+p;
f0=f;
f=feval(namefun,x);
%Actualizacion de Broyden
if met==3
y=f-f0;
J=J+(y-J*p)*p'/(p'*p);
elseif met==2
J=Jdif(namefun,x);
else
J=feval(nameder,x);
end
if itnewton>=2
er0=er;
end
er=norm(x-x0,'inf');
% if itnewton>=2
% c1=er/er0
% c2=er/er0^2
% end
%/norm(x);
% fmin=fobj(x);
%disp('iteraciones en mewton')
%ef=norm(f);
end
disp('Angulos que reducen al maximo el tiempo de transito')
grafica(x)
end
function grafica(x)
x ; %Sistemas de unidades FPS
d=0.4; %delta y (incremento)
N=length(x); %numero de segmentos del sumidero
suma = 0 ;
dx(1) = 0;
Dy(1) = 0;
for i = 1 : N
suma = suma+d*tan(x(i));
dx(i+1) = suma;
Dy(i+1) = d*i;
end %for
plot(dx,-1*Dy,'*')
title('Representacion del sumidero')
xlabel('Incremento en X, [pies]')
ylabel('Incremento en Y, [pies]')
end
function y=sumidero(x)
%Sistemas de unidades FPS
V0=3; %velocidad inicial
r=0.4; %coeficiente de rozamiento
L=4; %coordenada x del extremo final del sumidero
d=0.4; %delta y (incremento)
g=32.17; %constante gravitacional
N=length(x); %numero de segmentos del sumidero
for n = 1 : N %se construyó las distintas velocidades sugún la variación del ángulo
suma = 0;
for j = 1 : N
suma = suma + 1/cos(x(j));
end %for
V(n) = sqrt((V0)^2+2*g*n*d-2*r*d*suma);
end %for
for n = 1 : N %se construyó los distinton Wn sugún la variación del ángulo
suma = 0;
for i = 1 : N
suma = suma +1/(((V(i))^3)*cos(x(i)));
end %for
W(n) = -d*V(n)*suma;
end %for
for n = 1 : N - 1 %se construyó un Sist.ecu. no lineas con los datos adquiridos de Vn y Wn hasta N-1
y(n) = (sin(x(n+1))./(V(n+1)))*(1-r*W(n+1))-(sin(x(n))./(V(n)))*(1-r*W(n)) ;
end %for
for n = 1 : N %se contruyó la funcion correspondiente al ultimo tramo del sumidero
suma = 0;
for i = 1 : N
suma = suma + tan(x(i));
end %for
y(N)= d*suma-L;
end %for
end
function J=Jdif(fname,x)
global mu N deltay L v0
n=length(x);
J=zeros(n,n);
f=feval(fname,x);
for j=1:n
h=max(sqrt(eps)*abs(x(j)),sqrt(eps));
h=0.1;
x(j)=x(j)+h;
f1=feval(fname,x);
delta=f1-f;
J(:,j)=delta/h;
x(j)=x(j)-h;
end
end
function [x,itergc]=mgc(A,b,x,tol1)
maxiter=100;
%
% Esta función minimiza una cuadrática usando el método de los gradientes conjugados
%
% Ejemplo para la experiencia 3
%
normr=1.;
normx=1.;
itergc=0;
[n,m]=size(x);
if n==1; x=x';end
while normr>=tol1 & itergc<=maxiter
if itergc==0
r=b-A*x;
u=r;
else
beta=-(u'*A*r)/(u'*A*u);
u=r+beta*u;
end
alfa=(u'*r)/(u'*A*u);
x=x+alfa*u
r0=r;
r=r-alfa*A*u;
normr=norm(r,'inf');
itergc=itergc+1;
disp('iteraciones en grad. conj');
itergc=itergc
end
%disp('**********************************************')
%disp(' Numero total de iteraciones')
%k=k-1
%disp('Error en r')
%normr
%disp('***********************************************')
end