miércoles, 19 de marzo de 2014



%diferencias divididas con funcion

disp('-.Método de diferencias divididias.-')
X=input('Introduzca los valores de X [xo,x1,x2,...,x3]: ');
syms x
f=input('Introduzca la funcion f(x): ');
pto=input('Introduzca el punto a aproximar: ');
Y=subs(f,X);
n=length(X);
Q=zeros(n,n);
Q(:,1)=Y';
c=2;
k=1;

for j=2:1:n
    for i=c:1:n
        Q(i,j)=(Q(i,j-1)-Q(i-1,j-1))/(X(i)-X(i-k));
    end
    k=k+1;
    c=c+1;
end
fprintf('\nLa matriz Q es: \n')
disp(Q)
fprintf('\nEl polinomio P es: \n')

syms x
c=1;
prod=1;
P=Q(1,1);

for N=2:1:n
    for i=1:1:c
        prod=prod*(x-X(i));
    end
    c=c+1;
    P=P+prod*Q(N,N);
    prod=1;
end

pretty(P)
valor_aprox=subs(P,pto);
valor_exacto=subs(f,pto);
resta=abs(valor_aprox-valor_exacto);
fprintf('\nEl valor aproximado es: %9.9f',valor_aprox)
fprintf('\nEl valor exacto es: %9.9f',valor_exacto)
fprintf('\nEl error entre las cifras es: %e',resta)
fprintf('\n')








            %METODO DE HERMIT DE DIFERENCIAS DIVIDAS
%Pasar a fraccion, Hacer la primera columna (Z)
fprintf('\n');
clear all
clc
fprintf('                         -----------------------------------------\n')
fprintf('                         MÉTODO DE HERMIT DE DIFERENCIAS DIVIDIDAS\n')
fprintf('                         -----------------------------------------\n')
fprintf('\n');
syms x
r=input('- Defina la función                     : ');
xi=input('- Introduzca los valores de x           : ');
y=input('- Introduzca los valores de y           : ');
yderiv=input('- Introducir los valores de la derivada : ');
k=input('- Introduzca el valor a aproximar       : ');
fprintf('\n' );
fprintf('\n' );
n=2*length(xi);
D=zeros(n,n);
b=1;
for a=1:2:n
   
   z(a)=xi(b);
   z(a+1)=xi(b);
   y2(a)=y(b);
   y2(a+1)=y(b); 
   b=b+1;
  
end

D(:,1)=y2';

x=0;

j=0;
cont=1;
while j<n-1
  
    x=x+1;
   j=j+1;
   for i=x:n-1
      if (z(i+1)-z(i+1-j))==0
        D(i+1,j+1)=yderiv(cont);  
         cont=cont+1;  
      else
         D(i+1,j+1)=(D(i+1,j)-D(i,j))/(z(i+1)-z(i+1-j));
      end
   end
end

D

s=1;
c=0;
q=0;
p=0;
for i=2:n
   for j=i
      s=1;
      for m=1:1
         q=q+1;
         for h=1:(i-1)         
            s=s*(k-z(i-q));
            q=q-1;
          end
         p=p+1;
         q=q+p;
      end
   end
   c=c+(D(i,j)*s);
end

for i=1:1
   for j=i
      c=c+(D(i,j));
   end
end
fprintf('\n');
fprintf('- El resultado es           : %10.8f\n',c);
fprintf('\n');
d=subs (r,k);
fprintf('- La función evaluada es    : %10.8f\n',d);
fprintf('\n');
w=abs(d-c);
fprintf('- El porcentaje de error es : %10.8f\n',w);
fprintf('\n');







                          %METODO DE DIFERENCIAS DIVIDAS
fprintf('\n');
clear all
clc
fprintf('                              -------------------------------\n')
fprintf('                              MÉTODO DE DIFERENCIAS DIVIDIDAS con funcion\n')
fprintf('                              -------------------------------\n')
fprintf('\n');
syms x
r=input('- Defina la función                 : ');
X=input('- Introduzca los valores de x       : ');
Y=input('- Introduzca los valores de y       : ');
z=input('- Introduzca el valor a aproximar   : ');
n=length(X);
D=zeros(n,n);

D(:,1)=Y';

for j=2:n
   for k=j:n
           D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1))
   end
end

s=1;
c=0;
q=0;
p=0;
for k=2:n
   for j=k
      s=1;
      for m=1:1
         q=q+1;
         for h=1:(k-1)         
            s=s*(z-X(k-q));
            q=q-1;
          end
         p=p+1;
         q=q+p;
      end
   end
   c=c+(D(k,j)*s);
end

for k=1:1
   for j=k
      c=c+(D(k,j));
   end
