Autor Tema: Java resolver ecuación no lineal por método de bisección recorrer matriz  (Leído 6536 veces)

AlexisFloresO

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola, compañeros. Espero me puedan ayudar. Tengo el siguiente código que calcula la raíz de una ecuación no lineal mediante el método de bisección, el problema que tengo es que no sé como representar los datos calculados de cada iteración en una matriz. Lo intenté creando un método que llenará la matriz cada vez que se llamaba desde el método bisección, pero se perdían los resultados y solo me guardaba los datos de la última iteración.

Por favor, ojalá puedan ayudarme.

Código: [Seleccionar]
public double calcularRaiz(){
    double Matriz[][]=new double[ni][5];
    int i=1;
    double p,q;
        q=((b-a)/2);
        p=(a+q);
        while(i<=ni){
        if(f(p,3)==0||q<tol){
        System.out.println("Proceso completado satisfactoriamente");
        break;
        }
        else{
        if(f(a,3)*f(p,3)>0)
        a=p;
        else
        b=p;
        q=redondea((b-a)/2);
        p=redondea(a+q);
        }
        i++;
        }
       return p;
}


i=1;a=0;b=1;p=a+(b-a)/2; [Son los valores iniciales de las variables que se modificarán en cada iteración]

La matriz que quiero obtener es:
| i | a | b | p |
|1 |0 | 1 |0.5|
|i2|a2|b2|p2|
|i3|a3|b3|p3|
« Última modificación: 02 de Octubre 2015, 09:37 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Re:Matrices en Java
« Respuesta #1 en: 28 de Septiembre 2015, 08:20 »
Hola Alexis

Para pegar código y poner título a los temas lee lo que se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Para ver este problema pega el código de las clases completas, incluida la clase con el método main.

Pon también un ejemplo con una ecuación y cómo debería quedar rellena la matriz si hiciéramos los cálculos a mano, así sabremos cómo debemos desarrollar el código para obtener los resultados deseados.

Salu2!

AlexisFloresO

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Matrices en Java
« Respuesta #2 en: 30 de Septiembre 2015, 02:49 »
Código: [Seleccionar]
public class Biseccion {
double a,b,tol,p;
double Matriz[][];
    int k,j,ni;
    public Biseccion(double a1, double b1, double tol1,int ni1){
         a=a1;
         b=b1;
         tol=tol1;
         ni=ni1;
         this.Matriz=new double[ni][5];
    }
    private double redondea(double n){
    return Math.rint(n*1000000)/1000000;
    }
    private double f(double x,int opc){
    double r;
    switch(opc){
    case 1:
    r=Math.pow(x,3)+4*Math.pow(x,2)-10;
    return r;
    case 2:
    r=Math.pow(x,3)-x-1;
    return r;
    case 3:
    r=Math.pow(x,3)-7*Math.pow(x,2)+14*x-6;
    return r;
    default:
    break;
    }
    return 0;
    }
    public double calcularRaiz(){
    int i=1;
    double p,q;
        q=((b-a)/2);
        p=(a+q);
        while(i<=ni){
        if(f(p,3)==0||q<tol){
        System.out.println("Proceso completado satisfactoriamente");
        break;
        }
        else{
        if(f(a,3)*f(p,3)>0)
        a=p;
        else
        b=p;
        q=redondea((b-a)/2);
        p=redondea(a+q);
        }
        i++;
        }
 
       return p;
    }
}
//CLASE CON MÉTODO MAIN
public class PruebaBiseccion {

public static void main(String[] args) {
Biseccion b=new Biseccion(0,1,0.01,20);
double raiz=b.calcularRaiz();
System.out.println("La raíz es: "+raiz);

}

}

Gracias por responder; si se ejecuta el código tal y como está, hallaremos la raíz de la función: x^3-7x^2+14x-6=0. Dicha raíz es: 0.5859375.
La matríz que quisiera implementar es una que almacene cada resultado tal como

Matriz:

0.0   0.0   1.0   0.5   -0.625   
1.0   0.5   1.0   0.75   0.984375   
2.0   0.5   0.75   0.625   0.259765625   
3.0   0.5   0.625   0.5625   -0.161865234375   
4.0   0.5625   0.625   0.59375   0.054046630859375   
5.0   0.5625   0.59375   0.578125   -0.052623748779296875   
6.0   0.578125   0.59375   0.585937   0.0010279853502517255

