Как понять что система из двух уравнений и двух переменными имеет бесконечное количество решений?

136
02 декабря 2019, 15:30

Задание такое, есть 2 уравнения с двумя переменными, нужно понять возможно единственное решение, нет решений или бесконечное множество решений

Я решил это вот таким образом

import java.util.Scanner;
public class Equations
{
public static void main(String[] args)
{
    // a11*x1 + a12*x2 = b1 
    // a21*x1 + a22*x2 = b2
    System.out.println("This program solves a system of 2 linear equations Enter the coefficients " + "a11 a12 a21 a22 b1 b2");
    Scanner scan = new Scanner(System.in);
    int a11 = scan.nextInt();
    int a12 = scan.nextInt();
    int a21 = scan.nextInt();
    int a22 = scan.nextInt();
    int b1 = scan.nextInt();
    int b2 = scan.nextInt();
    //Values to define
    float x1 = 0;
    float x2 = 0;
    System.out.println("Eq1: " + a11 + " * x1 + " + a12 + " * x2= " + b1);
    System.out.println("Eq1: " + a21 + " * x1 + " + a22 + " * x2= " + b2);
    if (0 != ((a11 * a22) - (a12 * a21)))
    {
        x1 = (float) ((b1 * a22) - (a12 * b2)) / (float) ((a11 * a22) - (a12 * a21));
        x2 = (float) ((a11 * b2) - (b1 * a21)) / (float) ((a11 * a22) - (a12 * a21));
        System.out.println("Single solution: (" + x1 + ", " + x2 + ")");
    }
    else if (((((b2 * a11) - (b1 * a21)) == 0) && ((b1 * a22) - (b2 * a12) == 0)))
    {
        System.out.println("Many solutions");
    }
    else
    {
        System.out.println("No solution");
    }
}
}

Для проверки использую вот такие комбинации

1) 1 2 3 4 5 6 - Единственное решение (-4.0, 4.5) 2) 0 0 0 0 0 -6 - Нет решений 3) 0 0 1 2 0 3 - Бесконечное кол-во решений

В моем решениее работает только поиск единственного решения, все остальные комбинации попадают в бесконечное кол-во решений

Вопрос - как правильно написать код который будте определять бесконечное кол-во решений?

ПРАВКА

Спасибо @Igor, было найдено вот такое решение

if ((a21 != 0 && a22 != 0 && b2 != 0)&&  ((a11/a21) == (a12/a22)) && ((a11/a21) == (b1/b2))){//бесконечное кол-во решений}

Но как по мне это как то кривовато выглядит

Я нашел еще вот такое решение

нужно проверить 2 условия

Первое

b2a11 - b1a21 = 0 
b1a22 - b2a12 = 0

второе

0x1 + 0x2 = b и b != 0

но мне не понятно, что за b сравнивается во втором условии b1 или b2 и какой смысл умножать 0x1 = (0 * x1)

Answer 1

Классический, изучаемый в школе, метод исследования систем линейных уравнений заключается в нахождении их определителей и проверке свойств этих определителей. Для этого вычисляют т. наз. главный определитель и вспомогательные определители (по одному на каждую переменную).

  • Если все определители оказались равны 0, то система неопределенная (имеет бесконечное множество решений);

  • Если главный определитель равен нулю и при этом хотя бы один из вспомогательных не равен нулю, то система несовместная (не имеет решений);

  • Если главный определитель отличен от нуля, то система имеет единственное решение.

Для системы из двух уравнений с двумя неизвестными вида

 a11•x1 + a12•x2 = b1,
 a21•x1 + a22•x2 = b2    

главный определитель вычисляется как

 D = a11•a22 - a21•a12, 

вспомогательные определители --

 Dx1 = b1•a22 - b2•a12, Dx2 = a11•b2 - a21•b2.

При этом корни уравнения находятся с помощью этих же определителей:

 x1 = Dx1 / D, x2 = Dx1 / D.

Зная эти соотношения, легко написать реализующий их код:

  package stackoverflow;
  import java.util.Scanner;
  public class Ru_So_957037 {
    public static void main(String[] args) {
      // a11*x1 + a12*x2 = b1 
      // a21*x1 + a22*x2 = b2
      System.out.println("This program solves a system of 2 linear equations Enter the coefficients " + "a11 a12 a21 a22 b1 b2");
      Scanner scan = new Scanner(System.in);
      int 
      //     a11 = scan.nextInt(), a12 = scan.nextInt(), b1 = scan.nextInt(),
      //     a21 = scan.nextInt(), a22 = scan.nextInt(), b2 = scan.nextInt();
      // An example of a non-independent system    
      //     a11 = 3, a12 = 2, b1 = 6, a21 = 6, a22 = 4, b2 = 12;
      // An example of an inconsistent system    
      //     a11 = 3, a12 = 2, b1 = 6, a21 = 6, a22 = 4, b2 = 13;
      // An example of an independent system    
        a11 = 3, a12 = 8, b1 = 5, a21 = 6, a22 = 4, b2 = 12;
      System.out.println("Eq1: %3s•x1 + %3s•x2 = %3s\n", a11, a12, b1);
      System.out.println("Eq2: %3s•x1 + %3s•x2 = %3s\n", a21, a22, b2);
      int 
        determ = a11 * a22 - a21 * a12, // Главный определитель
        determX1 = b1 * a22 - b2 * a12, // Опред. по X1
        determX2 = a11 * b2 - a21 * b1;
      if (determ == 0 && determX1 == 0 && determX2 == 0)
        System.out.println("The system is not independent, infinite number of solutions");
      else if (determ == 0)
        System.out.println("The system is inconsistent, no solutions");
      else 
        System.out.printf("\nx1 = %s, \nx2 = %s", 
                          (double)determX1/determ, (double)determX2/determ);
    }
  }

В вашем решении разумно было описать коэффициенты как целые, при условии, что действительно могут потребоваться только уравнения с целыми коэффициентами. Целые коэффициенты позволяют вычислять определители тоже как целые. Если бы это было не так, если бы использовались вещественные коэффициенты, то таким способом невозможно было бы определить свойства произвольной системы с полной уверенностью, т. к. вещественная арифметика в принципе приблизительна и нуль от ненуля отличить бывает трудно.

READ ALSO
Как закрыть нынешний фрагмент и перейти на другой фрагмент?

Как закрыть нынешний фрагмент и перейти на другой фрагмент?

У меня есть bottom-sheet, в нем есть кнопкаКогда я нажимаю на эту кнопку у меня появляется диалог, в этом диалоге есть кнопка, когда я нажимаю уже...

146
Сортировка timestamp в FirebaseDatabase reference

Сортировка timestamp в FirebaseDatabase reference

Всем привет,такой вопрос,в базу пишу время таким образом

185
Форматирование Ipv6

Форматирование Ipv6

Есть вот такой вот прекрасный метод

130
!doctype html - ломает весь сайт. Почему? [закрыт]

!doctype html - ломает весь сайт. Почему? [закрыт]

Внёс на сайт код: <!doctype html> Повело весь дизайн по тегу line-heightВедь это относится к HTML5, он должен более грамотно интерпретировать теги

125