Código Fuente en Java para la resolución de Métodos Numéricos

Hace mucho en una clase de programación de JAVA me pidieron realizar un programa que resolviera incógnitas por diverso métodos numéricos entre los cuales se encuentran:

  • Método de Bisección
  • Método de NEWTON-RAPHSON
  • Método de GAUSS
  • Método de GAUSS-SEIDEL PARA 3 ECUACIONES
  • Método de GAUSS-JORDAN
  • Método de LU PARA 3 ECUACIONES
  • Método de Interpolación de NEWTON
  • Método de Interpolación de LAGRANGE

Y pues eh decidido compartir el código de este proyecto, la verdad el código no es del todo mío… Fue facilitado por un compañero, porque para ser honestos a mi no me acaba de agradar la programación orientada a objetos, prefiero la estructurada, pero en gustos se rompen generos…

NOTA:el codigo fuente lo puedes descargar a continuación:

>>> DESCARGAR Codigo Fuente <<<

El código fuente se muestra a continuación:

import java.lang.Math;
import java.io.*;
//Clase ProyectoJava
public class  ProyectoJava{
  
  //Metodo Constructor
  public static void main(String args[]){
  ProyectoJava Proyecto = new ProyectoJava();
  Proyecto.menu();	//solo se manda a llamar a menu desde aqui, ya que menu llama a los demas metodos posteriromente
  }
    
  
    //(1)Metodo Biseccion	
  public void MetodoBiseccion(){
    double a;
    double b;
    double tol;
    System.out.println("\t\t\t\"METODO DE BISECCION\"");
    System.out.println("Extremo Izquierdo: ");
    a=lee();
    System.out.println("Extremo Derecho: ");
    b=lee();
    System.out.println("Tolerancia: ");
    tol=lee();
    double c;
    do{
    c=(a+b)/2.0;
    if(((c*c-5)*(a*a-5))<0){
      b=c;
    }
    else{
      a=c;
    }
      }while(Math.abs(a-b)>tol);
      System.out.println("La raiz es: "+c);			
  }


  //(2)Metodo NewRaphson
  public void MetodoNewtonRaphson(){
    double a;
    double tol;
    double b;
    double c; 
    System.out.println("\t\t\t\"METODO DE NEWTON-RAPHSON\"");
    System.out.println("Primera Aproximacion: ");
    a=lee();
    System.out.println("Tolerancia: ");
    tol=lee();
    do{
      b=a-(a*a-a-2)/(2*a-1);
      c=Math.abs(a-b);
      a=b;	
      	}while(c>tol);
      	System.out.println("La raiz es: "+b);
    }


  //(3) metodo gauss
  public void MetodoGauss(){
    int i,j,k,n;
    double a[][] = new double [5][6];
    double cte,x1,x2,x3;
    double x[] = new double [5];
    System.out.println("\t\t\t\"METODO DE GAUSS\"");
    System.out.println("Dame el numero de incognitas (de hasta 5) ");
    n=leeint();
    System.out.println("Ingrese coeficientes");
    for(i=0;i<n;i++)
    {
      System.out.println("Renglon "+(i+1));
      for(j=0;j<=n;j++)
      {
        System.out.println(" Ingrese a "+(i+1)+" "+(j+1));
        a[i][j]=lee();
      }
    }
    for(i=0;i<n-1;i++){
      for(j=i+1;j<=n;j++){
       cte=(-a[j][i])/(a[i][i]);
          for(k=i;k<n+1;k++){
       a[j][k]=((a[i][k])*cte)+a[j][k];
       }
       }
    }
   	x3=a[n-1][n]/a[n-1][n-1];
   	x2=(a[n-2][n]-x3*a[n-2][n-1])/a[n-2][n-2];
   	x1=(a[n-3][n]-x2*a[n-3][n-2]-x3*a[n-3][n-1])/a[n-3][n-3];
    System.out.println("x0= "+x1+" \nx1= " +x2+" \nx2= " +x3);
    }

  
  
  //(4)gauss seidel
  public void MetodoGaussSeidel(){
    double x0,x1,x2,tol,e;
    int i,j;
    double a[][]=new double [3][4];
    System.out.println("\t\t\t\"METODO DE GAUSS-SEIDEL 3 ECUACIONES\"");
    System.out.println("Ingrese tolerancia");
    tol=lee();
    System.out.println("Ingrese coeficientes");
    for(i=0;i<3;i++)
    {
      System.out.println("Renglon "+(i+1));
      for(j=0;j<=3;j++)
      {
        System.out.println(" Ingrese a "+(i+1)+" "+(j+1));
        a[i][j]=lee();
      }
    }
    x1=0.0;
    x2=0.0;
    do{
      e=x1;
      x0=(a[0][3]-x1*a[0][1]-x2*a[0][2])/a[0][0];
      x1=(a[1][3]-x0*a[1][0]-x2*a[1][2])/a[1][1];
      x2=(a[2][3]-x0*a[2][0]-x1*a[2][1])/a[2][2];
    }while(Math.abs(e-x1)>tol);
    System.out.println("x0= "+x0+" \nx1= " +x1+" \nx2= " +x2);
    }
  
  
  //(5) gauss jordan
  public void MetodoGaussJordan(){
    int i,j,k,n;
    double a[][] = new double [5][6];
    double cte;
    double x[] = new double [5];
    System.out.println("\t\t\t\"METODO DE GAUSS-JORDAN\"");
    System.out.println("No. de incognitas (maximo 5):   ");
    n=leeint();
    System.out.println("Dame los coeficientes: ");
    for(i=0;i<n;i++)
    {
      System.out.println("Renglon "+(i+1));
      for(j=0;j<=n;j++)
      {
        System.out.println(" Ingrese a "+(i+1)+" "+(j+1));
        a[i][j]=lee();
      }
    }
    for(i=0;i<n-1;i++){
      for(j=i+1;j<=n;j++){
       cte=(-a[j][i])/(a[i][i]);
          for(k=i;k<n+1;k++){
       a[j][k]=((a[i][k])*cte)+a[j][k];
       }
       }
    }
    for(i=0;i<n;i++)
    {
      System.out.println("Renglon "+(i+1));
      for(j=0;j<=n;j++)
      {
        System.out.println(" a "+(i+1)+" "+(j+1)+" =" +a[i][j]);
      }
    }
    }

  
  //(6) LU
  public void MetodoLu(){
    int i,j;
    double Y1,Y2,Y3,X1,X2,X3;
    double A[][] = new double [3][3];
    double L[][] = new double [3][3];
    double U[][] = new double [3][3];
    double B[] = new double [3];
    System.out.println("\t\t\t\"METODO DE LU    3 ECUACIONES\"");
    System.out.println("Ingrese coeficientes d");
    for(i=0;i<3;i++)
    {
      System.out.println("Renglon "+(i+1));
      for(j=0;j<3;j++)
      {
        System.out.println(" Ingrese a "+(i+1)+" "+(j+1));
        A[i][j]=lee();
      }
    }
    System.out.println("Ingrese los terminos independientes");
    for(i=0;i<3;i++){
      System.out.println("Termino  "+(i+1));
      B[i]=lee();
      }
    for(i=0;i<3;i++){
   			L[i][0]=A[i][0];
   			U[i][i]=1;
      }
    U[0][1]=A[0][1]/L[0][0];
    L[1][1]=A[1][1]-L[1][0]*U[0][1];
    L[2][1]=A[2][1]-L[2][0]*U[0][1];
    U[0][2]=A[0][2]/L[0][0];
    U[1][2]=(A[1][2]-L[1][0]*U[0][2])/L[1][1];
    L[2][2]=A[2][2]-L[2][0]*U[0][2]-L[2][1]*U[1][2];
    Y1=B[0]/L[0][0];
    Y2=(B[1]-L[1][0]*Y1)/L[1][1];
    Y3=(B[2]-L[2][0]*Y1-L[2][1]*Y2)/L[2][2];
    X3=Y3;
    X2=Y2-U[1][2]*X3;
    X1=Y1-U[0][1]*X2-U[0][2]*X3;
    System.out.println("El resultado es:\nx0= "+X1+" \nx1= " +X2+" \nx2= " +X3);
    }

  
  //(7) Interpolacion Newton
  public void MetodoInterNewton(){
    double a[][] = new double [5][2];
    double x,y,fx1x0,fx2x1,fx3x2,fx4x3,fx2x1x0,fx3x2x1,fx4x3x2,fx3x2x1x0,fx4x3x2x1,fx4x3x2x1x0;
    int i;
    System.out.println("\t\t\t\"INTERPOLACION DE DIFERENCIAS DE NEWTON P/ 5 PTOS.\"");
    System.out.println("Valor a interpolar: ");
    x=lee();
    System.out.println("Dame los 5 pares de puntos");
    for(i=0;i<5;i++){
        System.out.println("Dame x "+i);
        a[i][0]=lee();
        System.out.println("Dame f(x) "+i);
        a[i][1]=lee();
        }		
    fx1x0=(a[1][1]-a[0][1])/(a[1][0]-a[0][0]);
    fx2x1=(a[2][1]-a[1][1])/(a[2][0]-a[1][0]);
    fx3x2=(a[3][1]-a[2][1])/(a[3][0]-a[2][0]);
    fx4x3=(a[4][1]-a[3][1])/(a[4][0]-a[3][0]);
    fx2x1x0=(fx2x1-fx1x0)/(a[2][0]-a[0][0]);
    fx3x2x1=(fx3x2-fx2x1)/(a[3][0]-a[1][0]);
    fx4x3x2=(fx4x3-fx3x2)/(a[4][0]-a[2][0]);
    fx3x2x1x0=(fx3x2x1-fx2x1x0)/(a[3][0]-a[0][0]);
    fx4x3x2x1=(fx4x3x2-fx3x2x1)/(a[3][0]-a[0][0]);
    fx4x3x2x1x0=(fx4x3x2x1-fx3x2x1x0)/(a[4][0]-a[0][0]);
    y=a[0][1]+fx1x0*(x-a[0][0])+fx2x1x0*(x-a[0][0])*(x-a[1][0])+fx3x2x1x0*(x-a[0][0])*(x-a[1][0])*(x-a[2][0])+fx4x3x2x1x0*(x-a[0][0])*(x-a[1][0])*(x-a[2][0])*(x-a[3][0]);
          System.out.println("f(x) en ese punto es: "+y);
    }


