Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.58 KB | None | 0 0
  1. package com.company;
  2.  
  3. import Jama.*;
  4. import java.util.Random;
  5.  
  6. public class Main {
  7.  
  8. static double[][] LU;
  9.  
  10. public static void main(String[] args) {
  11. int n = 4;
  12.  
  13. // Macierz A
  14. Matrix A = Matrix.random(n, n);
  15.  
  16. Random rand = new Random();
  17. int isU = rand.nextInt((1 - 0) + 1) + 0;
  18.  
  19.  
  20. // L lub U - uzupelnianie zerami
  21. if (isU == 0) {
  22. System.out.println("U");
  23. for (int i = 0; i < n; i++) {
  24. for (int j = 0; j < i; j++) {
  25. A.set(i, j, 0);
  26. }
  27. }
  28. } else {
  29. System.out.println("L");
  30. for (int j = 0; j < n; j++) {
  31. for (int i = 0; i < j; i++) {
  32. A.set(i, j, 0);
  33. }
  34. }
  35. }
  36.  
  37. // Macierz B - wektor
  38. Matrix B = Matrix.random(n, 1);
  39.  
  40. System.out.println("Macierz A:");
  41. A.print(5,3);
  42. System.out.println("\nMacierz B:");
  43. System.out.println(" ");
  44. B.print(5,3);
  45.  
  46. // Macierz odwrotna dla testu
  47. System.out.println("Rozwiazanie z biblioteki:");
  48. Matrix G = A.solve(B);
  49. G.print(5,3);
  50. System.out.println(" ");
  51.  
  52. // Solution
  53. System.out.println("Rozwiazanie:");
  54. Matrix S = FindInverse(A, B, n);
  55.  
  56. S.print(5, 3);
  57.  
  58.  
  59. double Af = 0;
  60. for(int i = 0; i < S.getRowDimension(); i++) {
  61. for(int j = 0; j < S.getColumnDimension(); j++) {
  62. Af += S.get(i, j) * S.get(i, j);
  63. }
  64. }
  65.  
  66.  
  67. Af = Math.sqrt(Af);
  68. //System.out.println("\nWartość Af: " + Af);
  69.  
  70. // --------------------------------
  71.  
  72. Matrix identityMatrix = Matrix.identity(n, n);
  73.  
  74. Matrix[] X = new Matrix[n];
  75.  
  76. for(int i = 0; i < n; i++) {
  77. X[i] = FindInverse(A, identityMatrix.getMatrix(0, n - 1, i, i), n);
  78. }
  79.  
  80. Matrix X1 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 0, 0), n);
  81. Matrix X2 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 1, 1), n);
  82. Matrix X3 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 2, 2), n);
  83. Matrix X4 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 3, 3), n);
  84.  
  85. Matrix IKS = new Matrix(n,n);
  86.  
  87. for(int i = 0; i < n; i++) {
  88. for(int j = 0; j < n; j++) {
  89. IKS.set(i, j, X[j].get(i, 0));
  90. }
  91. }
  92.  
  93. IKS.print(5, 3);
  94.  
  95. // po pomnozeniu otrzymanej odwrotnej X przez A
  96. Matrix newIdentity = A.times(IKS);
  97.  
  98. newIdentity.print(10, 10);
  99.  
  100.  
  101. double Af2 = 0;
  102. for(int i = 0; i < newIdentity.getRowDimension(); i++) {
  103. for(int j = 0; j < newIdentity.getColumnDimension(); j++) {
  104. Af2 += newIdentity.get(i, j) * newIdentity.get(i, j);
  105. }
  106. }
  107.  
  108. Af2 = Math.sqrt(Af2);
  109. System.out.println("\nWartość Af: " + Af2);
  110.  
  111. }
  112.  
  113. public static Matrix FindInverse(Matrix A, Matrix B, int n) {
  114.  
  115. // pivot generowanie
  116. int piv[] = getPivot(A, n);
  117.  
  118. int columnNumber = 1;
  119. Matrix matrixX = B.getMatrix(piv,0,columnNumber-1);
  120. double[][] X = matrixX.getArray();
  121.  
  122.  
  123. // Solve L*Y = B(piv,:)
  124. for (int k = 0; k < n; k++) {
  125. for (int i = k+1; i < n; i++) {
  126. for (int j = 0; j < columnNumber; j++) {
  127. X[i][j] -= X[k][j]*LU[i][k];
  128. }
  129. }
  130. }
  131. // Solve U*X = Y;
  132. for (int k = n-1; k >= 0; k--) {
  133. for (int j = 0; j < columnNumber; j++) {
  134. X[k][j] /= LU[k][k];
  135. }
  136. for (int i = 0; i < k; i++) {
  137. for (int j = 0; j < columnNumber; j++) {
  138. X[i][j] -= X[k][j]*LU[i][k];
  139. }
  140. }
  141. }
  142. return matrixX;
  143. }
  144.  
  145.  
  146. public static int[] getPivot(Matrix A, int n) {
  147. LU = A.getArrayCopy();
  148. int piv[] = new int[n];
  149.  
  150. for (int i = 0; i < n; i++) {
  151. piv[i] = i;
  152. }
  153. double[] LUrowi;
  154. double[] LUcolj = new double[n];
  155.  
  156. // Outer loop.
  157. for (int j = 0; j < n; j++) {
  158.  
  159. // Make a copy of the j-th column to localize references.
  160. for (int i = 0; i < n; i++) {
  161. LUcolj[i] = LU[i][j];
  162. }
  163.  
  164. // Apply previous transformations.
  165. for (int i = 0; i < n; i++) {
  166. LUrowi = LU[i];
  167.  
  168. // Most of the time is spent in the following dot product.
  169. int kmax = Math.min(i,j);
  170. double s = 0.0;
  171. for (int k = 0; k < kmax; k++) {
  172. s += LUrowi[k]*LUcolj[k];
  173. }
  174.  
  175. LUrowi[j] = LUcolj[i] -= s;
  176. }
  177.  
  178. // Find pivot and exchange if necessary.
  179. int p = j;
  180. for (int i = j+1; i < n; i++) {
  181. if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {
  182. p = i;
  183. }
  184. }
  185. if (p != j) {
  186. for (int k = 0; k < n; k++) {
  187. double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t;
  188. }
  189. int k = piv[p];
  190. piv[p] = piv[j];
  191. piv[j] = k;
  192. }
  193.  
  194. if (j < n & LU[j][j] != 0.0) {
  195. for (int i = j+1; i < n; i++) {
  196. LU[i][j] /= LU[j][j];
  197. }
  198. }
  199. }
  200.  
  201. return piv;
  202. }
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement