The::Beastieux

Sangre de Bestia + Corazón de Pingüino | Un blog acerca de Linux, *BSD, Open Source, Software Libre, Programación …

Archivos mensuales: octubre 2008

Halloween Party


¿Como te gustaría celebrar Halloween?, al lado de pingüinas o de diablitas?

Este año me animo por las diablitas xD.

Código Scilab – Método de la Secante



function y=f(x)
y=exp(-x^2)-x;
endfunction

function x = secante(x0,x1,tol)
j=2;
i=1;
x(1)=x0;
x(2)=x1;
ea(i)=100;
while abs(ea(i))>=tol
   x(j+1)=(x(j-1)*f(x(j))-x(j)*f(x(j-1)))/(f(x(j))-f(x(j-1)));
   ea(i+1)=abs((x(j+1)-x(j))/x(j+1))*100;
   j=j+1;
   i=i+1;     
end

printf(' i \t\t x(i) \t Error aprox (i) \n');
printf('%2d \t %11.7f \t \n',0,x(1));

for k=2:j;
    printf('%2d \t %11.7f \t %7.3f \n',k-1,x(k),ea(k-1));
end

endfunction

Código Scilab – Método de Iteración del Punto Fijo



function y=g(x)
y=(x^2-exp(x))/5;
endfunction

function x=puntofijo(x0,tol)
i=1;
ea(1)=100;
x(1)=x0;
while abs(ea(i))>=tol,
    x(i+1) = g(x(i));
    ea(i+1) = abs((x(i+1)-x(i))/x(i+1))*100;
    i=i+1;
end
printf(' i \t      X(i)       Error aprox (i) \n');
for j=1:i;
    printf('%2d \t %11.7f \t %7.3f \n',j-1,x(j),ea(j));
end
endfunction

Código Scilab – Método de la Regla Falsa



function y=f(x)
y=exp(-x)-log(x);
endfunction


function xr=reglafalsa(xai,xbi,tol)
i=1;
ea(1)=100;
if f(xai)*f(xbi) < 0
    xa(1)=xai;
    xb(1)=xbi;
    xr(1)=xa(1)-f(xa(1))*(xb(1)-xa(1))/(f(xb(1))-f(xa(1)));
    printf('It.              Xa           Xr            Xb            Error aprox \%\n');
    printf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
    while abs(ea(i))>=tol,
      if f(xa(i))*f(xr(i))< 0
         xa(i+1)=xa(i);
         xb(i+1)=xr(i);
      end
      if f(xa(i))*f(xr(i))> 0
         xa(1)=xr(i);
         xb(1)=xb(i);
	  end      
      xr(i+1)=xa(i+1)-f(xa(i+1))*(xb(i+1)-xa(i+1))/(f(xb(i+1))-f(xa(i+1)));
       ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1)))*100;
      printf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n', i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
      i=i+1;
   end
else
   printf('No existe una raíz en ese intervalo');
end
endfunction

Código Scilab – Método de Newton-Raphson



function y=f(x)
y=exp(-x)-log(x);
endfunction

function y=df(x)
y=-exp(-x)-1/x;
endfunction

function x=newtonraphson(x0,tol);
i=1;
ea(1)=100;
x(1)=x0;
while abs(ea(i))>=tol;
    x(i+1)=x(i)-f(x(i))/df(x(i));
    ea(i+1)=abs((x(i+1)-x(i))/x(i+1)*100);
    i=i+1;
end
printf(' i  \t      X(i)      Error aprox (i) \n');
for j=1:i;
    printf('%2d \t %11.7f \t %7.3f \n',j-1,x(j),ea(j));
end
endfunction

Código Scilab – Método de la Bisección



function y=f(x)
y=exp(-x^2)-x;
endfunction


function xr=biseccion(xai,xbi,tol)
i=1;
ea(1)=100;
if f(xai)*f(xbi) < 0
    xa(1)=xai;
    xb(1)=xbi;
    xr(1)=(xa(1)+xb(1))/2;
    printf('It.\t\t Xa\t\t Xr\t\t Xb\t  Error  \n');
    printf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
    while abs(ea(i)) >= tol
      if f(xa(i))*f(xr(i))< 0
         xa(i+1)=xa(i);
         xb(i+1)=xr(i);
      end
      if f(xa(i))*f(xr(i))> 0
         xa(i+1)=xr(i);
         xb(i+1)=xb(i);
	  end      
      xr(i+1)=(xa(i+1)+xb(i+1))/2;
      ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
      printf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
      i=i+1;
   end
