Руководство по единицам измерения

Используйте единицы измерения с Symbolic Math Toolbox™. На этой странице показано, как задать модули, использовать модули в уравнениях (включая дифференциальные уравнения) и проверить размерности выражений.

Определение и преобразование модулей

Загрузка модулей измерения при помощи symunit.

u = symunit;

Задайте модуль при помощи u.unit. Например, задайте расстояние 5 метров, вес 50 килограммы и скорость 10 километров в час. В отображаемом выходе единицы помещаются в квадратные скобки [].

d = 5*u.m
w = 50*u.kg
s = 10*u.km/u.hr
d =
5*[m]
w =
50*[kg]
s =
10*([km]/[h])

Совет

Используйте расширение вкладок для поиска имен модулей. Тип u., нажмите Tab и продолжите ввод.

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

Добавить 500 счетчики и 2 километров. Получившееся расстояние не упрощается автоматически.

d = 500*u.m + 2*u.km
d =
2*[km] + 500*[m]

Упрощение d при помощи simplify. simplify функция автоматически выбирает модуль для упрощения.

d = simplify(d)
d =
(5/2)*[km]

Вместо автоматического выбора модуля преобразуйте d к определенному модулю при помощи unitConvert. Преобразование d к метрам.

d = unitConvert(d,u.m)
d =
2500*[m]

Существуют больше опции преобразования модулей измерения и системы модулей. См. «Преобразования модулей» и «Единичные системы».

Найдите скорость, если расстояние d пересекается с 50 секунд. Результат имеет правильные модули.

t = 50*u.s;
s = d/t
s =
50*([m]/[s])

Используйте модули измерения температуры в абсолютных или разностных формах

По умолчанию температуры приняты, чтобы представлять различиям, а не абсолютные измерения. Для примера, 5*u.Celsius принято, что представляет различие температур 5 степеней Цельсия. Это предположение допускает арифметические операции с значениями температуры.

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

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

u = symunit;
T = 23*u.Celsius;
diffK = unitConvert(T,u.K)
diffK =
23*[K]
absK = unitConvert(T,u.K,'Temperature','absolute')
absK =
(5923/20)*[K]

Проверьте размерности

В более длинных выражениях визуальная проверка единиц модулей затруднена. Можно автоматически проверить размерности выражений путем проверки размерностей уравнения.

Во-первых, задайте кинематическое уравнение v2=v02+2as, где v представляет скорость, a представляет ускорение, и s представляет расстояние. Предположим s находится в километрах, а все другие модули указаны в базовых модулях СИ. Чтобы продемонстрировать проверку размерностей, модули измерения a преднамеренно неправильны.

syms v v0 a s
u = symunit;
eqn = (v*u.m/u.s)^2 == (v0*u.m/u.s)^2 + 2*a*u.m/u.s*s*u.km
eqn =
v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2*a*s)*(([km]*[m])/[s])

Наблюдайте модули, которые появляются в eqn при помощи findUnits. Возвращённые модули показывают, что для представления расстояния используются как километры, так и метры.

findUnits(eqn)
ans =
[ [km], [m], [s]]

Проверьте, имеют ли модули одинаковые размерности (такие как длина или время) при помощи checkUnits с 'Compatible' вход. MATLAB® подразумевает, что символьные переменные безразмерны. checkUnits возвращает логический 0 (false), что означает, что модули несовместимы и не имеют одинаковых физических размерностей.

checkUnits(eqn,'Compatible')
ans =
  logical
   0

Глядя на eqn, ускорение a имеет неправильные модули. Исправьте модули и повторите перепроверку на совместимость. eqn теперь имеет совместимые модули.

eqn = (v*u.m/u.s)^2 == (v0*u.m/u.s)^2 + 2*a*u.m/u.s^2*s*u.km;
checkUnits(eqn,'Compatible')
ans =
  logical
   1

Теперь, чтобы проверить, что каждая размерность последовательно представлено одним и тем же модулем, используйте checkUnits с 'Consistent' вход. checkUnits возвращает логический 0 (false) потому что метры и километры оба используются для представления расстояния в eqn.

checkUnits(eqn,'Consistent')
ans =
  logical
   0