  //(8) Interpolacion Lagrange
  public void MetodoInterLagrange(){
    int n,i;
    double x,y;
    double a[][] = new double [4][2];
    System.out.println("\t\t\t\"METODO DE INTERPOLACION LAGRANGE  2-4 PTOS.\"");
    do{
    System.out.println("Dame el numero de puntos");
    n=leeint();	
    }while(n<2 || n>4);
    System.out.println("Dame los  pares de puntos");
    for(i=0;i<n;i++){
        System.out.println("Dame x "+i);
        a[i][0]=lee();
        System.out.println("Dame f(x) "+i);
        a[i][1]=lee();
        }
    System.out.println("Dame el valor a interpolar ");
    x=lee();
    switch(n){
      case 2:
      y=(((((x-a[1][0])*a[0][1])/(a[0][0]-a[1][0]))+(((x-a[0][0])*a[1][1])/(a[1][0]-a[0][0]))));
      System.out.println("f(x) en ese punto es: "+y);
      break;
      case 3:
      y=((x-a[1][0])*(x-a[2][0])*a[0][1])/((a[0][0]-a[1][0])*(a[0][0]-a[2][0]))+((x-a[0][0])*(x-a[2][0])*a[1][1])/((a[1][0]-a[0][0])*(a[1][0]-a[2][0]))+((x-a[1][0])*((x-a[0][0])*a[2][1])/((a[2][0]-a[0][0])*(a[2][0]-a[1][0])));
      System.out.println("f(x) en ese punto es: "+y);
      break;
      case 4:
      y=((x-a[1][0])*(x-a[3][0])*(x-a[2][0])*a[0][1])/((a[0][0]-a[1][0])*(a[0][0]-a[2][0])*(a[0][0]-a[3][0]))+((x-a[0][0])*(x-a[2][0])*(x-a[3][0])*a[1][1])/((a[1][0]-a[0][0])*(a[1][0]-a[2][0])*(a[1][0]-a[3][0]))+((x-a[0][0])*(x-a[1][0])*((x-a[3][0])*a[2][1])/((a[2][0]-a[0][0])*(a[2][0]-a[1][0])*(a[2][0]-a[3][0]))+((x-a[0][0])*(x-a[1][0])*((x-a[2][0])*a[
3][1])/((a[3][0]-a[0][0])*(a[3][0]-a[1][0])*(a[3][0]-a[2][0]))));
      System.out.println("f(x) en ese punto es: "+y);
      break;
      default:
      System.out.println("INVALIDO");
      break;	
    }
  }

  
  //para leer desde teclado
  public double lee(){
    double num;
    try{
      InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader br = new BufferedReader(isr);
      String sdato;
      sdato = br.readLine();
      num = Double.parseDouble(sdato);
    }
    catch(IOException ioe){
      num=0.0;
    }
    return num;
    }

  //para  leer un entero
  public int leeint(){
    int num;
    try{
      InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader br = new BufferedReader(isr);
      String sdato;
      sdato = br.readLine();
      num = Integer.parseInt(sdato);
    }
    catch(IOException ioe){
      num=0;
    }
    return num;
    }
  
  
  //para salir del programa
  public int Fuera(){
    int sal; 
    System.out.println("\n\n\nSI DESEAS OTRO METODO PRESIONA [1]");
    sal=leeint();
    return sal;
    }




  //despliega menu
  public void menu(){
    int a;
    int p;
    do{
    do{
    System.out.println("\n\n\t\t\tMETODOS NUMERICOS\n\n");
    System.out.println("\t1.-Biseccion\n\t2.-Newton-Raphson\n\t3.-Gauss\n\t4.-Gauss-Seidel\n\t5.-Gauss-Jordan\n\t6.-LU\n\t7.-Interpolacion Newton\n\t8.-Interpolacion Lagrange");
    System.out.println("\n\nEscoja el numero del metodo que desea usar:");
    a=leeint();
    }while(a<1 || a>8);
    switch(a){
      case 1:
      MetodoBiseccion();  //manda a llamara a cada uno de los metodos
      p=Fuera();
      break;
      case 2:
      MetodoNewtonRaphson();
      p=Fuera();
      break;
      case 3:
      MetodoGauss();
      p=Fuera();
      break;
      case 4:
      MetodoGaussSeidel();
      p=Fuera();
      break;
      case 5:
      MetodoGaussJordan();
      p=Fuera();
      break;
      case 6:
      MetodoLu();
      p=Fuera();
      break;
      case 7:
      MetodoInterNewton();
      p=Fuera();
      break;
      case 8:
      MetodoInterLagrange();
      p=Fuera();
      break;
      default:
      System.out.println("Opcion incorrecta");
      p=1;
      break;
      }
    }while(p==1);
    }

}