2014 dxdy logo

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

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




 
 Mathematica Метод степенных итераций для подсчёта С.В. С. З.
Сообщение27.05.2012, 21:15 
Здравствуйте, товарищи, помогите разобраться в коде реализации метода степенной итерация для подсчёта максимального собственного значения и соответствующего собственного вектора. Сам метод я понял, но вот как он реализуется в системе 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 Метод степенных итераций для подсчёта С.В. С. З.
Сообщение27.05.2012, 21:24 
Alexeybk5 в сообщении #577390 писал(а):
Вот эта функция что нам даёт, и как мы можем заходить в -1 ячейку списска, и зачем ?

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

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

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


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

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

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

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

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

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

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

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


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