Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.text.NumberFormat;
- import java.util.Arrays;
- public class Main {
- public static double[][] matrixAT(double [][] a,int n,int m){
- double[][] b=new double[n][m];
- for (int i = 0;i < n; i++) {
- for (int j = 0; j < n; j++) {
- b[i][j]=a[j][i];
- }
- }
- return b;
- }
- public static void printMatrix(double [][] matrix)
- {
- for (int i = 0; i < matrix.length; i++)
- {
- for (int j = 0; j < matrix[0].length; j++)
- {
- System.out.printf("%.4f",matrix[i][j]);
- System.out.print(" ");
- }
- System.out.println();
- }
- System.out.println("-----------");
- }
- public static void print(double[][] a,int n,int m){
- NumberFormat formatter = NumberFormat.getNumberInstance();
- formatter.setMaximumFractionDigits(4);
- for (int i = 0;i < n; i++) {
- for (int j = 0; j < m; j++) {
- System.out.print(formatter.format(a[i][j])+"\t\t");
- }
- System.out.println();
- }
- System.out.println();
- }
- public static void printArray(double[] a,int n){
- NumberFormat formatter = NumberFormat.getNumberInstance();
- formatter.setMaximumFractionDigits(4);
- System.out.println();
- for (int i=0;i<n;i++){
- System.out.print(formatter.format(a[i])+" ");
- }
- System.out.println();
- }
- public static void printArrayexp(double[] a,int n){
- System.out.println();
- for (int i=0;i<n;i++){
- System.out.printf("%e",a[i]);
- System.out.print(" ");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- int n = 5;
- double epc=0.00001;
- double[][] A=
- {
- {0.8918, 0.0000, -0.2330, 0.1638, 0.2730, 1.7545},
- {-0.0546, 0.5824, 0.0000, -0.1110, 0.0364, 2.3278},
- {0.0182, -0.1638, 1.0556, 0.0200, 0.0637, -3.2742},
- {0.0546, 0.0000, -0.1329, 1.0556, 0.0000, -9.0472},
- {0.0364, -0.0546, 0.2639, -0.0218, 0.7644, 3.9239},
- };
- double[][] A1 = {{1,2,3,4},{2,1,-1,-2},{3,-1,5,1}};
- double[][] B = new double[n][n + 1];
- double[][] H = new double[n][n];
- double[][] F = new double[n][n];
- double[] prewx=new double[n];
- double[] newx=new double[n];
- double[][] AT;
- AT=matrixAT(A,n,n);
- for (int i = 0; i<n; i++) {//AT*A
- for (int j = 0; j<n; j++) {
- for (int k = 0; k<n; k++)
- B[i][j] += AT[i][k] * A[k][j];
- }
- }
- double[][] ATA=new double[n][n];
- for (int i = 0; i<n; i++) {//B=E-AT*A
- for (int j = 0; j < n; j++) {
- ATA[i][j] = B[i][j];
- }
- }
- for (int i = 0; i<n; i++) {//B=E-AT*A
- for (int j = 0; j<n; j++) {
- if (i == j){
- B[i][j]=1-B[i][j];
- }
- else {
- B[i][j]=-B[i][j];
- }
- }
- }
- double[] g=new double[n];
- for (int i = 0; i < n; i++) {//g=AT*b
- for (int j = 0; j < n ; j++) {
- g[i]+=AT[i][j]*A[j][n];
- B[i][n]+=AT[i][j]*A[j][n];
- }
- }
- System.out.println("Расширенная матрица B|g:");
- print(B,n,n+1);
- for (int i = 0; i < n; i++) {//g=AT*b
- for (int j = 0; j < n; j++) {
- if (i > j) {
- H[i][j] = B[i][j];
- }
- else {
- F[i][j]=B[i][j];
- }
- }
- }
- double sum=0,max=0;
- for (int i = 0; i < n; i++) {
- sum=0;
- for (int j = 0; j < n; j++) {
- sum += B[i][j];
- }
- if (sum>max){
- max=sum;
- }
- }
- if (Math.abs(max)<1){
- System.out.println("Проверка сходимости: сходится");
- System.out.println();
- }
- for (int i=0;i<n;i++){
- prewx[i]=g[i];
- }
- double norm;
- int count=0;
- do{
- count++;
- double sum1=0;
- for (int i = 0; i < n; i++) {
- sum1=0;
- for (int j=0;j<i;j++) {
- sum1 += H[i][j] * newx[j];
- }
- for (int j = i; j < n ; j++) {
- sum1+=F[i][j]*prewx[j];
- }
- newx[i]=sum1+g[i];
- }
- System.out.println(Arrays.toString(newx));
- norm=Math.abs(newx[0]-prewx[0]);
- for (int i=0;i<n;i++){
- if (Math.abs(newx[i]-prewx[i])>norm){
- norm=Math.abs(newx[i]-prewx[i]);
- }
- prewx[i]=newx[i];
- }
- System.out.print("норма: "+norm+'\n');
- }
- while (norm>=epc);
- System.out.print("Решение системы:\n");
- System.out.println(Arrays.toString(newx));
- System.out.println();
- System.out.println("Количество итераций: "+count);
- double[] r1=new double[n];
- double[] r2=new double[n];
- double sum1=0;
- printMatrix(B);
- for (int i = 0; i < n; i++) {
- sum1=0;
- for (int j = 0; j < n ; j++) {
- sum1+=ATA[i][j]*newx[j];
- }
- r1[i]=sum1-B[i][n];
- }
- for (int i = 0; i < n; i++) {
- sum1=0;
- for (int j = 0; j < n ; j++) {
- sum1+=A[i][j]*newx[j];
- }
- r2[i]=sum1-A[i][n];
- }
- System.out.println();
- System.out.print("r=AX-b");
- System.out.println('\n'+Arrays.toString(r1));
- System.out.print("r=AT*AX-AT*b");
- System.out.println('\n'+Arrays.toString(r2));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement