Как решать уравнения с помощью java?

У меня есть три уравнения, подобные следующим:

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

Как я могу найти значения x, y и z с помощью 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?    
} 

Есть ли у вас какие-либо возможные решения или другие общие рамки?


person Cong De Peng    schedule 16.09.2009    source источник
comment
Другой источник с примерами кода на разных языках приведен здесь   -  person DaveJohnston    schedule 16.09.2009
comment
Я хочу, чтобы люди перестали брать на себя домашнюю работу. Одно дело, если кто-то публикует что-то прямо из задачи из учебника, например «Напишите нерекурсивный алгоритм для достижения сортировки O (log n) для массива».   -  person Jason S    schedule 18.09.2009


Ответы (8)


Вы можете использовать определитель для вычисления значений x y и z. Логику можно найти здесь http://www.intmath.com/Matrices-determinants/1_Determinants.php

И тогда вам нужно реализовать это в java, используя трехмерные массивы.

person Xinus    schedule 16.09.2009
comment
Это математически верно, но не очень хорошо с точки зрения эффективности. см. Стенограмму - Лекция 20 из видеолекций профессора Гилберта Стрэнга, преподающего 18.06 Если бы вам пришлось - и Matlab никогда, никогда бы этого не сделал. Я имею в виду, что это будет использовать исключение. ocw.mit.edu/OcwWeb/Mathematics/ 18-06Весна-2005/ВидеоЛекции/ - person Liran Orevi; 16.09.2009
comment
Вычисление определителя (я думаю) O (n!). Исключение Гаусса - это O (n ^ 2). - person erikkallen; 17.09.2009
comment
НЕТ НЕТ НЕТ НИКОГДА не используйте определители. То, что сказали предыдущие два комментатора. - person Jason S; 18.09.2009

Поскольку вы пишете Java, вы можете использовать пакет JAMA, чтобы решить эту проблему. Я бы порекомендовал хороший метод разложения LU.

Это простая задача линейной алгебры. Вы должны быть в состоянии решить это вручную или с помощью чего-то вроде Excel довольно легко. Получив это, вы можете использовать решение для тестирования своей программы.

Нет никакой гарантии, конечно, что есть решение. Если ваша матрица сингулярна, это означает, что в трехмерном пространстве нет пересечения этих трех линий.

person duffymo    schedule 16.09.2009
comment
В чем причина предпочтения LU-разложения? - person Liran Orevi; 16.09.2009
comment
Разложение LU вычислительно эффективно только тогда, когда нам приходится решать матричное уравнение несколько раз для разных b; в этом случае быстрее выполнить LU-разложение матрицы A один раз, а затем решить треугольные матрицы для разных b, чем каждый раз использовать исключение Гаусса. - общий для анализа методом конечных элементов с несколькими векторами нагрузки. Вы правы - в данном случае это может не иметь значения. - person duffymo; 17.09.2009

Вы также можете использовать Commons Math. У них есть соответствующий раздел в их руководстве пользователя (см. 3.4).

person Valentin Rocher    schedule 16.09.2009

Создайте парсер с помощью ANTLR. Затем оцените AST, используя Исключение по Гауссу.

person erikkallen    schedule 16.09.2009
comment
вау, знания такие профессиональные. Мне нужно время, чтобы переварить. - person Cong De Peng; 16.09.2009
comment
Я не уверен, что понимаю связь между синтаксическим анализом и линейным решением. - person Liran Orevi; 16.09.2009
comment
Вовсе нет — это задача линейной алгебры. ANTLR не применяется. - person duffymo; 16.09.2009
comment
@duffymo: добавил последний шаг к объяснению. - person erikkallen; 16.09.2009
comment
синтаксический анализ был бы потому, что исходный пост указывал уравнения в виде строк. - person Martin DeMello; 16.09.2009
comment
Я передумал и проголосовал за ответ. Я бы не рекомендовал вводить уравнения в виде строк, но если это то, чего действительно хочет ОП, то ответ Эриккаллена правильный. Благодарю за разъяснение. - person duffymo; 17.09.2009

Используйте Gaussian_elimination, это невероятно просто, но есть некоторые значения вам может быть нелегко вычислить.

Пример кода

person Liran Orevi    schedule 16.09.2009

попробуйте это, пожалуйста:

import org.apache.commons.math3.linear.*;
import org.junit.Assert;
import org.junit.Test;

/**
 * Author: Andrea Ciccotta
 */
