Вычисление определителя и передача массива в метод
Здравствуйте!
Задался целью написать алгоритм для вычисления определителя матрицы размером 3*3.
Попробовал такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
public class Opredelitel { public static void main(String[] args) { Minor Min = new Minor(); Double [] Crew = new Double[13]; Double[][] MatrixNet = new Double[3][3]; MatrixNet[0][0] = 0.1; MatrixNet[0][1] = 0.5; MatrixNet[0][2] = 1.5; MatrixNet[1][0] = 1.1; MatrixNet[1][1] = 1.5; MatrixNet[1][2] = 1.0; MatrixNet[2][0] = 2.1; MatrixNet[2][1] = 2.5; MatrixNet[2][2] = 0.5; for (int k = 0; k 3; k++) { for (int i = 0; i MatrixNet.length; i++) { for (int j = 0; j MatrixNet.length; j++) if ((i != k) & (j != 0)) { int t = 0; Crew[t] = MatrixNet[i][j]; double m = Min.Chek(MatrixNet[0][0],MatrixNet[1][0],MatrixNet[2][0],Crew); System.out.print(m); } } } } } public class Minor { public double m; public double Chek(double MatrixNet1, double MatrixNet2, double MatrixNet3, Double[] Crew) { for (int i=0; i=13;i++) m = double MatrixNet1*(Crew [0]*Crew [3]-Crew [1]*Crew [2])-double MatrixNet2*(Crew [4]*Crew [7]+Crew [5]*Crew [6])-double MatrixNet3*(Crew [8]*Crew [11]-Crew [9]*Crew [10]); return m; } }
В вызывающем методе 3-мя циклами отбираются элементы трех алгебраических дополнений для элементов в 3-х строках. То есть всего 12 элементов. С этой задачей алгоритм справляется превосходно. А на следующем этапе я хотел эти 12 элементов MatrixNet[i][j] записать в новый — уже одномерный — массив Crew[t]. И передать этот новый массив в качестве аргумента в метод Minor, в котором уже вычисляется определитель, как сумма произведений соответствующих элементов на их алгебраические дополнения. Соответствующие элементы передаю также в качестве аргументов
В результате выдает: NullPointedException
Попробовал упростить задачу. Передавал только массив (без отдельных элементов) и в методе Minor вычислял, к примеру, Crew [0] + Crew [2].
Выдает то же самое.
Вычисление определителя матрицы
Нахождение определителя (детерминанта) матрицы
Написать программу нахождения определителя(детерминанта) двумерного массива.
Вычисление определителя и передача массива в метод
Здравствуйте! Задался целью написать алгоритм для вычисления определителя матрицы размером 3*3.
Вычисление определителя матрицы
Определитель Посчитать определитель заданной матрицы A.
Вычисление определителя матрицы
https://www.cyberforum.ru/lisp/thread932196.html package main import "fmt" var a =.
Сообщение было отмечено iSmokeJC как решение
Решение
не все так просто, int тип целых чисел, а double тип вещественных. И задачу надо бы решить в классе Matrix, в котором двумерный массив, хранящий элементы матрицы конструкторов:
— по умолчанию — создается массив 2 x 2 (квадратная матрица)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public class Matrix { //поля класса int n = 0, m = 0; private int array[][]; //перегруженный конструктор Matrix(int[][] array) { this.array = array; this.n = array.length; this.m = array[0].length; } //перегруженный конструктор Matrix(Matrix matrix) { this.array = matrix.array; this.n = matrix.n; this.m = matrix.m; } //конструктор по-умолчанию Matrix() { this.n = 2; this.m = 2;
Посчитать оперелитель матрицы методом Гаусса
Задача: посчитать оперелитель матрицы методом Гаусса. На листочке посчитаю влет, а вот как запрогать — не пойму. Попытался сделать для начала хотя бы приведение к треугольной матрице — вышла шляпа. Вот код функции(сразу скажу, там дикая индия, но красивее придумать не могу):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
public static Matrix gauss (Matrix mt1) { int rows = mt1.getSize().getRows(); int cols = mt1.getSize().getColumns(); int nRow = 0; double tmp = 0; Matrix mt = Matrix.creatMatrix(rows, cols); for (int i=0; irows; i++){ for (int j=0; jcols; j++){ if (mt1.getElem(i, j) != 0) { tmp = mt1.getElem(i, j); mt.setElem(i, j, tmp); tmp = 0; } for (i=i+1; irows; i++) { for (j=j; jcols; j++) { double tmp1 = mt.getElem(i, j)/mt.getElem(i-1, j); mt.setElem(i, j, mt.getElem(i, j)*tmp1); double tmp2 = mt.getElem(i, j)-mt.getElem(i-1, j); mt.setElem(i, j, tmp2); } } } } return mt; }
Решение матрицы методом Гаусса
Мне нужно написать программу для решения матрицы с помощью метода Гаусса. Программу написала.
Решение СЛАУ методом Гаусса
Нужно решить СЛАУ методом Гаусса. Может у кого то есть код или понятный алгоритм его написания. Сам.
Решение системы уравнений методом Гаусса
Здравствуйте, нужно написать программу для решения системы уравнений методом Гаусса. На вход.
Определённый интеграл посчитать методом Гаусса
Дано задание вычислить интеграл методом Гаусса по 2 точкам и сравнить с ответом. .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
public class Gauss { public static double[] gauss(double[][] a, double[] b) { int n = a.length; for (int row = 0; row n; row++) { int best = row; for (int i = row + 1; i n; i++) if (Math.abs(a[best][row]) Math.abs(a[i][row])) best = i; double[] tt = a[row]; a[row] = a[best]; a[best] = tt; double t = b[row]; b[row] = b[best]; b[best] = t; for (int i = row + 1; i n; i++) a[row][i] /= a[row][row]; b[row] /= a[row][row]; // a[row][row] = 1; for (int i = 0; i n; i++) { double x = a[i][row]; if (i != row && x != 0) { // row + 1 instead of row is an optimization for (int j = row + 1; j n; j++) a[i][j] -= a[row][j] * x; b[i] -= b[row] * x; } } } return b; }
Эту пасту я уже видел на просторах тырнета и если бы сам мог разобраться, то не стал бы писать сюда. Так что если несложно, то откомментите код, ибо некоторые места мне не ясны. Плюс он возвращает не определитель, а ответы на систему уравнений, насколько я понял.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public static double gauss (Matrix mt1) { int rows = mt1.getSize().getRows(); int cols = mt1.getSize().getColumns(); double result = 1; //копируем полученную матрицу Matrix mt = new Matrix(); mt.setSize(rows, cols); for (int i=0; irows; i++){ for (int j=0; jcols; j++){ mt.setElem(i, j, mt1.getElem(i, j)); } } //строим треугольную матрицу for (int i=0; icols; i++){ for (int j=i+1; jrows; j++){ for (int k=i; kcols; k++){ double tmp = mt.getElem(j, k)-((mt.getElem(i, k)*mt1.getElem(j, i))/mt.getElem(i, i)); mt.setElem(j, k, tmp); } } } System.out.println(mt.toString()); for (int x=0; xrows; x++){ result = result*mt.getElem(x, x); } return result; }
проверял на примере матрицы:
1 2 3
4 5 6
7 8 9
и получал вот такой результат:
1 2 3
0 -3 -6
0 -14 -28
то есть вторая строка расчитывается верно, а последняя нет, когда начал проверять дебагером, выяснил вот что:
при i=0, первая строка верно вычитается и из второй и из третей и мы получаем:
но затем внешний цикл заходит на новый круг и i=1, и далее мы начинаем вычитать вторую строку из последующих, и считает он неверно, по причине того, что берет один элемент из исходной матрицы (mt1.getElem(j, i)), которая неизменна, но если этот элемент заменить на mt.getElem(j, i), то тогда будет неправильно вычитаться даже первая строка из второй, и мы получим:
это получается из-за того, что изменяется коофициент для умножения строки перед вычитанием.
Как вариант выйти из ситуации — создавать массив в виде уже умноженной на коофициент строки и его уже вычитать, ноо это как-то криво и не факт, что сработает, а до более нормального решения у меня додуматься пока не выходит.
Не могли бы вы натолкнуть на мысль какую-нибудь?
Основная проблема решена. После зануления очередного столбца — копировал рабочую матрицу во временную неизменную. Осталось добавить проверку строк, знака определителя и вырожденных случаев.
Вот код, может пригодится кому:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public static double gauss (Matrix mt1) { int rows = mt1.getSize().getRows(); int cols = mt1.getSize().getColumns(); double result = 1; //копируем полученную матрицу Matrix mt = new Matrix(); mt.setSize(rows, cols); for (int i=0; irows; i++){ for (int j=0; jcols; j++){ mt.setElem(i, j, mt1.getElem(i, j)); } } //строим треугольную матрицу for (int i=0; icols; i++){ for (int x=0; xrows; x++){ for (int y=0; ycols; y++){ mt1.setElem(x, y, mt.getElem(x, y)); } } for (int j=i+1; jrows; j++){ for (int k=i; kcols; k++){ double tmp = mt.getElem(j, k)-((mt.getElem(i, k)*mt1.getElem(j, i))/mt.getElem(i, i)); mt.setElem(j, k, tmp); } } } System.out.println(mt.toString()); for (int x=0; xrows; x++){ result = result*mt.getElem(x, x); } return result; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
/** * Функция нахождения определителя матрицы методом Гаусса * @param mt1 матрица, определитель которой необходимо найти. Тип Matrix * @return result — значение определителя матрицы. Тип double */ public static double gauss (Matrix mt1) { int rows = mt1.getSize().getRows(); int cols = mt1.getSize().getColumns(); double result = 1; int count; /*копируем полученную матрицу в "рабочую" матрицу mt (Она обрабатывается в циклах)*/ Matrix mt = new Matrix(); mt.setSize(rows, cols); for (int i=0; irows; i++){ for (int j=0; jcols; j++){ mt.setElem(i, j, mt1.getElem(i, j)); } } /*копируем полученную матрицу в "статическую" матрицу mt2, в неё копируется "рабочая матрица" mt, после зануления очередного столбца*/ Matrix mt2 = new Matrix(); mt2.setSize(rows, cols); for (int i=0; irows; i++){ for (int j=0; jcols; j++){ mt2.setElem(i, j, mt1.getElem(i, j)); } } /*Матрицы mt и mt2 необходимы, чтобы не испортить получаемую матрицу mt1, которая может быть использована в других областях программы строим треугольную матрицу*/ for (int i=0; icols; i++){ //проверка на НЕнулевой i-тый элемент строки if (mt.getElem(i, i)==0 && irows-1) { count = i; do{ mt.getElem(count, 0); count++; }while(mt.getElem(count, 0) == 0); mt = MatrixCalculator.swapLine(i, count, mt); result = -result; // Если была совершена перестановка — } // меняем знак определителя /*копирование "рабочей" матрицы в "статическую", необходимо для корректного расчета коофициентов умножения строк перед вычитанием*/ for (int x=0; xrows; x++){ for (int y=0; ycols; y++){ mt2.setElem(x, y, mt.getElem(x, y)); } } //зануление i-того столбца for (int j=i+1; jrows; j++){ for (int k=i; kcols; k++){ double tmp = mt.getElem(j, k)-((mt.getElem(i, k)*mt2.getElem(j, i))/mt.getElem(i, i)); mt.setElem(j, k, tmp); } } } //Вычисление определителя for (int x=0; xrows; x++){ result = result*mt.getElem(x, x); } return result; }
Прикреплю также всю работу. Помимо высчитывания определителя она много еще чего делает. Код откомментирован, прописана документация. Только тестов нет =). Может пригодится кому-нибудь, когда-нибудь.