2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Короткий вопрос по Mathematica
Сообщение26.09.2014, 21:00 


24/07/14
138
Задана функция:
fi = F1[r, t] + I F2[r, t];
где F1,F2 полагаются действительными.
Берется комплексное сопряженное к fi и получается такая вот штука:
fi*=Conjugate[F1[r, t]] - I Conjugate[F2[r, t]]
Вопрос: как объяснить этой машине, что F1,F2 действительны?
Я пробовал, например, записать перед сопряжением
$\textdollar$ Assumptions = F1[r, t] $\in$ Reals;
но это как-то не помогло.

(Оффтоп)

Как мне в посте записать символ доллара? Выше он записан как \textdollar в формуле.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 21:21 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Вот так сработало (нужно было дополнительно попросить упростить):
Assuming[F1[r, t] \[Element] Reals && F2[r, t] \[Element] Reals, Simplify@Conjugate[F1[r, t] + I F2[r, t]]]
_Er в сообщении #912474 писал(а):
Как мне в посте записать символ доллара?
Да так, просто: $Assumptions.

(Про набор кода)

Набирая код, заключайте его либо в тег [tt], либо в тег [code].

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 21:40 


24/07/14
138
Еще работает такой вариант:
$Assumptions = F1[r, t] \[Element] Reals && F2[r, t] \[Element] Reals;
fi*//Simplify
F1[r, t] - I F2[r, t]
Но если попробовать посчитать выражение посложнее, в котором содержится сопряжение, то там ни //Simplify ни//FullSimplify не помогают. Вычислять каждое выражение через Assuming[] как-то неудобно очень получится.

Кстати, вот только что проверил: ваш вариант тоже не работает для выражение посложнее чем просто fi*.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 21:43 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
_Er в сообщении #912498 писал(а):
Еще работает такой вариант
Ну, это ведь одно и то же, как я понимаю.
_Er в сообщении #912498 писал(а):
ваш вариант тоже не работает для выражение посложнее чем просто fi*.
А какого именно? Кидайте его сюда, подумаем и над ним.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 22:10 


24/07/14
138
Конкретно, я хочу вычислить лагранжиан L:
Изображение
Я могу его вычислить введя наряду с fi и D_mu две другие, сопряженные к первым, функции ficj и Dcj_mu, задав их в явном виде, без операции сопряжения. Вот как это выглядит:
fi = F1[r, t] + I F2[r, t];
ficj = F1[r, t] - I F2[r, t];
DDD = (D[fi, x[#]] - I e a[#] fi) &;
DDDcj = (D[ficj, x[#]] + I e a[#] ficj) &;

Так как здесь вычисления, связанные с сопряжением, довольно просты, то такой вариант здесь более менее подходит. Но я хотел бы иметь возможность применять операцию Conjugate[] к любым функциям в выражениях любой сложности и получать те результаты, которые там должны быть. Потому что, если будет что посложнее, то реализовать такой же вариант, как здесь с ficj и Dcj_mu, уже может быть гораздо труднее.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 22:46 
Заслуженный участник


27/04/09
28128
Хм, я, возможно, чего-то не понимаю, а зачем вообще делить функцию на действительную и мнимую части явно? Нельзя ли её задавать сразу комплексной, и с сопряжением при внезапной подстановке чисел всё будет просто и легко.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 23:16 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Соглашусь с предыдущим оратором ;-)

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 09:36 
Заслуженный участник


25/02/11
1786
Вот так работает:
Код:
fi = F1[r, t] + I F2[r, t];
Conjugate[fi] // ComplexExpand

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

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 12:49 


24/07/14
138
arseniiv в сообщении #912523 писал(а):
Хм, я, возможно, чего-то не понимаю, а зачем вообще делить функцию на действительную и мнимую части явно? Нельзя ли её задавать сразу комплексной, и с сопряжением при внезапной подстановке чисел всё будет просто и легко.
Не совсем понимаю о чем вы. Поясните, пожалуйста, что вы предлагаете сделать.

Vince Diesel в сообщении #912611 писал(а):
Вот так работает:
Код:
fi = F1[r, t] + I F2[r, t];
Conjugate[fi] // ComplexExpand
Комадна ComplexExpand пытается упростить выражение, предполагая, что все переменные имеют действительные значения.
Да, вроде бы действительно работает. По крайней мере D_mu и потенциал V вычисляются как надо. Только в конце каждого действия с сопряжением нужно вызывать эту команду.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 13:21 
Заслуженный участник


25/02/11
1786
Можно определить новую команду: cj[x_]:=ComplexExpand@Conjugate[x]

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 14:12 
Заслуженный участник


27/04/09
28128
_Er в сообщении #912669 писал(а):
Не совсем понимаю о чем вы. Поясните, пожалуйста, что вы предлагаете сделать.
Определять сразу fi[r, t], не вводя F1 и F2. Не совсем понимаю, какой контекст требует их использования. Если они обозначают неизвестные функции при использовании Solve/DSolve/etc., то точно не нужны — комплексные числа используются по умолчанию и тут. Если нужно просто приготовить выражения для действительных и мнимых частей (например, для программы, которая использует только действительные), можно это сделать уже после получения комплекснозначного выражения с помощью Re и Im. Не исключено, что в каком-то случае проще всего делить fi на компоненты с самого начала, но лично я пока не вижу, при каком.

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 17:04 


24/07/14
138
arseniiv в сообщении #912691 писал(а):
_Er в сообщении #912669 писал(а):
Не совсем понимаю о чем вы. Поясните, пожалуйста, что вы предлагаете сделать.
Определять сразу fi[r, t], не вводя F1 и F2. Не совсем понимаю, какой контекст требует их использования. Если они обозначают неизвестные функции при использовании Solve/DSolve/etc., то точно не нужны — комплексные числа используются по умолчанию и тут. Если нужно просто приготовить выражения для действительных и мнимых частей (например, для программы, которая использует только действительные), можно это сделать уже после получения комплекснозначного выражения с помощью Re и Im. Не исключено, что в каком-то случае проще всего делить fi на компоненты с самого начала, но лично я пока не вижу, при каком.
Понял. Дело в том, что в данной конкретной задаче у меня функции F1,F2 определены в другом месте, как просто некоторые действительные функции (никак не связанные с fi), а я подставляя fi в таком виде пытаюсь показать, что при определенной подстановке лагранжиан с картинки преобразуется в то, что мне нужно.

Vince Diesel в сообщении #912679 писал(а):
Можно определить новую команду: cj[x_]:=ComplexExpand@Conjugate[x]
Хорошая идея. Надо будет попробовать. Но вот все-таки звездочка (:conj:) в тексте выглядит как-то приятнее. Но вроде бы есть какие-то команды позволяющие зарезервированные Математикой обозначения переделывать под свои нужды. Если не ошибаюсь, это команда Unprotect[].

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 17:21 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Есть такая, но использовать её без веских на то оснований не рекомендуется. Есть риск запутаться, плюс вы потеряете совместимость с другими документами.
Вот какой именно системный символ и как именно вы изменили бы?

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 18:16 
Заслуженный участник


27/04/09
28128
_Er в сообщении #912754 писал(а):
Дело в том, что в данной конкретной задаче у меня функции F1,F2 определены в другом месте, как просто некоторые действительные функции (никак не связанные с fi), а я подставляя fi в таком виде пытаюсь показать, что при определенной подстановке лагранжиан с картинки преобразуется в то, что мне нужно.
Почему бы тогда не упрощать только в самом конце лагранжиан, используя ComplexExpand или Assuming…Simplify всего один раз (тогда и повторять и (пере)определять для удобства ничего не надо)?

 Профиль  
                  
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 18:49 
Заслуженный участник


25/02/11
1786
Можно сделать так:
Код:
cj[x_] := ComplexExpand@Conjugate[x]
$Pre = # /. Rule[Conjugate, cj] &;

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

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



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

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


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

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