2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3  След.
 
 
Сообщение16.12.2006, 17:43 
Аватара пользователя
MatLAB дает тоже $det(A)=-9.517125718623159\cdot10^{-52}$
и среди собственных значений четыре пары комплексно-сопряженных:
Код:
  1.24109930684514 + 0.82813911549924i
  1.24109930684514 - 0.82813911549924i
  1.91787489084256 + 0.00135018136097i
  1.91787489084256 - 0.00135018136097i
-0.18282665574439 + 0.00022681243020i
-0.18282665574439 - 0.00022681243020i
-0.10532373596563 + 0.00006042103784i
-0.10532373596563 - 0.00006042103784i


остальные - действительные

PS скачивалось, несмотря на малый объем, очень тяжко - попытки с тридцатой

 
 
 
 
Сообщение16.12.2006, 19:28 
Аватара пользователя
А что получится, если на MatLAB посчитать $\det \left( {A - \lambda _0 E} \right)$, где ${\lambda _0 }$ - максимальное по модулю собственное значение, $E$ - единичная матрица?

 
 
 
 
Сообщение16.12.2006, 19:31 
Аватара пользователя
Fgolm писал(а):
А что получится, если на MatLAB посчитать $\det \left( {A - \lambda _0 E} \right)$, где ${\lambda _0 }$ - максимальное по модулю собственное значение, $E$ - единичная матрица?


Код:
-2.349387318151008e-047

 
 
 
 
Сообщение16.12.2006, 20:35 
Аватара пользователя
А само ${\lambda _0 }$ чему равно?

 
 
 
 
Сообщение16.12.2006, 20:41 
Аватара пользователя
$3.78041071319155$

 
 
 
 
Сообщение16.12.2006, 21:38 
Аватара пользователя
Остальные собственные значения, как я понимаю, тоже совпадают.

А что ж тогда у меня за бред получается.
Дело в том, что когда я проверяю условие $\det \left( {A - \lambda _N E} \right)$, где ${\lambda _N }$ - минимальное по модулю то получаю $\det \left( {A - \lambda _N E} \right) = 3,06 \cdot 10^{ - 67} $. А вот $\det \left( {A - \lambda _0 E} \right) = 1,17 \cdot 10^{ + 40} $, где ${\lambda _0 }$ - максимальное по модулю.

А вы случайно не знаете каким методом в MatLAB считаются определители.
Я - методом разложения на треугольные сомножители (Mathcad по моему тоже).

 
 
 
 
Сообщение16.12.2006, 21:47 
Аватара пользователя
MatLAB help: det писал(а):
Algorithm

The determinant is computed from the triangular factors obtained by Gaussian elimination
Код:
[L,U] = lu(A)
s =  det(L)        % This is always +1 or -1
det(A) = s*prod(diag(U))


MatLAB help: lu писал(а):
The lu function expresses a matrix X as the product of two essentially triangular matrices, one of them a permutation of a lower triangular matrix and the other an upper triangular matrix. The factorization is often called the LU, or sometimes the LR, factorization. X can be rectangular. For a full matrix X, lu uses the Linear Algebra Package (LAPACK) routines described in Algorithm.

[L,U] = lu(X) returns an upper triangular matrix in U and a permuted lower triangular matrix L (that is, a product of lower triangular and permutation matrices), such that X = L*U.

[L,U,P] = lu(X) returns an upper triangular matrix in U, a lower triangular matrix L with a unit diagonal, and a permutation matrix P, so that L*U = P*X.

Y = lu(X) returns a matrix Y, which contains the strictly lower triangular L, i.e., without its unit diagonal, and the upper triangular U as submatrices. That is, if [L,U,P] = lu(X), then Y = U+L-eye(size(X)). The permutation matrix P is not returned by Y = lu(X).

[L,U,P,Q] = lu(X) for sparse nonempty X, returns a unit lower triangular matrix L, an upper triangular matrix U, a row permutation matrix P, and a column reordering matrix Q, so that P*X*Q = L*U. This syntax uses UMFPACK and is significantly more time and memory efficient than the other syntaxes, even when used with colamd. If X is empty or not sparse, lu displays an error message.

[L,U,P] = lu(X,thresh) controls pivoting in sparse matrices, where thresh is a pivot threshold in the interval [0,1]. Pivoting occurs when the diagonal entry in a column has magnitude less than thresh times the magnitude of any sub-diagonal entry in that column. thresh = 0 forces diagonal pivoting. thresh = 1 (conventional partial pivoting) is the default.

