2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Короткий вопрос по Mathematica
Сообщение26.09.2014, 21:00 
Задана функция:
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 
Аватара пользователя
Вот так сработало (нужно было дополнительно попросить упростить):
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 
Еще работает такой вариант:
$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 
Аватара пользователя
_Er в сообщении #912498 писал(а):
Еще работает такой вариант
Ну, это ведь одно и то же, как я понимаю.
_Er в сообщении #912498 писал(а):
ваш вариант тоже не работает для выражение посложнее чем просто fi*.
А какого именно? Кидайте его сюда, подумаем и над ним.

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 22:10 
Конкретно, я хочу вычислить лагранжиан 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 
Хм, я, возможно, чего-то не понимаю, а зачем вообще делить функцию на действительную и мнимую части явно? Нельзя ли её задавать сразу комплексной, и с сопряжением при внезапной подстановке чисел всё будет просто и легко.

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение26.09.2014, 23:16 
Аватара пользователя
Соглашусь с предыдущим оратором ;-)

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 09:36 
Вот так работает:
Код:
fi = F1[r, t] + I F2[r, t];
Conjugate[fi] // ComplexExpand

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

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 12:49 
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 
Можно определить новую команду: cj[x_]:=ComplexExpand@Conjugate[x]

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

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 17:04 
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 
Аватара пользователя
Есть такая, но использовать её без веских на то оснований не рекомендуется. Есть риск запутаться, плюс вы потеряете совместимость с другими документами.
Вот какой именно системный символ и как именно вы изменили бы?

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 18:16 
_Er в сообщении #912754 писал(а):
Дело в том, что в данной конкретной задаче у меня функции F1,F2 определены в другом месте, как просто некоторые действительные функции (никак не связанные с fi), а я подставляя fi в таком виде пытаюсь показать, что при определенной подстановке лагранжиан с картинки преобразуется в то, что мне нужно.
Почему бы тогда не упрощать только в самом конце лагранжиан, используя ComplexExpand или Assuming…Simplify всего один раз (тогда и повторять и (пере)определять для удобства ничего не надо)?

 
 
 
 Re: Короткий вопрос по Mathematica
Сообщение27.09.2014, 18:49 
Можно сделать так:
Код:
cj[x_] := ComplexExpand@Conjugate[x]
$Pre = # /. Rule[Conjugate, cj] &;

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

 
 
 [ Сообщений: 20 ]  На страницу 1, 2  След.


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