else
   printf('No existe una raíz en ese intervalo');
end
endfunction

Códigos de ecuaciones no lineales en Scilab


Al igual que en un par de post anteriores, donde publiqué los códigos de métodos de calculo de raices de ecuaciones no lineales en matlab, ahora los publico de nuevo, pero esta vez adaptados a Scilab:

Método de la Bisección: biseccion(inicio,fin,%error);

Método de la Regla Falsa: reglafalsa(inicio,fin,%error);

Método de Newton-Raphson: newtonraphson(inicio,%erro);

Método de la Secante: secante(inicio,fin,%error);

Método de Iteración del Punto Fijo: puntofijo(inicio,%error);

Pueden guiarse viendo el ejemplo de ejecución del código del método de la bisección:

Códigos de ecuaciones no lineales en Scilab

Para ejecutar el programa,  guardar el código editado con SciPad como ‘biseccion’,  ejecutarlo (control + l) y llamar a la función desde el Scilex:

scilab biseccion 2 por ti.

Nota: Los códigos vienen establecido con una ecuación por defecto en la función f, df (derivada de f) y g. Pueden modificar la ecuación por el que deseen analizar.

¿Scilab o Matlab?


Scilab es un lenguaje de programación de alto nivel para cálculo científico, interactivo de libre uso y disponible en múltiples sistemas.

Su archifamoso competidor es matlab, aunque ambos tienen las mismas funcionalidades difieren en algunos modos de instrucción.

https://i2.wp.com/www-rocq.inria.fr/metalau/meknes2004/ecole2004/scilab_logo.gif

He estado adaptando algunos códigos de matlab para Scilab, y aquí les muestro un sencillo ejemplo:

El código es sobre el método de la bisección:

scilab biseccion por ti.

Pueden conseguir Scilab para diversos sistemas operativos, alguno de ellos:

Scilab para Linux

Scilab para PC-BSD

También puedes instalar en linux desde los repositorios de la distribución que usas, o en FreeBSD desde los ports.

Códigos de ecuaciones no lineales en Matlab


Aquí les dejo los códigos de ecuaciones no lineales hechos en matlab, desarrollados en la universidad en el curso de métodos numéricos.

Los métodos realizados son:

Método de la Bisección

Método de la Regla Falsa

Método de Newton-Raphson

Método de la Secante

Método de Iteración del Punto Fijo

Pueden bajarlo todo en dos versiones diferentes:

Métodos de Ecuaciones no lineales (Con Funciones)

Métodos de Ecuaciones no lineales (SIn Funciones)

Código Matlab – Método de Iteración del Punto Fijo


xf(1)=input('Ingrese el valor inicial: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la función f(x), despejada g(f(x)): ');

i=1;
ea(1)=100;
while abs(ea(i))>=tol,
    xf(i+1) = subs(f,x,xf(i)); 
    ea(i+1) = abs((xf(i+1)-xf(i))/xf(i+1))*100; 
    i=i+1;
end
fprintf('i     xf(i)         Error aprox (i) \n');
for j=1:i;
    fprintf('%2d \t %11.7f \t %7.3f \n',j-1,xf(j),ea(j));
end

Código Matlab – Método de Newton-Raphson


x0=input('Ingrese el valor inicial: ');
tol=input('Ingrese el porcentaje de error: ');
f=input('Ingrese la función: ');
i=1;
fx(i)=x0;

syms x;
f1=subs(f,x,fx(i));
z=diff(f);
d=subs(z,x,fx(i));

ea(1)=100;

while abs(ea(i))>=tol;
    fx(i+1)=fx(i)-f1/d; f1=subs(f,x,fx(i+1)); d=subs(z,x,fx(i+1));
    ea(i+1)=abs((fx(i+1)-fx(i))/fx(i+1)*100);
    i=i+1;
end
fprintf('i     fx(i)         Error aprox (i) \n');
for j=1:i;
    fprintf('%2d \t %11.7f \t %7.3f \n',j-1,fx(j),ea(j));
end

Código Matlab – Método de la Bisección