public class LinearSystemTest extends Assert {

    /**
     * Ax = B
     * 2x + 3y - 2z = 1
     * -x + 7y + 6x = -2
     * 4x - 3y - 5z = 1
     * <p>
     * it will use the LUDecomposition:
     * LU decomposition:
     * 1. find A = LU where LUx = B
     * 2. solve Ly = B
     * 4. solve Ux = y
     */
    @Test
    public void linearSystem3x3Test() {
        final RealMatrix coefficients = new Array2DRowRealMatrix(new double[][]{{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}});
        final DecompositionSolver solver = new LUDecomposition(coefficients).getSolver();

        final RealVector constants = new ArrayRealVector(new double[]{1, -2, 1}, false);
        final RealVector solution = solver.solve(constants);
        final double[] arraySolution = solution.toArray();

        assertEquals(arraySolution[0], -0.36986301369863006, 0);
        assertEquals(arraySolution[1], 0.1780821917808219, 0);
        assertEquals(arraySolution[2], -0.6027397260273972, 0);
    }

}
person Andrea Ciccotta    schedule 13.11.2020

Существует множество способов решения уравнений линейной системы. Есть самый простой способ это сделать. В примере код Java решает для двух переменных ИСПОЛЬЗОВАНИЕ матричного метода, но вы можете изменить его для выполнения вычислений с тремя переменными.

import java.util.Scanner; //OBJETO SCANNER

public class SYS2 {

    public static void main (String args[]) {

        //VARIABLE DECLARATION SPACE
        int i=0,j = 0;
        float x,y;
         Scanner S = new Scanner (System.in);

         int EC3[][]= new int [2][3]; //ARRAY TO STORE EQUATION 2X3

         float DET1=0;
        float DET2 =0;


        float DETA=0;
         float DETB=0;

        //END VARIABLE DECLARATIONS
       System.out.println("Enter Equation System : ");

for (i=0; i< 2; i++) {
                for (j=0; j< 3; j++) 
                        EC3[i][j] = S.nextInt();
                }    

                System.out.println("SISTEMA DE ECUACION LINEAL: "); //THIS SENTENCE ONLY PRINT THE CATCHED VALUES OF EQUATION

                for (i=0; i< 2; i++) {
                        for (j=0; j< 3; j++) 

                              System.out.print(EC3[i][j] + "  ");

                            System.out.println();


                }    




           //    System.out.print("Determinante A de la Matriz: ");

             //    System.out.print((EC3[0][2] * EC3[1][1]) - (EC3[0][1]*EC3[1][2]) );

                for (i=0;i<2;i++) {
                        for (j=0; j<2;j++)
                                DET1=  ((EC3[0][2] * EC3[1][1]) -( EC3[0][1]*EC3[1][2]));
                }

                           //    System.out.print(DET1 );
                            //       System.out.println();

                                 for (i=0;i<2;i++) {
                                        for (j=0; j<2;j++)
                                         DET2=  ((EC3[0][0] * EC3[1][1]) - (EC3[0][1]*EC3[1][0]));
                }

                               // System.out.print("Determinante B de la Matriz: ");
                               //  System.out.println(DET2 ); 

    x = (DET1 / DET2);

    System.out.println();
    System.out.println("X = " + x);
    System.out.print("=======================");
    //FIN PARA VALOR DE X



    //COMIENZO DE VALOR DE Y

  //  System.out.print("Determinante A de la Matriz Y: ");

                                    for (i=0;i<2;i++) {
                                            for (j=0; j<2;j++)
                                         DETA=  EC3[0][0] * EC3[1][2] - EC3[0][2]*EC3[1][0];


                                        //    System.out.print(DETA );
                                          //  System.out.println();
                }


                                     for (i=0;i<2;i++) {
                                            for (j=0; j<2;j++)
                                         DETB=  EC3[0][0] * EC3[1][1] - EC3[0][1]*EC3[1][0];

                }

                                   // System.out.print("Determinante B de la Matriz Y: ");
                                   //  System.out.println(DETB );                  
                                    y = DETA / DETB;

                                    System.out.print("=======================");
                                    System.out.println();

                                    System.out.println("Y = " + y);
                                    System.out.print("=======================");
    }
}




person Keating Lopez    schedule 05.05.2020

person    schedule
comment
Спасибо. Просто хотел этот простой пример, но сайт JAMA не работает из-за закрытия правительства. Ты спас меня - person Vyacheslav Tsivina; 22.01.2019