Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Поиск обратной матрицы


Автор: xreal 22.10.2010, 19:28
Здравствуйте, читал про метод Гаусса, но не совсем представляю его алгоритмическую реализацию. Очень буду признателен, если поможете словом или кодом=)

Автор: nc30 23.10.2010, 06:15
http://sites.google.com/site/indy256/algo/gauss

Автор: xreal 24.10.2010, 23:56
И всё-таки хотелось бы увидеть именно алгоритм поиска обратной матрицы в чистом виде. Спасибо.

Автор: xreal 1.11.2010, 10:41
неужели нет идей?)

Автор: jk1 1.11.2010, 11:17
Цитата

Возьмём две матрицы: саму A и единичную E. Приведём матрицу A к единичной матрице методом Гаусса. После применения каждой операции к первой матрице применим ту же операцию ко второй. Когда приведение первой матрицы к единичному виду будет завершено, вторая матрица окажется равной A-1.


Приведенный код надо слегка дополнить, так чтобы он дублировал свои действия на заранее созданной единичной матрице.

Автор: Sibit 1.11.2010, 11:19
А что подразумевается под "в чистом виде"?http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Автор: Teresh 2.11.2010, 01:33
когда-то давно лаба такая была
код рабочий, но не красивый)

Код

public class Gauss {
    private int n;
    private double a[][];
    private double b[];
    
    Gauss(int n, double a[][], double b[]) {    
        this.n = n;
        this.a = a;
        this.b = b;
    }
    
    public void gauss_method() {
        for (int i = 0 ; i < n; i++) {
            if (test1(a, b) == 2)
                return;
            if (testNull(i, a) == 3)
                return;
            setOne(i, a, b);
            setToFirst(i, a, b);
        }
        getX(a, b);
    }
    
    void printMatrix(double a[][]) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
                System.out.print(a[i][j] + " ");
            System.out.print(b[i]);
            System.out.println();
        }
        System.out.println();
    }
    
    private int test1(double a[][], double b[]) {
        int k;
        
        for (int i = 0; i < n; i++) {
            k = 0;
            for (int j = 0; j < n; j++) {
                if (a[i][j] == 0) 
                    k++;
            }
            if (k == 3 && b[i] != 0) {
                System.out.println("Нет решений");
                System.out.println();
                return 2;
            }
        }
        return 1;
    }
    
    private int testNull(int k, double a[][]) {
        int j = k; 
        double temp;
        while (a[k][j] == 0) {    
            j++;
            if (j == n - 1) {
                System.out.println("Деление на ноль");
                return 3;
            }
            for (int i = k; i < n; i++) {
                    temp = a[k][i];
                    a[k][i] = a[j][i];
                    a[j][i] = temp;
                    temp = b[k];
                    b[k] = b[j];
                    b[j] = temp;
            }
        }
        return 1;
    }
    
    private void setOne(int k, double[][] a, double[] b) {
        try {
            for (int i = k + 1; i < n; i++)
             a[k][i] = a[k][i] / a[k][k];   
            b[k] = b[k] / a[k][k];
        } catch (Exception e) {
            System.out.println("sfdsf");
        }
            a[k][k] = 1;
    }
    
    private void setToFirst(int k, double[][] a, double[] b) {
        for (int i = k + 1 ;i < n; i++ ) {
            for (int j = k + 1; j < n; j++) {
                a[i][j] = a[i][j] / a[i][k] - a[k][j];
            }
            b[i] = b[i] / a[i][k] - b[k];
            a[i][k] = 0;
        }    
    }
    
    public double[] getX(double a[][], double b[]) {
        double[] x = new double[n];
        double[] no = new double[1];
        
        if (a[n-1][n-1] != 0) {
            x[n-1] = b[n-1] / a[n-1][n-1];
        }
        else {
            if (b[n-1] != 0) {
             System.out.println("Нет решений"); 
             no[0] = 2;
             return no;
            }
            else {
             System.out.println("Бесконечно решений");
             no[0] = 3;
             return no;
            }
        }
        
        for (int i = n - 2; i >= 0; i--) {
            for (int j = n-1; j > i; j--) {
                b[i] = b[i] - a[i][j] * x[j];
            }
            x[i] = b[i] / a[i][i];
        }
        
        for (int i = 0; i < n; i++) {
         System.out.println("x[" + (i+1) + "] = " + x[i]);
        }   
        
        System.out.println();    
        return x;
    }
}


Автор: xreal 2.11.2010, 13:08
Всем большое спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)