sábado, 10 de noviembre de 2012

FUNCION DIFERENCIAS DIVIDIDAS

Las entradas son dos vectores de cordenadas x,y  y el error (xint).
function diferencias_divididas(X,Y,xint)
n=length(Y);
fdd=zeros(n);

%llenando fdd con diferencias divididas
for i=1:n

   fdd(i,1)=Y(i);
end

for i=2:1:n
    for j=1:1:n+1-i
        fdd(j,i)=(fdd(j+1,i-1)-fdd(j,i-1))/(X(i+j-1)-X(j));
    end
end
Pol='';
Prod='';
for i=1:1:n-1
    Prod='';
    for j=1:1:i
        Prod=[Prod,'(X - ',num2str(X(j)),')'];
    end
    Pol=[Pol,'(',num2str(fdd(1,i+1)),')',Prod,' + '];
end
Pol=['F(x) = ',Pol,num2str(Y(1)),'\n\n'];

fprintf('Matriz de diferencias divididas:\n');
fdd
fprintf('Polinomio de Newton calculado:\n\n');
fprintf(Pol);

fint=0;
xprod=1;
sum=fdd(1,1);
for i=1:1:n-1
    fint=fdd(1,i+1);
    xprod=1;
    for j=1:1:i
        xprod=xprod*(xint-X(j));
    end
    fint=fint*xprod;
    sum=sum+fint;
end
fint=sum;
%graficando el polinomio de newton
fint1=0;
xprod1=1;
xn=1:0.01:max(X)+max(X)*xint;
yn=[];
for k=1:1:length(xn)
sum1=fdd(1,1);
for i=1:1:n-1
    fint1=fdd(1,i+1);
    xprod1=1;
    for j=1:1:i
        xprod1=xprod1*(xn(k)-X(j));
    end
    fint1=fint1*xprod1;
    sum1=sum1+fint1;
end
fint1=sum1;
yn(k)=fint1;
end

Error=abs((log(xint)-fint)/log(xint));

fprintf('Evaluando el polinomio en X = %f resulta: %f\n\n',xint,fint);
xg=1:0.1:max(X)+max(X)*xint;
yg=log(xg);
plot(xg,yg,'r')
hold on;
plot(X,Y,'bo');
hold on;
plot(xint,fint,'r+');
hold on;
plot(xn,yn,'b');
hold on;
plot(xint,log(xint),'ro');
hold off;
title('Representacion grafica de Ln(x) y el polinomio de Newton');
xlabel('X');
ylabel('Y = Ln(X)');
legend('Ln(x)','Puntos insertados','Valor interpolado','polinomio de Newton','valor real');
Vari=['X = ',num2str(xint),' Y = ',num2str(fint),' Er = ',num2str(Error),' Ea = ',num2str(Error*100),' %'];
text(xint+xint*.1,fint,Vari);
 Metodo de biseccion en java :)

public class Biseccion {
 
 /**
     *@autor: Andrea Ibañez Irusta
     * @param args
     */
          private double funcion(double x){
              // return Math.sqrt( x*x +1 ) -4;
               return (Math.exp(x)+Math.cos(Math.pow(x, 2)));
            
           }
          
           public double metodoDeBiseccion(double a, double b, double error){
               double c = 0.0;
               double fa;
               double fb;
               double fc;
               if((funcion(a) * funcion(b)) > 0){
                   System.out.println("Error en el intervalo, en ese intervalo no existen raices");
               }else{
                    c = (a + b) /(double) 2;
                   do{
                     
                       fa = funcion(a);
                       fb = funcion(b);
                       fc = funcion(c);
                       if((fa * fc) > 0){
                           a = c;
                           fa = funcion(a);
                           fb = funcion(b);
                            c = (a + b) /(double) 2;
                           fc = funcion(c);
                       }else if((fb * fc) > 0 ){
                           b = c;
                           fa = funcion(a);
                           fb = funcion(b);
                            c = (a + b) /(double) 2;
                           fc = funcion(c);

                       }


                   }while(Math.abs(fc) >= error);
               }
               System.out.println("valor de la funcion: "+funcion(c));
               System.out.println("raiz= "+c);
               return  c;


           }


        }