Maxima для физиков: единицы измерения и физические константы

Круг применения Maxima (wxMaxima) гораздо шире, чем простые арифметические операции. В этой статье рассказано о некоторых вещах, упрощающих использование Maxima для решения физических задач.

А конкретнее — об использовании в расчётах физических констант и единиц изменений.

Если вы ещё не знакомы с Maxima (wxMaxma), пройдите десятиминутный курс wxMaxima.

Поддержка единиц измерения обеспечивается пакетом ezunits, без него ничего, из описанного ниже, работать не будет. Так что сперва надо загрузить его:

(%i1) load(ezunits);
(%o1) /usr/share/maxima/5.22.1/share/contrib/ezunits/ezunits.mac

Единицы измерения задаются с помощью специального оператора «`» (символ машинописного обратного апострофа, в английской раскладке находящийся на одной кнопке с Ё). Проще всего показать его использование на примере. Присвоим переменной mass значение в килограммах (kg):

(%i2) mass: 5 ` kg;
(%o2) 5 ` kg

Для того, чтобы узнать, размерность какой физической величины имеет то или иное выражение, можно использовать функцию dimensions:

(%i3) dimensions(mass);
(%o3) mass

По-умолчанию используются в основном единицы измерения системы Си, однако вы можете определять и свои, задавая их связь с другими единицами, что будет продемонстрировано ниже. Со списком всех доступных единиц измерения и связей между ними можно ознакомится, используя known_unit_conversions.

(%i4) known_unit_conversions;
Опущу результат, чтобы не загромождать статью.

Для кратных и дольных единиц измерения используются приставки m-, k-, M, и G- (мили-, кило-, мега- и гига-  соответственно).

Для единиц измерения, также как и для значений, можно использовать выражения. Как известно, ускорение измеряется в м/c^2.

(%i5) accel: (0.2 + 0.3) ` m/s^2;
(%o5) 0.5 ` m/s^2

Уделяйте внимание скобкам. Если их забыть, получим:

(%i6) 0.2 + 0.3 ` m/s^2;
(%o6) 0.3 ` m/s^2 + 0.2

Что вполне логично, т.к. тут мы пытаемся прибавить к ускорению безразмерную величину.

Внимание! Следите, чтобы имена используемых вами переменных не совпадали с обозначениями единиц измерения. Иначе, это чревато непредсказуемыми результатами. Если бы в приведённом выше примере, мы использовали переменную m вместо mass, то при задании accel получили бы неожиданный результат, т.к. Maxima интерпретировала бы m после «`» не как собственно единицу измерения, а как переменную m. Раз допустив такую ошибку, можно потратить очень много времени на её поиски. Так что следующий пример лучше не повторять:

(%i1) m: 5 ` kg;
(%o1) 5 ` kg

(%i2) accel: (0.2 + 0.3) ` m/s^2;
(%o2) 0.5 ` (5/s^2 ` kg)

Ещё две полезные функции: qty() и units(). Первая из них возвращает численное значение величины, а вторая — размерность.

(%i7) qty(accel);
(%o7) 0.5

(%i8) units(accel);
(%o8) m/s^2

Естественно, с величинами, имеющими размерность, можно производить математические операции. При этом действуют следующие правила:

(x ` a) * (y ` b) эквивалентно (x * y) ` (a * b).
(x ` a) + (y ` a) эквивалентно (x + y) ` a.
(x ` a)^y эквивалентно x^y ` a^y в случае, если y — безразмерная величина.

Стоит обратить внимание, что никаких проверок на соответствие единиц измерения при сложении не производится, так что за тем, чтобы не «спутать тёплое с мягким» вам придётся следить самостоятельно.

Вычислим силу, как произведение массы на ускорение:

(%i9) force: mass*accel;
(%o9) 2.5 ` (kg*m)/s^2

Пришло время рассказать об ещё одном крайне полезном операторе: «. Он используется для приведения к определённым единицам измерения. Всем известно, что сила измеряется в Ньютонах:

(%i10) force `` N;
(%o10) 2.5 ` N

Его же можно использовать для преобразования между внесистемными единицами:

(%i11) 100 ` degC `` degF;
(%o11) 212 ` degF

В случае, когда что-то пошло не так, и на месте единиц измерения получается что-то неожиданное, можно воспользоваться функцией приведения к фундаментальным единицам fundamental_units(), и на основании этого понять, где была допущена ошибка.

(%i12) fundamental_units (force);
(%o12) (kg*m)/s^2

Вы, возможно, обратили внимание, что такая единица измерения, как нанометры, по-умолчанию отсутствует. Что ж, мы не будет объявлять тендер на адаптацию Maxima к условиям современной инновационной экономики, а просто доопределим необходимую единицу измерения. Делается это с помощью функции declare_unit_conversion():

(%i13) declare_unit_conversion ( nm = 10^(-9)*m );
(%o14) done

(%i14) 100 ` nm `` mm;
(%o14) 1/10000 ` mm

Поддержка физических констант реализована в модуле physical_constants.

(%i15) load(physical_constants);
(%o15) /usr/share/maxima/5.22.1/share/contrib/ezunits/physical_constants.mac

Для работы этого модуля требуется рассмотренный выше ezunits. Модуль содержит краткие описания различных физических констант, и их значения (с единицами измерения), соответствующие CODATA 2006. Список всех определённых констант можно получить с помощью функции propvars(physical_constant):

(%i16) propvars (physical_constant);
(%o16) [%c,%mu_0,%e_0,%Z_0,%G,%h,%h_bar,%m_P,%T_P,%l_P,%t_P,%%e,%Phi_0,%G_0,%K_J,
%R_K,%mu_B,%mu_N,%alpha,%R_inf,%a_0,%E_h,%ratio_h_me,%m_e,%N_A,%m_u,%F,%R,%%k,%V_m,%n_0
,%ratio_S0_R,%sigma,%c_1,%c_1L,%c_2,%b,%b_prime]

Описание константы можно получить следующим образом:

(%i17) get (%c, description);
(%o17) speed of light in vacuum

Для получения значения константы используется функция constvalue():

(%i18) constvalue (%c);
(%o18) 299792458 ` m/s

Решении задач обычно проводится в общем виде. Функция constvalue(), аргументом которой может быть не только одна константа, но и целое выражение, применяется в самом конце. При этом будут подставлены значения для всех встретившихся констант:

(%i19) E: %m_e*%c^2;
(%o19) %c^2*%m_e

(%i20) declare_unit_conversion ( eV = 1.60217648740E-19 * J, keV = 1000 * eV, MeV = 1000 * keV );
rat: replaced 1.6021764874e-19 by 1/6241509645562159104 = 1.6021764874e-19
(%o20) done

(%i21) constvalue (%) `` MeV;
(%o21) .5109989097200643 ` MeV

На этом всё. За подробностями обращайтесь к документации по пакетам ezunits и physical_constants. Успехов в решении задач с помощью Maxima!

Maxima для физиков: единицы измерения и физические константы: 2 комментария

Добавить комментарий