xai=input('Ingrese el intervalo inferior: ');
xbi=input('Ingrese el intervalo superior: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funciòn: ');
i=1;

f1=subs(f,x,xai);
f2=subs(f,x,xbi);

ea(i)=100;
if f1*f2 < 0
    xa(i)=xai; f1=subs(f,x,xa(i));
    xb(i)=xbi; f2=subs(f,x,xb(i));
    xr(i)=(xa(i)+xb(i))/2; f3=subs(f,x,xr(i));
    
    fprintf('It.       Xa               Xr             Xb           Error aprox \n');
    fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
    while abs(ea(i)) >= tol,
      if f1*f3<0
         xa(i+1)=xa(i);f1=subs(f,x,xa(i+1));
         xb(i+1)=xr(i);f2=subs(f,x,xb(i+1));
      end
      if f1*f3> 0
         xa(i+1)=xr(i);f1=subs(f,x,xa(i+1));
         xb(i+1)=xb(i);f2=subs(f,x,xb(i+1));
	  end      
      xr(i+1)=(xa(i+1)+xb(i+1))/2; f3=subs(f,x,xr(i+1));
      ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
      fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',...
              i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
      i=i+1;
   end
else
   fprintf('No existe una raíz en ese intervalo');
end

Código Matlab – Método de la Secante


fx(1)=input('Ingrese el intervalo inferior: ');
fx(2)=input('Ingrese el intervalo superior: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funciòn: ');

f1=subs(f,x,fx(1));
f2=subs(f,x,fx(2));

ea(1)=100;

i=1;
j=2;

while abs(ea(i))>=tol
   xf(j+1)=(xf(j-1)*f2-xf(j)*f1)/(f2-f1);  f1=f2; f2=subs(f,x,xf(j+1));
   ea(i+1)=(xf(j+1)-xf(j))/xf(j+1)*100;
   j=j+1;
   i=i+1;     
end

fprintf(' i     xf(i)         Error aprox (i) \n');
%fprintf('%2d\t%11.7f\t\n',0,x(1));
for k=2:j;
    fprintf('%2d\t%11.7f\t%7.3f\n',k-1,xf(k),ea(k-1));
end

Código Matlab – Método de la Regla Falsa


xai=input('Ingrese limite inferior: ');
xbi=input('Ingrese limite superior: ');
tol=input('Ingrese el porcentaje de Error: ');
syms x;
f=input('Ingrese la Funcion: ');
f1=subs(f,x,xai);
f2=subs(f,x,xbi);
i=1;
ea(1)=100;
if f1*f2 < 0
    xa(1)=xai;f1=subs(f,x,xa(1));
    xb(1)=xbi;f2=subs(f,x,xb(1));
    xr(1)=xa(1)-f1*(xb(1)-xa(1))/(f2-f1); f3=subs(f,x,xr(1));
    fprintf('It.              Xa           Xr            Xb            Error aprox \n');
    fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
    while abs(ea(i))>=tol,
      if f1*f3 < 0
         xa(i+1)=xa(i);f1=subs(f,x,xa(i+1));
         xb(i+1)=xr(i);f2=subs(f,x,xb(i+1));
      end
      if f1*f3> 0
         xa(1)=xr(i);
         xb(1)=xb(i);
      end
      xr(i+1)=xa(i+1)-f1*(xb(i+1)-xa(i+1))/(f2-f1);
      ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1)))*100;
      fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',...
              i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
      i=i+1;
   end
else
   fprintf('No existe una raíz en ese intervalo');
end

PC-BSD 7.0.1 disponible


Ya ha sido liberada la primera actualización de PC-BSD en la rama 7.x

La versión 7.0.1 contiene una serie de mejoras y soluciones a fallos. Algunos de los cambios y/o correcciones son:

* KDE 4.1.2
* Soporte para escritura en NTFS
* Soporte para Adobe Flash 9 (Linux-flashplugin9)
* Mejor soporte para WIFI
* Actualizaciones para el Sistema

Éstos cambios vienen incorporados en una nueva iso, o caso contrario se puede realizar haciendo uso de las herramientas de actualización propias de PC-BSD.

Paralelamente a esto, también fue lanzado PC-BSD 64Bit (amd64) , el cual es factible descargar de desde la página oficial de PC-BSD, ftp o torrent.

Links: Download | Changelog | PBI packages

A %d blogueros les gusta esto: