2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 05:53 


07/09/14
4
Всем привет. Есть матрица n на n и необходимо число "e" возвести в степень каждого элемента матрицы-в результате получаю матрицу n на n, пишу: exp(i*R), R-матрица. Всё работает. Потом пишу exp(i*R*k), где k-константа,ее вычисляю определенным способом, она равна 1.2643*10^7 и в этом случае результат неверный. Проверяю просто: беру и возвожу число "e" в степень которая равна определенному элементу матрицы и сравниваю результат с соответствующим эл-ом матрицы exp(i*R*k). результаты расходятся. Подскажите пожалуйста в чем косяк.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 09:05 
Заслуженный участник


27/04/09
28128
В определении экспоненты от матрицы. Она не состоит из экспонент каждого элемента.

-- Вс янв 31, 2016 11:08:17 --

Например, $\exp\begin{bmatrix} 0 & -a \\ a & 0 \end{bmatrix} = \begin{bmatrix} \cos a & -\sin a \\ \sin a & \cos a \end{bmatrix} \ne \begin{bmatrix} 1 & e^{-a} \\ e^a & 1 \end{bmatrix}$.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 11:52 
Заслуженный участник


12/07/07
4522
arseniiv, вычисление матричной экспоненты выполняется при помощи функций expm, expm1, expm2, expm3 (см. описание на русском или англ.: expm, expm1,…).

maximus005, приведите, пожалуйста, Вашу матрицу R и версию MatLab.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 11:58 
Заслуженный участник


27/04/09
28128
GAA
А, ясно. Подозревал, что есть и покомпонентная (в Mathematica тоже так).

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 14:44 


07/09/14
4
GAA в сообщении #1095476 писал(а):
maximus005, приведите, пожалуйста, Вашу матрицу R и версию MatLab.


У меня MATLAB R2013b 8.2.0.701.
Написал полный код,а то мало ли:
Используется синтаксис Matlab M
 
x=1:1:2;
y=1:1:2;
[X,Y] = meshgrid(x,y);
lym=500*10^-9;
w=2*pi*299792458/lym;
e0=8.854*10^-12;
m0=1.256*10^-6;
k=sqrt((w^2)*e0*m0);
R = sqrt(X.^2+Y.^2);


k=1.2563e+07
Для простоты матрицы 2 на 2.
Т.о. R = [1.4142 2.2361 ; 2.2361 2.8284]

В результате:

k =

1.2563e+07

>> exp(i*R*k)
ans =

0.8214 + 0.5703i 0.3076 - 0.9515i
0.3076 - 0.9515i 0.3495 + 0.9369i

>> exp(i*1.2563e+07*2.8284)

ans =

-0.2790 - 0.9603i

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 15:24 
Заслуженный участник


12/07/07
4522
Код:
...
>> exp(i*R*k)
ans =
   0.8214 + 0.5703i   0.3076 - 0.9515i
   0.3076 - 0.9515i   0.3495 + 0.9369i
>> exp(i*k*R(2,2))
ans =
   0.3495 + 0.9369i

Вы ввели не все значимые числа цифры R(2,2) и k, поэтому и ответы различаются.
Если хотите увидеть больше значащих цифр, то воспользуйтесь командой format long
Код:
...
format long
>> k=sqrt((w^2)*e0*m0)
k = 1.256305165569142e+007
>> R = sqrt(X.^2+Y.^2)
R =
   1.41421356237310   2.23606797749979
   2.23606797749979   2.82842712474619
>> exp(i*R*k)
ans =
  0.82143878531730 + 0.57029669644531i  0.30763122090920 - 0.95150566573296i
  0.30763122090920 - 0.95150566573296i  0.34952335604714 + 0.93692765119701i
>> exp(i*1.256305165569142e+007*2.82842712474619)
ans =
  0.34952335604714 + 0.93692765119701i
Во втором варианте кода я ввел k и R(2,2) вручную. Результаты и в этом случае совпадают.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 15:36 


