2009-09-16 20 views
10

ho tre equazioni come i seguenti:Come risolvere le equazioni con java?

  • x + y + z = 100;
  • x + y - z = 50;
  • x - y - z = 10;

Come posso trovare i valori di x, yez con Java?

String equation1="x+y+z=100;"; 
String equation2="x+y-z=50;"; 
String equation3="x-y-z=10;"; 

int[] SolveEquations(equation1,equation2,equation3) { 
    // to do 
    // how to do?  
} 

Avete soluzioni possibili o altri quadri comuni?

+5

È questo compito? – KLE

+14

Vorrei che la gente smettesse di assumere i compiti. Una cosa è se qualcuno pubblica qualcosa direttamente da un problema da manuale come "Scrivi un algoritmo non ricorsivo per ottenere l'ordinamento O (log n) per un array". –

+0

Un'altra fonte, con codice di esempio in varie lingue è [data qui] (http://www.cs.umbc.edu/~squire/cs455_l3.html) – DaveJohnston

risposta

9

È possibile utilizzare il determinante per calcolare i valori di x y e z. La logica può essere trovata qui http://www.intmath.com/Matrices-determinants/1_Determinants.php

E quindi è necessario implementarlo in java utilizzando array tridimensionali.

+0

L'url che hai consigliato è molto buono.grazie di nuovo. –

+2

Questo è matematicamente valido, ma non molto buono in termini di efficienza. vedi trascrizione - Lezione 20, dai video lezioni del professor Gilbert Strang insegnamento 18.06 "Se è stato necessario -. E Matlab non avrebbe mai, mai farlo Voglio dire, sarebbe usare eliminazione." http://ocw.mit.edu/OcwWeb/Mathematics/18-06Spring-2005/VideoLectures/detail/lecture20.htm –

+6

Il calcolo di un determinante è (penso) O (n!). L'eliminazione gaussiana è O (n^2). – erikkallen

6

Creare un parser utilizzando ANTLR. Quindi valutare lo AST utilizzando Gaussian elimination.

+1

waoh, la conoscenza è così professionale. Ho bisogno di tempo per digerire. –

+0

Non sono sicuro di ottenere la connessione tra analisi e risoluzione lineare. –

+0

Niente affatto - questo è un problema di algebra lineare. ANTLR non si applica. – duffymo

11

Dal momento che si sta scrivendo Java, è possibile utilizzare il pacchetto JAMA per risolvere questo. Consiglierei un buon metodo di decomposizione LU.

È un semplice problema di algebra lineare. Dovresti essere in grado di risolverlo a mano o usare qualcosa come Excel piuttosto facilmente. Una volta che hai puoi usare la soluzione per testare il tuo programma.

Non c'è garanzia, ovviamente, che esista una soluzione. Se la tua matrice è singolare, significa che non ci sono intersezioni tra queste tre linee nello spazio 3D.

+0

Qual è il motivo per preferire la decomposizione LU? –

+1

"La decomposizione LU è efficiente dal punto di vista computazionale solo quando dobbiamo risolvere un'equazione di matrice più volte per diversi b: è più veloce in questo caso fare una decomposizione LU della matrice A una volta e poi risolvere le matrici triangolari per il diverso b, che usare ogni volta l'eliminazione gaussiana. " - comune per l'analisi degli elementi finiti con più vettori di carico. Hai ragione - potrebbe non essere importante in questo caso. – duffymo

+0

@duffymo, grazie per la spiegazione. –

5

È inoltre possibile utilizzare Commons Math. Hanno una sezione di questo nel loro userguide (vedi 3.4)

6

è possibile utilizzare il pacchetto java matrix JAMA. Vedere la pagina completa di questo esempio sotto here

/* 
*Solving three variable linear equation system 
* 3x + 2y - z = 1 ---> Eqn(1) 
* 2x - 2y + 4z = -2 ---> Eqn(2) 
* -x + y/2- z = 0 ---> Eqn(3) 
*/ 
import Jama.Matrix; 
import java.lang.Math.*; 
public class Main { 
    public Main() { 
     //Creating Arrays Representing Equations 
     double[][] lhsArray = {{3, 2, -1}, {2, -2, 4}, {-1, 0.5, -1}}; 
     double[] rhsArray = {1, -2, 0}; 
     //Creating Matrix Objects with arrays 
     Matrix lhs = new Matrix(lhsArray); 
     Matrix rhs = new Matrix(rhsArray, 3); 
     //Calculate Solved Matrix 
     Matrix ans = lhs.solve(rhs); 
     //Printing Answers 
     System.out.println("x = " + Math.round(ans.get(0, 0))); 
     System.out.println("y = " + Math.round(ans.get(1, 0))); 
     System.out.println("z = " + Math.round(ans.get(2, 0))); 
    } 

    public static void main(String[] args) { 
     new Main(); 
    } 
} 

Problemi correlati