2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Дифференцирование в Mathematica
Сообщение04.07.2019, 02:06 
Аватара пользователя
Здравствуйте. Решил наконец-то начать пробовать делать какие-то символьные расчёты на компьютере, установил 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 
Аватара пользователя
Ой, похоже проблема в другом. Дифференцирует нормально, как я и хотел.

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 11:32 
Аватара пользователя
Всё-таки не получается, хотя делал как здесь 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 
Вот результаты поиска на форуме. Если Вы постоянно работаете с этим материалом, попробуйте применить Мэйпл: DifferentialGeometry и Physics. Он в этом помощнее.

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 15:54 
Аватара пользователя
Markiyan Hirnyk, спасибо, установил Maple 13, правда, сначала хочу разобраться, как это сделать в Mathematica.

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 16:15 
misha.physics
Или я чего-то не понимаю, или поведение странное, потому что вроде там должно быть достаточно глубины, чтобы индексирование не выдавало таких ошибок. Можете ли вы просто скопировать код и вставить его сюда? Так как у вас там нет никаких специальных символов и греческих букв, он должен вставиться достаточно читаемым и вам не придётся его корректировать после вставки (в любом случае такой код, если его вставить себе, будет отображён как исходно у вас, просто специальные символы отобразятся формами \[...] и читать код прямо на форуме будет не так удобно).

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

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 16:28 
Аватара пользователя
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 
Хм, странно, у меня выводит 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 
Аватара пользователя
arseniiv в сообщении #1403197 писал(а):
Ещё, как я слышал, в последних версиях у M. появилась возможность вычислений с тензорами в индексной записи
В девятой версии (ссылка на новость). So, misha.physics, установите версию 9 или выше, почитайте документацию, попробуйте покопаться.

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 19:17 
Аватара пользователя
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 
Аватара пользователя
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 

(Оффтоп)

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

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:05 
Аватара пользователя
misha.physics в сообщении #1403241 писал(а):
или Windows установлю
Нет смысла. Это погоды не сделает, раз уж вы можете сменить Убунту на 64-битную, только мороки добавит.
Тогда сможете сразу уж и M12 поставить.

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:45 
Аватара пользователя
arseniiv,
arseniiv в сообщении #1403206 писал(а):
(или лучше — перезапустить только ядро: в меню Evaluation → Quit Kernel → Local) и потом просто перевычислить всё введённое.

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

(Оффтоп)

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


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

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

 
 
 
 Re: Дифференцирование в Mathematica
Сообщение04.07.2019, 21:52 
Аватара пользователя
misha.physics в сообщении #1403263 писал(а):
А есть команда чтобы одним "кликом" перевычислить всё введённое в документе, а то мне пришлось каждую строчку перевычислять?
Меню Evaluation -> Еvaluate Notebook.

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


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