Используйте модули измерения с 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. Преобразуйте результат удвоиться.
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. Преобразуйте результат удвоиться.
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