[L,U,P,Q] = lu(X,thresh) controls pivoting in UMFPACK, where thresh is a pivot threshold in the interval [0,1]. Given a pivot column j, UMFPACK selects the sparsest candidate pivot row i such that the absolute value of the pivot entry is greater than or equal to thresh times the absolute value of the largest entry in the column j. For complex matrices, absolute values are computed as abs(real(a)) + abs(imag(a)). The magnitude of entries in L is limited to 1/thresh.

Setting thresh to 1.0 results in conventional partial pivoting. The default value is 0.1. Smaller values of thresh lead to sparser LU factors, but the solution might be inaccurate. Larger values usually (but not always) lead to a more accurate solution, but increase the number of steps the algorithm performs.

 
 
 
 
Сообщение16.12.2006, 23:39 
Аватара пользователя
LynxGAV писал(а):
Резутаты MatLAB для уравнения Someone.

Код:
-35.45034264785386 + 1.82671978774743i
...


Почему-то все корни с противоположными знаками. Вероятно, Вы вместо минусов написали плюсы.

Но результаты странные.
Подстановка процитированного корня (с противоположным знаком) в уравнение даёт $-2.27109\times 10^{38}-7.12456\times 10^{38}i$, в то время как при подстановке своего значения $x=32.855795795560925599249839965109+1.0445164385329707877790708850561i$ Mathematica выдаёт $0.\times 10^6+0.\times 10^6i$ (внутреннее представление этого числа: $203030.9296`-0.9556+94940.669786006`-1.2605i$; числа после обратных штрихов означают количество правильных значащих цифр; поскольку эти "количества" отрицательные, правильных цифр нет вообще, а Mathematica при выдаче результата пишет только нули, указывая, что результат имеет порядок $10^6$).
Вычисление корня с точностью 64 цифры даёт
$x=32.85579579556092559924983996510925420091889286109187395090919651++1.044516438532970787779070885056079053309750778291120063496930296i\text{,}$
а при подстановке его в уравнение получается $-0.\times 10^{-26}+-0.\times 10^{-26}i$. Это означает, что в процессе вычисления многочлена теряются $64-26=38$ значащих цифр.

Остаётся только гадать, сколько значащих цифр теряются при манипуляциях с матрицей сотого порядка, её определителем, характеристическим многочленом и так далее. В свете этих экспериментов меня не удивляет то, что наблюдает Fgolm. Я могу только посоветовать, считая элементы матрицы точными числами, провести вычисления с точностью несколько сотен десятичных цифр. Сколько это займёт времени, если пользоваться, например, пакетом Mathematica, не знаю (прежде, чем начинать вычисления, нужно к каждому элементу матрицы применить функцию x=SetAccuracy[x,n], где $n$ - требуемое количество "правильных" цифр элементов матрицы).

 
 
 
 
Сообщение16.12.2006, 23:44 
Аватара пользователя
а в MatLAB все типа double, а если залазить в символьные вычисления, то там ядро, если не ошибаюсь, такое же как и у Mathematika, но я считаю, что MatLAB создан не для этого и крайне редко этими возможностями пользуюсь

 
 
 
 
Сообщение17.12.2006, 00:05 
Someone писал(а):
Почему-то все корни с противоположными знаками. Вероятно, Вы вместо минусов написали плюсы.


Нет. Я скопировала код.

 
 
 
 
Сообщение17.12.2006, 00:17 
Аватара пользователя
LynxGAV писал(а):
Someone писал(а):
Почему-то все корни с противоположными знаками. Вероятно, Вы вместо минусов написали плюсы.


Нет. Я скопировала код.


Тогда не понимаю, почему знаки корней противоположные. А подстановка $-35.45034264785386 + 1.82671978774743i$ даёт вообще $1.91108\times 10^{54}-4.41581\times 10^{54}i$.

 
 
 
 
Сообщение17.12.2006, 01:47 
Someone писал(а):
Тогда не понимаю, почему знаки корней противоположные. А подстановка $-35.45034264785386 + 1.82671978774743i$ даёт вообще $1.91108\times 10^{54}-4.41581\times 10^{54}i$.


Да. Я ошиблась со знаками. Корни положительные:

