Advertisement
Guest User

Untitled

a guest
May 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 2.83 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class SystemOfEquations {
  4.     // x0 = 2
  5.     // x1 = 3
  6.     // x2 = 5
  7.     // x3 = -2
  8.     //
  9.     // 4 5
  10.     // 1 2 3 4 15
  11.     // 8 7 2 -1 49
  12.     // 4 -2 -3 0 -13
  13.     // 0 4 3 2 23
  14.     Scanner in = new Scanner(System.in);
  15.  
  16.     private void showSystem() {
  17.         int n = in.nextInt();
  18.         int m = in.nextInt();
  19.         double[][] a = new double[n][m];
  20.         for (int i = 0; i < n; ++i) {
  21.             for (int j = 0; j < m; ++j) {
  22.                 a[i][j] = in.nextDouble();
  23.             }
  24.         }
  25.         double[][] x = solve(a);
  26.         out(x);
  27.     }
  28.  
  29.     // 3
  30.     // 1 2 14
  31.     // 4 8 -5
  32.     // 3 8 0
  33.     private void showInverse() {
  34.         int n = in.nextInt();
  35.         double[][] a = new double[n][n];
  36.         for (int i = 0; i < n; ++i) {
  37.             for (int j = 0; j < n; ++j) {
  38.                 a[i][j] = in.nextDouble();
  39.             }
  40.         }
  41.         double[][] m = new double[n][2 * n];
  42.         for (int i = 0; i < n; ++i) {
  43.             for (int j = 0; j < n; ++j) {
  44.                 m[i][j] = a[i][j];
  45.             }
  46.             m[i][i + n] = 1.0;
  47.         }
  48.         double[][] x = trans(solve(m));
  49.         out(x);
  50.         x = multiply(a, x);
  51.         System.out.println();
  52.         out(x);
  53.     }
  54.  
  55.     private double[][] multiply(double[][] a, double[][] b) {
  56.         double[][] c = new double[a.length][b[0].length];
  57.         for (int i = 0; i < c.length; ++i) {
  58.             for (int j = 0; j < c[i].length; ++j) {
  59.                 for (int k = 0; k < a[i].length; ++k) {
  60.                     c[i][j] += a[i][k] * b[k][j];
  61.                 }
  62.             }
  63.         }
  64.         return c;
  65.     }
  66.  
  67.     private void out(double[][] x) {
  68.         if (x.length == 0) {
  69.             return;
  70.         }
  71.         for (int i = 0; i < x.length; ++i) {
  72.             for (int j = 0; j < x[i].length; ++j) {
  73.                 if (j != 0) {
  74.                     System.out.print(' ');
  75.                 }
  76.                 System.out.print(x[i][j]);
  77.             }
  78.             System.out.println();
  79.         }
  80.     }
  81.  
  82.     private double[][] solve(double[][] a) {
  83.         int n = a.length;
  84.         int m = a[0].length;
  85.         for (int j = 0; j < n; ++j) {
  86.             int best = j;
  87.             for (int i = j + 1; i < n; ++i) {
  88.                 if (Math.abs(a[i][j]) > Math.abs(a[best][j])) {
  89.                     best = i;
  90.                 }
  91.             }
  92.             if (Math.abs(a[best][j]) < 1e-9) {
  93.                 System.out.println("Determinant is zero!");
  94.                 return new double[0][0];
  95.             }
  96.             double[] td = a[j];
  97.             a[j] = a[best];
  98.             a[best] = td;
  99.             for (int i = j + 1; i < n; ++i) {
  100.                 double koef = a[i][j] / a[j][j];
  101.                 for (int k = j; k < m; ++k) {
  102.                     a[i][k] -= koef * a[j][k];
  103.                 }
  104.             }
  105.         }
  106.         double[][] res = new double[m - n][n];
  107.         for (int j = n - 1; j >= 0; --j) {
  108.             for (int k = n; k < m; ++k) {
  109.                 double koef = a[j][k] / a[j][j];
  110.                 res[k - n][j] = koef;
  111.                 for (int i = j - 1; i >= 0; --i) {
  112.                     a[i][k] -= a[i][j] * koef;
  113.                 }
  114.             }
  115.         }
  116.         return res;
  117.     }
  118.  
  119.     private double[][] trans(double[][] a) {
  120.         double[][] res = new double[a[0].length][a.length];
  121.         for (int i = 0; i < res.length; ++i) {
  122.             for (int j = 0; j < res[i].length; ++j) {
  123.                 res[i][j] = a[j][i];
  124.             }
  125.         }
  126.         return res;
  127.     }
  128.  
  129.     public static void main(String[] args) {
  130.         new SystemOfEquations().showSystem();
  131.         // new SystemOfEquations().showInverse();
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement