Какой математический пакет найти определитель матрицы

nani75

символьно найти определитель матрицы из многочленов в виде многочлена и решить его.
Mathematica 5.x уже на матрицах 12*12 начинает глючить

slsf

Конкретнее. Математика это может, и сомневаюсь, что там есть глюки.

nani75

Например, Det[Table[Random[]*t + i/j, {i, 11}, {j, 11}]] выдает:

a Det[Table[Random[]*t + i/j, {i, 12}, {j, 12}]]:

(это маленькая часть выражения)
может выражение и верное, но нельзя ли его упростить

Andres

Maple?

slsf

На данный момент могу посоветовать работать только с целыми числами.
Det[Table[Random[Integer,{-12,12}]*t+i/j, {i, 12}, {j, 12}]].
Но тогда получаются только биномы, что, видимо, не совпадает с желаемым результатом.
Если тебе не срочно, можно выяснить решение этой проблемы.

slsf

На самом деле, если ты обратишь внимание, то у тебя и получаются только биномы, если применить к результату функцию Chop (заменяет малые числа нулем).
Пример:
Det[Table[Random[]*t + i/j, {i, 10}, {j, 10}]]//Chop
Ввиду этого, работа только с целыми числами не меняет результат идеологически, тем не менее, позволяя оперировать с большими размерностями матриц.

nani75

но Chop не сильно упрощает полученное выражение, a мне еще приходится решать Det[ ]==0

slsf

Да, для случая 12, при изначальной постановке вопроса, вообще ничего пока не помогает.
Поэтому, если есть возможность, перейди к другой постановке задачи, используй целые числа в качестве случайных, как я писал выше.

nani75

случайные числа я взял для примера, в действительности все коэффициенты находятся численно и никак не являются целыми.

Sanych

Maple ведь уже предлагали. Например, такое там работает (Maple 9.5).
> with(RandomTools):
> with(LinearAlgebra):
> randomize;

> N:=20;

> A:=RandomMatrix(N,generator=0..1.0);
> for i from 1 to N do
> for j from 1 to N do
> A[i,j]:=t*A[i,j]+i/j;
> end do;end do;
> Determinant(A,method=unifloat[t]);

-8 -7 17 4 -7 18
8.43 10 t - 9.30 10 t + 0.000001141 t - 4.38 10 t
14 11 5 7
+ 0.0000018763 t + 0.0000011795 t + 0.0000065564 t + 0.0000014819 t
9 13 -8 15 12
- 0.000008742 t + 0.0000028090 t + 7.88 10 t - 0.0000033054 t
-7 2 10 -7 8
- 6.903 10 t + 0.000004119 t + 2.33 10 - 0.0000048909 t
6 20 -7 16 19
+ 0.000001993 t + 0.03276417395 t - 6.35 10 t - 2.674903033 t
3
- 0.0000031516 t

> poly:=sort(%,t);
> fsolve(poly);
0.3957771059, 81.64109501
> solve(poly);
-0.4217141410 - 0.07311455710 I, -0.4217141410 + 0.07311455710 I,
-0.3673223278 - 0.2110773188 I, -0.3673223278 + 0.2110773188 I,
-0.2635571495 - 0.2978311456 I, -0.2635571495 + 0.2978311456 I,
-0.1942058166 - 0.3624269306 I, -0.1942058166 + 0.3624269306 I,
-0.06158517964 - 0.4358295827 I, -0.06158517964 + 0.4358295827 I,
0.1028108478 - 0.4392483049 I, 0.1028108478 + 0.4392483049 I,
0.2560894610 - 0.3693810312 I, 0.2560894610 + 0.3693810312 I,
0.3576808108 - 0.2445505472 I, 0.3576808108 + 0.2445505472 I,
0.3939148579 - 0.1105718053 I, 0.3939148579 + 0.1105718053 I, 0.3957771059,
81.64109501

slsf

Проблема была вызвана генератором случайных чисел и точностью представления чисел с плавающей точкой.
Решение:
f[x_Integer] := Det[Table[Random[Integer, {0, 1000000}]/1000000*t + i/j, {i,x}, {j, x}]];
N[f[29]]
Out = 5.152227802512568*^-184*(2.2013695153938625*^184*t^28 - 3.757923397770665*^183*t^29)
То есть для матрицы 29 на 29 ответ генерируется быстро. Потому проблемы нет,
а если, как ты заметил, у тебя все входные данные вычисляются заранее,
то сложностей вообще возникнуть не должно, то есть математика это может.
Успехов!
Пиши.
Оставить комментарий
Имя или ник:
Комментарий: