Расчет линейных систем с использованием EJML

Как именно мне отформатировать мой код, чтобы он занял

1x+2y+3z+4w=5e
6x+7y+8z+9w=10e
11x+12y+13z+14w=15e
16x+17y+18z+19w=20e

и вернуть x,y,z,w?

Я пытался следовать формату, описанному в этот ответ, в настоящее время у меня есть следующий код, который выдает IllegalArgumentException: "java.lang.IllegalArgumentException: Can't solve for wide systems. More variables than equations. при попытке вычислить 4 результата:

                    double[20] args = {1,2,3... ,20};
                    SimpleMatrix A = new SimpleMatrix(4,5);
                    SimpleMatrix b = new SimpleMatrix(4,1);
                    int val=0;
                    for(int i =0;i<4;i++){
                        for(int j=0;j<5;j++){
                            A.setRow(i, j, args[val]);
                            val++;
                        }
                        b.setRow(i,0, args[val-1]);
                    }
                    double[] result = new double[4];  //results for x y z w
                    try {
                        SimpleMatrix solution = A.solve(b);   //throws IllegalArgumentException!
                        for(int i=0;i<solution.getNumElements();i++) {
                            result[i] = solution.get(i, 0);
                        }

                        --print results--
                    }
                    catch ( SingularMatrixException e ) {
                       throw new IllegalArgumentException();
                    }

Что я делаю не так?


person daedsidog    schedule 19.01.2016    source источник
comment
У вашей матрицы определитель равен 0, поэтому ее нельзя инвертировать... Измените (например) 16x на 20x, и она будет работать лучше.   -  person assylias    schedule 19.01.2016
comment
Похоже, я был неправ. На самом деле это было IllegalArgumentException, а не SingularMatrixException "java.lang.IllegalArgumentException: Can't solve for wide systems. More variables than equations.. Я отредактировал свой вопрос. Тем не менее, переход с 16x на 20x не решил эту проблему.   -  person daedsidog    schedule 19.01.2016
comment
Вы не должны использовать setRow() для установки отдельного элемента в матрице. используйте для этого A.set(row,vol,value).   -  person lessthanoptimal    schedule 21.12.2016


Ответы (1)


Я думаю, что это может быть связано с размерами вашей матрицы.

new SimpleMatrix A(4,5) следует заменить на new SimpleMatrix A(4,4).

person djebeeb    schedule 19.01.2016
comment
Я тоже это сделал, но получаю матричное исключение, говорящее, что результат содержит неисчисляемые числа, - person daedsidog; 19.01.2016
comment
Даже если вы измените 16x на 20x, вы получите одну свободную переменную. Я не знаком с классом SimpleMatrix, но не думаю, что он дал бы решение, если бы в нем использовались свободные переменные. Я предлагаю попробовать изменить числа в args, потому что 4-я строка представляет собой линейную комбинацию первых 3 строк, а 3-я строка — это линейная комбинация первых 2 строк, если вы используете числа 1-20 последовательно. Другими словами, ваша матрица, вероятно, все еще сингулярна, поэтому измените ее достаточно, чтобы она перестала быть сингулярной. - person djebeeb; 19.01.2016
comment
Знакомы ли вы с другими методами, кроме SimpleMatrix, используемыми в EJML, которые я мог бы использовать вместо них? - person daedsidog; 19.01.2016
comment
Быстрый поиск нашел JAMA, который имеет аналогичный синтаксис, но его функцияsolve() возвращает решение методом наименьших квадратов, если матрица является единственной (если это то, что вы ищете). JAMA - person djebeeb; 19.01.2016
comment
Если вы имеете дело с сингулярными системами, вы хотите использовать SVD, что верно для любой библиотеки линейной алгебры. Вам нужно будет прочитать о SVD, чтобы понять, что он делает и как его использовать. SimpleMatrix предоставляет доступ к SVD. - person lessthanoptimal; 21.12.2016