Используйте единицы измерения с 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]
В более длинных выражениях визуальная проверка единиц модулей затруднена. Можно автоматически проверить размерности выражений путем проверки размерностей уравнения.
Во-первых, задайте кинематическое уравнение , где 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 и начиная с определения ускорения .
Представление определения ускорения символически с использованием модулей СИ. Учитывая, что скорость 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
Теперь выведите . Потому что скорость является скоростью изменения расстояния, замените 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
checkUnits
| findUnits
| isUnit
| newUnit
| separateUnits
| symunit2str
| unitConversionFactor
| unitConvert