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

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




 Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Здравствуйте, товарищи, помогите разобраться в коде реализации метода степенной итерация для подсчёта максимального собственного значения и соответствующего собственного вектора. Сам метод я понял, но вот как он реализуется в системе Mathematica ...
(код взят с сайта http://math.fullerton.edu/mathews/n2003/PowerMethodMod.html)
1)Для чего нужно вот это, т.е. как мы выбираем это число m
Код:
  While[ count <= m,
    count = count + 1;
    Y = A.X0;
    \[Lambda] = maxsize[Y];
    X = 1/\[Lambda] Y;


2)Вот эта функция что нам даёт, и как мы можем заходить в -1 ячейку списска, и зачем ?

Код:
maxsize[W_] := Module[{w = Sort[W], msize},
   If[ Abs[w[[-1]]] >= Abs[w[[1]]],
    msize = w[[-1]],
    msize = w[[1]]];
   Return[msize]; ];



Код:
PowerMeth[A0_, V0_, \[Epsilon]_, m_] :=
  Module[{A = N[A0], c1, count, err, \[Lambda], \[Lambda]0, X ,
    X0 = N[V0], Y},
   
   maxsize[W_] := Module[{w = Sort[W], msize},
     If[ Abs[w[[-1]]] >= Abs[w[[1]]],
      msize = w[[-1]],
      msize = w[[1]]];
     Return[msize]; ];
   
   norm[V_] := Sqrt[V.V];
   \[Lambda]0 = 0;
   count = 0;
   
   While[ count <= m,
    count = count + 1;
    Y = A.X0;
    \[Lambda] = maxsize[Y];
    X = 1/\[Lambda] Y;
   
    Print[NumberForm[\[Lambda], 6], " , ", PaddedForm[X, {6, 6}]];
   
    err = Max[{ Abs[\[Lambda] - \[Lambda]0], norm[X - X0]}];
    If[ err < \[Epsilon], Return[{\[Lambda], X}] ]; 
    X0 = X;
    \[Lambda]0 = \[Lambda];  ];
   Return[{\[Lambda], X}]; ];

Print["A = ", MatrixForm[A], ", X_0 = ", MatrixForm[X0]];
{ \[Lambda], X} = PowerMeth[A, X0, 0.000001, 100]
Print[""]
Print["A = ", MatrixForm[A]];
Print["Eingenpar dominante é: "];
Print[" \[Lambda] = ", \[Lambda], ", X= ", MatrixForm[X]];

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Alexeybk5 в сообщении #577390 писал(а):
Вот эта функция что нам даёт, и как мы можем заходить в -1 ячейку списска, и зачем ?

Это просто мы с конца списка идем. Т.е. w[[-1]] -- это последний элемент списка w.
Функция maxsize[W_] дает нам наибольший по модулю элемент из списка W. Она сортирует W, потом сравнивает по модулю последний и первый его элементы, и возвращает нам тот, который больше.

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
gribble911 в сообщении #577393 писал(а):
Alexeybk5 в сообщении #577390 писал(а):
Вот эта функция что нам даёт, и как мы можем заходить в -1 ячейку списска, и зачем ?

Это просто мы с конца списка идем. Т.е. w[[-1]] -- это последний элемент списка w.
Функция maxsize[W_] дает нам наибольший по модулю элемент из списка W. Она сортирует W, потом сравнивает по модулю последний и первый его элементы, и возвращает нам тот, который больше.


Т.е. эта часть кода выбирает из собственных значений максимальный из них?)

п.с. если не трудно, Вы не могли бы ещё посоветовать на счёт умножения матриц
http://dxdy.ru/topic59134.html

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Alexeybk5 в сообщении #577411 писал(а):
Т.е. эта часть кода выбирает из собственных значений максимальный из них?)

Эта часть кода полагается на функцию Sort и ожидает, что после ее работы наибольший элемент будет первым или последним в списке. Пример:
Код:
In> a = {1, 10, -5, -8, -8}
b = {-5, -4, -3, -5}
Sort[a] (* здесь наибольший элемент будет последним *)
Sort[b] (* здесь -- первым *)
maxsize[a]
maxsize[b]

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Спасибо большое, а вот эта часть кода для чего ? Зачем нам m нужно
Код:
While[ count <= m,
    count = count + 1;
    Y = A.X0;
    \[Lambda] = maxsize[Y];
    X = 1/\[Lambda] Y

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Товарищи))

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
По ссылке в первом посте писал(а):
Assume that the $n\times n$ matrix $A$ has $n$ distinct eigenvalues $\lambda_1, \lambda_2,\dots,\lambda_n$

Вот $n$ здесь, есть $m$ в коде.

 Re: Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Спасибо :-)

 [ Сообщений: 8 ] 


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