end
fprintf('\n');
fprintf('- El resultado es           : %10.8f\n',c);
fprintf('\n');
d=subs (r,z);
fprintf('- La función evaluada es    : %10.8f\n',d);
fprintf('\n');
w=abs(d-c);
fprintf('- El porcentaje de error es : %10.8f\n',w);
fprintf('\n');
  







             %método neville

disp('Metodo de Neville')
disp('Recuerde que no hay funcion, debe de ingresar los datos con la funcion ya evaluada')
po=input('Ingrese el número a evaluar: ');
n=input('Ingrese el número de datos: ');
%creo las variables en que se almacenara los datos
x=zeros(1,n);
f=zeros(1,n);
Q=zeros(n-1,n-1);
%Pido los datos de entrada
for i=1:n
    fprintf('Ingrese el valor de x%d: ',i-1);
    x(i)=input('');
    fprintf('Ingrese el valor de f(x%d): ',i-1);
    f(i)=input('');
end
%comienzo a evaluar los datos
%se crean los Q(x,y)
for l=1:n-1
    for m=l:n-1
        %El if esta xq si l>1 ya no se usan los valores de F(xi) sino que se usan los valores previamente obtenidos de Q
        if l==1
            %Calculo el valor de Q(x,y) y la Ec. la coloco en pantalla
            Q(m,l)=((po-x(m))*f(m+1)-(po-x(m+1))*f(m))/(x(m+1)-x(m));
            fprintf('\nQ[%d,%d]= (X-X(%d))Q[%d,%d]-(X-X(%d))Q[%d,%d])',m,l,m-1,m,l-1,m,m-1,l-1);
            fprintf('\n--------------------------------------------  =  %.9f',Q(m,l));
            fprintf('\n\t\t\tX(%d)-X(%d)\n',m,m-1);
        else
            %Calculo el valor de Q(x,y) y la Ec. la coloco en pantalla
            Q(m,l)=((po-x(m-l+1))*Q(m,l-1)-(po-x(m+1))*Q(m-1,l-1))/(x(m+1)-x(m-l+1));
            fprintf('\nQ[%d,%d]= (X-X(%d))Q[%d,%d]-(X-X(%d))Q[%d,%d])',m,l,m-l,m,l-1,m-1,m-1,l-1);
            fprintf('\n--------------------------------------------  =  %.9f',Q(m,l));
            fprintf('\n\t\t\tX(%d)-X(%d)\n',m,m-l);
        end
    end
end
fprintf('\n\nEl valor aproximado de x es: %.9f\n\n',Q(n-1,n-1));
fprintf('\n\nEl valor aproximado de x es: %.9e\n\n',Q(n-1,n-1));

   






   
                        % metodo de lagrange

disp('Metodo de Interpolacion y Polinomio de Lagrage - Sin usar funcion.');
syms x;
disp('RECUERDE TODOS LOS DATOS DEBEN DE ESTAR EN LA MISMA ESCALA');
fprintf('P(x):f(x0)*L0(x)+f(x1)L1(x)....\n');
fprintf('L0(x)=(x-x1)(x-x2)(x-x3)/(x0-x1)(x0-x2)(x0-x3)....\n');
po=input('Ingrese el número a evaluar: ');
n=input('Ingrese el número de datos: ');
%creo las variables en que se almacenara los datos
puntos=zeros(1,n);
valores=zeros(1,n);
EcLagrange=0;
%'La' representa el numerador de cada polinimo L(x) y 'Lb' representa el denominador
La=1;
Lb=1;
L=zeros(1,n);
%Pido los datos de entrada
for i=1:n
    fprintf('Ingrese el valor de x%d: ',i-1);
    puntos(i)=input('');
    fprintf('Ingrese el valor de f(x%d): ',i-1);
    valores(i)=input('');
end
for i=1:n
    for j=1:n
        if j~=i
            %Generamos el numerador y denominador del polinomio
            La=La*(x-puntos(j));
            Lb=Lb*(puntos(i)-puntos(j));
        end
    end
    %imprimimos la formula en pantalla
    fprintf('L%d(x)=\n',i-1);
    pretty(La/Lb);
    fprintf('\n--------------------------------------------------------------------------------\n\n');
    %Evaluamos la funcion
    funcion=La/Lb;
    %creamos el polinomio de lagrange.
    EcLagrange=EcLagrange+funcion*valores(i);
    L(i)=subs(po,funcion);
    La=1;
    Lb=1;
end
fprintf('Polinomio de Lagrange:\n');
pretty(EcLagrange);
resultado=subs(EcLagrange,po);
fprintf('\n\nEl valor del polinomio evaluado en %f es de: %.8f\n',po,resultado);