Круг применения 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!
Как же этого не хватало при решении всяких курсовиков! За всеми единицами приходилось следить самостоятельно.
Очень полезная статья. А главное своевременная для меня. Спасибо