Advertisement
JeeyVee

Untitled

Dec 11th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.59 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.io.*;
  4. import java.text.DecimalFormat;
  5. import java.text.NumberFormat;
  6. import java.util.Arrays;
  7. import java.util.StringTokenizer;
  8.  
  9. @SuppressWarnings("All")
  10. public class Jacobi {
  11.  
  12.     public static final int Max_Iter = 100;
  13.     private double[][] M;
  14.  
  15.     public Jacobi(double[][] matrix) {
  16.         M = matrix;
  17.     }
  18.  
  19.     public void print() {
  20.         System.out.println();
  21.         int n = M.length;
  22.         System.out.println("Współczynniki wolne wraz z wektorem:");
  23.         for (int i = 0; i < n; i++) {
  24.             for (int j = 0; j < n + 1; j++)
  25.                 System.out.print(M[i][j] + " ");
  26.             System.out.println();
  27.         }
  28.     }
  29.  
  30.     public void solve() {
  31.         int iterations = 0;
  32.         int n = M.length;
  33.         double epsilon = 1e-15;
  34.         double[] X = new double[n];
  35.         double[] P = new double[n];
  36.         Arrays.fill(X, 0);
  37.         Arrays.fill(P, 0);
  38.  
  39.         System.out.println("\nWektor rozwiązania:");
  40.         while (true) {
  41.             for (int i = 0; i < n; i++) {
  42.                 double sum = M[i][n]; // B[n]
  43.  
  44.                 for (int j = 0; j < n; j++)
  45.                     if (j != i)
  46.                         sum -= M[i][j] * P[j];
  47.  
  48.                 // Uaktualnienie X[i], nie jest używany w kolejnym wierszu
  49.                 // a w kolejnej iteracji metody
  50.                 X[i] = 1 / M[i][i] * sum;
  51.             }
  52.  
  53.             System.out.print("X_" + iterations + " = { ");
  54.             for (int i = 0; i < n; i++)
  55.                 System.out.print(X[i] + " ");
  56.             System.out.println("}");
  57.  
  58.             iterations++;
  59.             if (iterations == 1) continue;
  60.  
  61.             boolean stop = true;
  62.             for (int i = 0; i < n && stop; i++)
  63.                 if (Math.abs(X[i] - P[i]) > epsilon)
  64.                     stop = false;
  65.  
  66.             if (stop || iterations == Max_Iter) break;
  67.             P = (double[]) X.clone();
  68.         }
  69.     }
  70.  
  71.     public static void main(String args[]) throws IOException {
  72.  
  73.         // Pobranie od użytkownika wielkości układu równań
  74.         String naglowek =
  75.                 "----------------\nMetoda Jacobiego \n" +
  76.                         "----------------\n" +
  77.                         "Rozwiązanie układu n-równań z n-niewiadomymi Ax=b\n" +
  78.                         "Podaj wielkość układu (n)";
  79.  
  80.         System.out.println(naglowek);
  81.  
  82.         int n;
  83.         double[][] M;
  84.  
  85.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  86.  
  87.         n = Integer.parseInt(reader.readLine());
  88.         if (n < 1) {
  89.             System.out.println("Nieprawidłowa wartość parametru n");
  90.             return;
  91.         }
  92.  
  93.         System.out.println("Podaj elementy macierzy współczynników " +
  94.                 "wraz z wektorem wyrazów wolnych");
  95.         M = new double[n][n + 1];
  96.  
  97.         long startTime = System.currentTimeMillis();
  98.  
  99.         for (int i = 0; i < n; i++) {
  100.             StringTokenizer strtk = new StringTokenizer(reader.readLine());
  101.  
  102.             while (strtk.hasMoreTokens())
  103.                 for (int j = 0; j < n + 1 && strtk.hasMoreTokens(); j++)
  104.                     M[i][j] = Integer.parseInt(strtk.nextToken());
  105.         }
  106.  
  107.         Jacobi jacobi = new Jacobi(M);
  108.  
  109.         jacobi.print();
  110.         jacobi.solve();
  111.  
  112.         System.out.println();
  113.         long endTime = System.currentTimeMillis();
  114.         NumberFormat formatter = new DecimalFormat("#0.00000");
  115.         System.out.println("Czas wykonania obliczeń to " + formatter.format((endTime - startTime) / 1000d) + " milisekund");
  116.  
  117.     }
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement