2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Дифференцирование в Mathematica
Сообщение04.07.2019, 02:06 
Аватара пользователя


17/03/17
683
Львів
Здравствуйте. Решил наконец-то начать пробовать делать какие-то символьные расчёты на компьютере, установил Mathematica. Нашел видео на youtube, как посчитать символы Кристоффеля, тензор Риччи и т.д. Столкнулся с проблемой на этапе дифференцирования компонент метрического тензора по координатам. Например, у меня $g_{11=\frac{1}{g(r)}}$ и мне нужно взять от этого частную производную по координате $r$. Сама функция $g(r)$ мне конечно не дана и мне нужно, чтобы программа в этом случае писала что-то вроде $-\frac{g'(r)}{g^2(r)}$ или $-\frac{1}{g^2(r)}\frac{dg(r)}{dr}$, думаю суть понятна. Я, конечно, не уверен, что это возможно, но мне кажется, что это должно быть реализируемо. В вышеупомянутом видео метрика задана явными функциями от координат и там записывалось что-то вроде D[metric[[d, c]], coord[[b]]], обозначая $\frac{\partial g_{dc}}{\partial x^b}$, но если я так напишу, то пишет "Part specification...is longer than depth of object". Подскажите, пожалуйста, как реализовать вышеописанное, или в каком направлении искать.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 08:59 
Аватара пользователя


17/03/17
683
Львів
Ой, похоже проблема в другом. Дифференцирует нормально, как я и хотел.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 11:32 
Аватара пользователя


17/03/17
683
Львів
Всё-таки не получается, хотя делал как здесь https://www.youtube.com/watch?v=trzQLIl ... dex=6&t=0s. Набираю

Код:
coord = {t, r, \[CurlyPhi]}
metric = {{-g[r] + J^2/(4 r^2), 0, -J/2}, {0, 1/g[r], 0}, {-J/2, 0,r^2}}
inversemetric = Simplify[Inverse[metric]]
christ[a_, b_, c_] := christ[a, b, c] = Simplify[\!\(
\*UnderoverscriptBox[\(\[Sum]\), \(n =
      1\), \(3\)]\(\((1/2)\) inversemetric[\([\)\(a,
      n\)\(]\)] \((D[metric[\([\)\(n, c\)\(]\)],
        coord[\([\)\(b\)\(]\)]] +
       D[metric[\([\)\(n, b\)\(]\)], coord[\([\)\(c\)\(]\)]] -
       D[metric[\([\)\(b, c\)\(]\)], coord[\([\)\(n\)\(]\)]])\)\)\)]


Потом выполняю следующее

Код:
christ[1,1,1]


и получаю ошибку

Код:
Part::partd : Part specification...is longer than depth of object.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 15:27 


11/07/16
802
Вот результаты поиска на форуме. Если Вы постоянно работаете с этим материалом, попробуйте применить Мэйпл: DifferentialGeometry и Physics. Он в этом помощнее.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 15:54 
Аватара пользователя


17/03/17
683
Львів
Markiyan Hirnyk, спасибо, установил Maple 13, правда, сначала хочу разобраться, как это сделать в Mathematica.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 16:15 
Заслуженный участник


27/04/09
28128
misha.physics
Или я чего-то не понимаю, или поведение странное, потому что вроде там должно быть достаточно глубины, чтобы индексирование не выдавало таких ошибок. Можете ли вы просто скопировать код и вставить его сюда? Так как у вас там нет никаких специальных символов и греческих букв, он должен вставиться достаточно читаемым и вам не придётся его корректировать после вставки (в любом случае такой код, если его вставить себе, будет отображён как исходно у вас, просто специальные символы отобразятся формами \[...] и читать код прямо на форуме будет не так удобно).

Ещё, как я слышал, в последних версиях у M. появилась возможность вычислений с тензорами в индексной записи, но у меня такой версии не стоит, и потому я ничего полезного не скажу — не экспериментировал и справку по ходу дела не читал.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 16:28 
Аватара пользователя


17/03/17
683
Львів
arseniiv, итак, у меня Wolfram Mathematica 7.0.1.0, Linux x86 (32-bit). Вот полный код команд (привожу только "input"):

Код:
coord = {t, r, phi}
metric = {{-g[r] + J^2/(4 r^2), 0, -J/2}, {0, 1/g[r], 0}, {-J/2, 0,r^2}}
inversemetric = Simplify[Inverse[metric]]
christ[a_, b_, c_] := christ[a, b, c] = Simplify[\!\(
\*UnderoverscriptBox[\(\[Sum]\), \(d =
      1\), \(3\)]\(\((1/2)\) inversemetric[\([\)\(a,
      d\)\(]\)] \((D[metric[\([\)\(d, c\)\(]\)],
        coord[\([\)\(b\)\(]\)]] +
       D[metric[\([d, b]\)], coord[\([\)\(c\)\(]\)]] -
       D[metric[\([\)\(b, c\)\(]\)], coord[\([\)\(d\)\(]\)]])\)\)\)]
christ[1, 1, 1]


Всего 5 комманд. 4-я это выражение для символов Кристоффеля, а 5-я чтобы вывести на экран $\Gamma_{11}^1$ и после неё выдает ту ошибку об глубине, приведенную выше.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 16:47 
Заслуженный участник


27/04/09
28128
Хм, странно, у меня выводит 0 без всяких сообщений. Версия 8.0.1.0, но разницы с седьмой здесь быть не должно.

Может быть, влияют определения, которые вы сделали между делом и потом стёрли (они остаются в памяти) — пробовали ли вы перезапустить программу (или лучше — перезапустить только ядро: в меню Evaluation → Quit Kernel → Local) и потом просто перевычислить всё введённое. Если сообщения уже не будут появляться, то дело было в этом, и в следующий раз можно просто перед определениями написать

    ClearAll[все определяемые имена, а также все имена несвязанных переменных, попадающиеся в определениях, через запятую]

(в вашем случае что-то типа ClearAll[coord, t, r, phi, metric, g, J, inversemetric, christ]) — и тогда влияние среды аннулируется практически в любом случае кроме некоторых экзотических, которые если вам и попадутся, вы уже наверняка будете знать что делать.

А если вам нужно будет определить имена временно, то подойдёт Block или Module, но опять же наверно вам пока такое не нужно.

-- Чт июл 04, 2019 19:01:55 --

Кстати вот вам для проверки на будущее (если ответ будет выдаваться, он и должен выдаваться в точности такой же, привожу его тут просто для спокойствия и уверенности, что считать он считается) все компоненты символа Кристоффеля:

Код:
In[...]:= Table[christ[a, b, c], {a, 3}, {b, 3}, {c, 3}]
Out[...]= {{{0, (J^2 + 2 r^3 g'[r])/(4 r^3 g[r]), 0},
            {(J^2 + 2 r^3 g'[r])/(4 r^3 g[r]), 0, -(J/(2 r g[r]))},
            {0, -(J/(2 r g[r])), 0}},
           {{1/2 g[r] (J^2/(2 r^3) + g'[r]), 0, 0},
            {0, -(g'[r]/(2 g[r])), 0},
            {0, 0, -r g[r]}},
           {{0, (J^3 + 2 J r^3 g'[r])/(8 r^5 g[r]), 0},
            {(J^3 + 2 J r^3 g'[r])/(8 r^5 g[r]), 0, 1/r - J^2/(4 r^3 g[r])},
            {0, 1/r - J^2/(4 r^3 g[r]), 0}}}

Если будете сравнивать со своим, просто скопируйте и напишите между ними ==, оно сравнит покомпонентно.

Почему-то правда g'[r] из ответа у меня скопировалось изначально как Derivative[1][g][r], и тут я для наглядности поправил (первая форма записи нормально понимается программой и эквивалентна второй в точности), но это к вашей теме конечно не относится.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 19:14 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
arseniiv в сообщении #1403197 писал(а):
Ещё, как я слышал, в последних версиях у M. появилась возможность вычислений с тензорами в индексной записи
В девятой версии (ссылка на новость). So, misha.physics, установите версию 9 или выше, почитайте документацию, попробуйте покопаться.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 19:17 
Аватара пользователя


17/03/17
683
Львів
arseniiv,
arseniiv в сообщении #1403206 писал(а):
(они остаются в памяти)

Вот, я догадывался, что программа это все запоминает, но мне это казалось слишком фантастическим чтобы оказаться правдой :D Спасибо, приду домой, попробую все сделать, что вы посоветовали.

-- 04 июл 2019, 18:20 --

Aritaborian,
Aritaborian в сообщении #1403237 писал(а):
So, misha.physics, установите версию 9 или выше, почитайте документацию, попробуйте покопаться.

К сожалению, для своей 32-х битной Ubuntu нашёл только седьмую рабочую версию (а может плохо искал). Может потом или 64-разрядную версию Ubuntu поставлю или Windows установлю.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 19:31 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
misha.physics в сообщении #1403241 писал(а):
К сожалению, для своей 32-х битной Ubuntu нашёл только седьмую рабочую версию (а может плохо искал).
Насколько мне удалось узнать,
Цитата:
Mathematica 9 runs on both 32-bit and 64-bit operating systems where available.
(А так-то оно вообще правда, по крайней мере последняя версия для Пингвина только 64-битная.)

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 19:34 
Заслуженный участник


27/04/09
28128

(Оффтоп)

misha.physics в сообщении #1403241 писал(а):
Вот, я догадывался, что программа это все запоминает, но мне это казалось слишком фантастическим чтобы оказаться правдой :D
Ну почему фантастическим, это обычная вещь для таких интерактивных систем (в том числе наверно вообще всех систем компьютерной алгебры).

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:05 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
misha.physics в сообщении #1403241 писал(а):
или Windows установлю
Нет смысла. Это погоды не сделает, раз уж вы можете сменить Убунту на 64-битную, только мороки добавит.
Тогда сможете сразу уж и M12 поставить.

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:45 
Аватара пользователя


17/03/17
683
Львів
arseniiv,
arseniiv в сообщении #1403206 писал(а):
(или лучше — перезапустить только ядро: в меню Evaluation → Quit Kernel → Local) и потом просто перевычислить всё введённое.

Да, получилось, ошибки пропали, все посчитало как и у вас.

(Оффтоп)

Просто это мое первое знакомство с подобными компьютерными системами.


-- 04 июл 2019, 20:47 --

А есть команда чтобы одним "кликом" перевычислить всё введённое в документе, а то мне пришлось каждую строчку перевычислять?

 Профиль  
                  
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:52 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
misha.physics в сообщении #1403263 писал(а):
А есть команда чтобы одним "кликом" перевычислить всё введённое в документе, а то мне пришлось каждую строчку перевычислять?
Меню Evaluation -> Еvaluate Notebook.

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

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



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

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


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

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