07/09/14
4
Спасибо большое за помощь! Помогло

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 16:44 
Заслуженный участник
Аватара пользователя


01/09/13
4656

(Оффтоп)

По моему, вычислять синус/косинус десяти миллионов несколько странное занятие - потеря точности великовата.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 17:44 


07/09/14
4
Geen в сообщении #1095557 писал(а):

(Оффтоп)

По моему, вычислять синус/косинус десяти миллионов несколько странное занятие - потеря точности великовата.


Подскажите, в следствии чего потеря точности ? Потеря точности именно при больших значениях аргумента ? Насчет вычислений: такова функция грина для электрического диполя - требует вычисление комплексной экспоненты вот с такими большими значениями аргумента.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 17:58 
Заслуженный участник


12/07/07
4522
За счет ограниченной точности при приведении аргумента к промежутку, на котором выполняется вычисление (Argument reduction). На шаге масштабирования результата для приведенного аргумента малые погрешности значительно увеличиваются. См. методы вычисления триг. функций, напрмер в книге Ильин, Позняк "Основы математического анализа", Т1.
Но и исходные константы заданы с малой точностью. Если же надо любой ценой выполнить вычисления с большой точностью, то можно воспользоваться символьными вычислениями.
Код:
>> x=1:2; y=1:2;
>> [X,Y] = meshgrid(x,y);
>> lym = sym('500*10^(-9)');
>> e0 = sym('8.854*10^(-12)');
>> w = 2*sym('Pi')*299792458/lym;
>> m0= sym('1.256*10^(-6)');
>> k=sqrt(w^2*e0*m0)
>> Z = sym(X.^2+Y.^2);
>> R = sqrt(Z);
>> vpa(exp(i*R*k))
ans =
[ .82143878128081838467134437365322+.57029670225934483808416349034038*i, .30763122899377922032278553979388-.95150566311913087383309065611916*i]
[ .30763122899377922032278553979388-.95150566311913087383309065611916*i, .34952334278423236850499169896615+.93692765614477193673272261370513*i]

Для значения Digits по умолчанию (32). Можно значение Digits увеличить.

-- Вс 31.01.2016 17:12:57 --

Забыл символьно вычислить R. Поэтому результат неверен. Сейчас переделаю.

Upd. Пересчитал. Исправил.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение31.01.2016, 18:36 
Заслуженный участник
Аватара пользователя


01/09/13
4656
maximus005 в сообщении #1095572 писал(а):
требует вычисление комплексной экспоненты вот с такими большими значениями аргумента.

Может быть, если переработать алгоритм, то не требует?...

Вот у Вас отдельные константы заданы с относительной точностью порядка $10^{-4}$ - чему равен косинус, если его аргумент определён с такой точностью?

P.S. и возводить в квадрат чтобы тут же извлечь корень.... плохо выглядит...

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение02.02.2016, 17:09 
Заслуженный участник


12/07/07
4522
GAA в сообщении #1095577 писал(а):
На шаге масштабирования результата для приведенного аргумента малые погрешности значительно увеличиваются.
Это я скопипастил текст для экспоненты. Для триг. функций просто ограниченность точности исходного аргумента приводит к его большой относительной погрешности после приведения к диапазону $(0, 2\pi)$. Тут как бы очевидно.

 Профиль  
                  
 
 Re: Matlab - экспонента в степени матрицы
Сообщение02.02.2016, 18:39 
Заслуженный участник
Аватара пользователя


30/01/06
72407
maximus005 в сообщении #1095572 писал(а):
Насчет вычислений: такова функция грина для электрического диполя - требует вычисление комплексной экспоненты вот с такими большими значениями аргумента.

Приведите аргумент к промежутку $[0,2\pi),$ а то ваши вычисления не будут иметь ни малейшего смысла.

Какова у вас задача вообще?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: DariaRychenkova


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group