Код:
35.45034264785386 + 1.82671978774743i
35.45034264785386 - 1.82671978774743i
33.52469196167482 + 5.08710672034733i
33.52469196167482 - 5.08710672034733i
30.27702935506426 + 7.35018191359883i
30.27702935506426 - 7.35018191359883i
26.42684031787888 + 8.40778900672977i
26.42684031787888 - 8.40778900672977i
22.51127078798312 + 8.36886431583805i
22.51127078798312 - 8.36886431583805i
18.85383855580688 + 7.56990822316522i
18.85383855580688 - 7.56990822316522i
20.46688512805427 + 3.01367775813702i
20.46688512805427 - 3.01367775813702i
15.74220016403341 + 6.40974874424462i
15.74220016403341 - 6.40974874424462i
13.26718829787621 + 5.05841568691830i
13.26718829787621 - 5.05841568691830i
11.31548361243937 + 3.65349243871979i
11.31548361243937 - 3.65349243871979i
  9.76756227283725 + 2.29764220011169i
  9.76756227283725 - 2.29764220011169i
  8.53212069262100 + 1.05076344556426i
  8.53212069262100 - 1.05076344556426i
  7.70895927435456                   
  7.02022107103860                   
  5.99991866849548                   
  4.99999348318864                   
  3.99999990625347                   
  3.00000000852557                   
  1.99999999989745                   
  1.00000000000040

 
 
 
 
Сообщение18.12.2006, 11:01 
Someone писал(а):
Остаётся только гадать, сколько значащих цифр теряются при манипуляциях с матрицей сотого порядка, её определителем, характеристическим многочленом и так далее. В свете этих экспериментов меня не удивляет то, что наблюдает Fgolm. Я могу только посоветовать, считая элементы матрицы точными числами, провести вычисления с точностью несколько сотен десятичных цифр.


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

 
 
 
 
Сообщение18.12.2006, 11:56 
Аватара пользователя
Fgolm писал(а):
Так точно.
Использую для нахождения собственных значений в Mathcad процедуру eigenvals.
Это не так уж удивительно, бывало, что он (Mathcad) решал мне СЛАУ своими встроенными процедурами (lsolve в частности), а невязка получалась >100% (максимальная по модулю а не среднеквадратичная).
На самом деле Mathcad имеет 2 движка. Один численный, второй символьный. В Mathcad встроена система MapleV R4. В интерфейсе программы используются два оператора "равно": = и ->. Когда Вы используете стрелку, то Mathcad передаёт данные Maple'у внутри себя и потом возвращает результат. Библиотека Maple имеет много дублирующих функций, которые можно выполнять независимо от численных, которые приведены в справке к Mathcad. Замечено (некоторыми дотошными пользователями), что функция поиска собственных значений иногда выдаёт неожиданные результаты, причём встроенная такая же символьная функция выдаёт правильный результат. Найду пример по-проще, покажу. Мы как-то сравнивали эвивалентные символьные недокументированные и численные документированные функции Mathcad.

Вот пример. Выполнено в MC11. Пример принадлежит Годунову Сергею Константиновичу (был продемонстрирован мне на форуме Mathcad Казаковым Ю. В.)
Изображение

Добавлено спустя 17 минут 30 секунд:

photon писал(а):
а в MatLAB все типа double, а если залазить в символьные вычисления, то там ядро, если не ошибаюсь, такое же как и у Mathematika, но я считаю, что MatLAB создан не для этого и крайне редко этими возможностями пользуюсь
Ошибаетесь. Там тоже Maple. Если посмотреть в папке с тулбоксом Symbol Toolbox, то это можно обнаружить невооружённым глазом (symbolic). Matlab использует OEM библиотеку Maple, точнее даже пакет, который раньше назывался MathEdge2 (или просто MathEdge). Этот пакет в конце прошлого тысячилетия использовался во многих приложэениях, т.к. давал возможность использования символьных вычислений у себя в программе. Matlab обращается к библиотеке mapleoem.dll для расчётов через специальный интерфейсный .m файл. Надо отметить, что возможностей у этого ядра больше, чем в стандартной поставке Mathcad, но последнее лего лечится небольшим апгрейдом.

 
 
 
 
Сообщение18.12.2006, 12:40 
Аватара пользователя
photon писал(а):
то там ядро, если не ошибаюсь, такое же как и у Mathematika

uni писал(а):
Ошибаетесь. Там тоже Maple.

А у Maple и Mathematika они разные?

 
 
 [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group