Cabe mencionar que todos los resultados que están en la tabla los calculé en algún momento para poder llegar al resultado final, y lo que necesito es ir guardando cada uno de esos resultados.

Ojalá me pueda ayudar.
De antemano, gracias.
« Última modificación: 02 de Octubre 2015, 09:38 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Hola para quienes quieran entender el programa comienza con una llamada Biseccion b=new Biseccion(0,1,0.01,20);

Donde los parámetros significan lo siguiente:

0 es el valor inferior inicial del intervalo de búsqueda (a)
1 es el valor superior inicial del intervalo de búsqueda (b)
0.01 es la tolerancia o desviación máxima admitida del resultado buscado (tol) (en este caso se da por bueno un resultado si está entre -0.01 y 0.01)
20 es el número de iteraciones permitidas (ni1)

A continuación se invoca double raiz=b.calcularRaiz();

En el método calcularRaiz se comienza calculando el punto medio del intervalo de búsqueda actual:

q=((b-a)/2);

Define un punto medio transitorio p = a+q

Si la imagen de p es 0 ó el intervalo q es menor que la tolerancia devuelve el valor del punto medio como resultado. Si el intervalo es menor que la tolerancia significa que tenemos el resultado dentro del intervalo, con una desviación del valor inferior a 0.01. Pero esta desviación no está referida al resultado de la función, sino al valor de x. Por tanto podría ocurrir que el valor de x estuviera muy próximo al valor que hace cero la función y sin embargo la función tener un valor superior a 0.01. Esto sería extraño porque en funciones continuas los límites izquierdo y derecho de la función cuando nos aproximamos al valor que hace cero la función son los valores inmediatos. No obstante podría no ocurrir así en determinados casos como funciones discontinuas o con asíntotas.

En resumen, aunque en este caso no te afecte al resultado creo que en vez de if(f(p,3)==0||q<tol) sería más correcto usar f(Math.abs(f(p,3))<tol){


Otro cambio que veo recomendable es modificar

       int i=0;
        while(i<ni){


Con estos cambios el código iría quedando así:

Código: [Seleccionar]
public class Biseccion {
double a,b,tol,p;
double matriz[][];
    int k,j,ni;
    public Biseccion(double a1, double b1, double tol1,int ni1){
         a=a1;
         b=b1;
         tol=tol1;
         ni=ni1;
         this.matriz=new double[ni][5];
    }
    private double redondea(double n){
    return Math.rint(n*1000000)/1000000;
    }
    private double f(double x,int opc){
    double r;
    switch(opc){
    case 1:
    r=Math.pow(x,3)+4*Math.pow(x,2)-10;
    return r;
    case 2:
    r=Math.pow(x,3)-x-1;
    return r;
    case 3:
    r=Math.pow(x,3)-7*Math.pow(x,2)+14*x-6;
    return r;
    default:
    break;
    }
    return 0;
    }
    public double calcularRaiz(){
    int i=0;
    double p,q;
        q=((b-a)/2);
        p=(a+q);
        while(i<ni){
            matriz[i][0]= i;
            matriz[i][1]=a;
            matriz[i][2]=b;
            matriz[i][3]=p;
            matriz[i][4]=f(p,3);
        //if(f(p,3)==0||q<tol){
            if(Math.abs(f(p,3))<tol){
        System.out.println("Proceso completado satisfactoriamente con "+f(p,3));
        break;
        }
        else{
        if(f(a,3)*f(p,3)>0)
        a=p;
        else
        b=p;
        q=redondea((b-a)/2);
        p=redondea(a+q);
        }
        i++;
        }
 
       return p;
    }
   
    public double[][] getMatriz() {return matriz;}
}


Y el test:

Código: [Seleccionar]
//CLASE CON MÉTODO MAIN
public class PruebaBiseccion {

    public static void main(String[] args) {
        Biseccion b=new Biseccion(0,1,0.01,20);
        double raiz=b.calcularRaiz();
        System.out.println("La raíz es: "+raiz);
        System.out.println("\n\n Matriz: \n");
        for(double[] array : b.getMatriz()){
            for(double numero:array)
                System.out.print(numero+"\t");
            System.out.println();
        }

    }

}

Ten en cuenta que los índices de i son 0, 1, 2, 3, ... y no 1, 2, 3, ...

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".