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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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