Преобразование eqn к базовым модулям СИ для обеспечения согласованности модулей. Управляемый checkUnits снова. eqn имеет как совместимые, так и последовательные модули.

eqn = unitConvert(eqn,'SI')
eqn =
 v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2000*a*s)*([m]^2/[s]^2)
checkUnits(eqn)
ans = 
  struct with fields:

    Consistent: 1
    Compatible: 1

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

[eqn,units] = separateUnits(eqn)
eqn =
v^2 == v0^2 + 2000*a*s
units =
1*([m]^2/[s]^2)

Исходное уравнение с модулями можно вернуть умножением eqn с units и расширение результата.

expand(eqn*units)
ans =
v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2000*a*s)*([m]^2/[s]^2)

Чтобы вычислить числовые значения из выражения, замените символьные переменные, используя subs, и преобразовать в числовые значения, используя double или vpa.

Решите eqn для v. Затем найдите значение v где v0 = 5, a = 2.5, и s = 10. Преобразуйте результат в double.

v = solve(eqn,v);
v = v(2);		% choose the positive solution
vSol = subs(v,[v0 a s],[5 2.5 10]);
vSol = double(vSol)
vSol =
  223.6627

Используйте модули измерения в дифференциальных уравнениях

Используйте модули измерения в дифференциальных уравнениях так же, как и в стандартных уравнениях. В этом разделе показано, как использовать единицы измерения в дифференциальных уравнениях путем вывода скоростных отношений v = v  0 + a t иv2=v02+2as начиная с определения ускорения a=dvdt.

Представление определения ускорения символически с использованием модулей СИ. Учитывая, что скорость V имеет модули, V должна быть дифференцирована относительно правильных модулей как T = t*u.s и не только t.

syms V(t) a
u = symunit;
T = t*u.s;		% time in seconds
A = a*u.m/u.s^2;	% acceleration in meters per second
eqn1 = A == diff(V,T)
eqn1(t) =
a*([m]/[s]^2) == diff(V(t), t)*(1/[s])

Потому что скорость V неизвестен и не имеет модулей, eqn1 имеет несовместимые и несогласованные модули.

checkUnits(eqn1)
ans = 
  struct with fields:

    Consistent: 0
    Compatible: 0

Решите eqn1 для V с условием, что начальная скорость v0. Результатом является уравнение v(t) = v  0 + a t.

syms v0
cond = V(0) == v0*u.m/u.s;
eqn2 = V == dsolve(eqn1,cond)
eqn2(t) =
V(t) == v0*([m]/[s]) + a*t*([m]/[s])

Проверьте, что результат имеет правильные размерности путем замены rhs(eqn2) в eqn1 и использование checkUnits.

checkUnits(subs(eqn1,V,rhs(eqn2)))
ans = 
  struct with fields:

    Consistent: 1
    Compatible: 1

Теперь выведите v2=v02+2as. Потому что скорость является скоростью изменения расстояния, замените V с производной расстояния S. Снова, учитывая, что S имеет модули, S должна быть дифференцирована относительно правильных модулей как T = t*u.s и не только t.

syms S(t)
eqn2 = subs(eqn2,V,diff(S,T))
eqn2(t) =
diff(S(t), t)*(1/[s]) == v0*([m]/[s]) + a*t*([m]/[s])

Решите eqn2 с условием, что начальное расстояние пройдено 0. Получите ожидаемую форму S при помощи expand.

cond2 = S(0) == 0;
eqn3 = S == dsolve(eqn2,cond2);
eqn3 = expand(eqn3)
eqn3(t) =
S(t) == t*v0*[m] + ((a*t^2)/2)*[m]

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

[S units] = separateUnits(rhs(eqn3))
S(t) =
(a*t^2)/2 + v0*t

units(t) =
[m]

Когда вам нужно вычислить числовые значения из выражения, замените символьные переменные, используя subs, и преобразовать в числовые значения, используя double или vpa.

Найдите пройденное расстояние 8 секунд, где v0 = 20 и a = 1.3. Преобразуйте результат в double.

S = subs(S,[v0 a],[20 1.3]);
dist = S(8);
dist = double(dist)
dist =
  201.6000

См. также

| | | | | | |

Похожие темы

Внешние веб-сайты