Symbolic Math Toolbox™ обеспечивает combine
функция для объединения подэкспрессий исходного выражения. combine
функция использует математические тождества для заданных функций. Для примера объедините тригонометрическое выражение.
syms x y combine(2*sin(x)*cos(x),'sincos')
ans = sin(2*x)
Если вы не задаете целевую функцию, combine
использует тождества для степеней, где эти тождества действительны:
abac = ab + c
acbc = (a b)c
(ab)c = abc
Например, по умолчанию функция объединяет следующие квадратные корни.
combine(sqrt(2)*sqrt(x))
ans = (2*x)^(1/2)
Функция не объединяет квадратные корни sqrt(x)*sqrt(y)
поскольку тождества недопустимы для отрицательных значений переменных.
combine(sqrt(x)*sqrt(y))
ans = x^(1/2)*y^(1/2)
Чтобы объединить эти квадратные корни, используйте IgnoreAnalyticConstraints
опция.
combine(sqrt(x)*sqrt(y),'IgnoreAnalyticConstraints',true)
ans = (x*y)^(1/2)
IgnoreAnalyticConstraints
предоставляет ярлык, позволяющий объединять выражения при обычно используемых допущениях о значениях переменных. Кроме того, можно явно задать соответствующие допущения для переменных. Например, предположим, что x
и y
являются положительными значениями.
assume([x,y],'positive') combine(sqrt(x)*sqrt(y))
ans = (x*y)^(1/2)
Для дальнейших расчетов очистите допущения на x
и y
путем воссоздания их используя syms
.
syms x y
Как целевые функции, combine
принимает atan
, exp
, gamma
, int
, log
, sincos
, и sinhcosh
.
Для элементарных выражений используйте expand
функция для преобразования исходного выражения путем умножения сумм продуктов. Эта функция обеспечивает простой способ расширения полиномов.
expand((x - 1)*(x - 2)*(x - 3))
ans = x^3 - 6*x^2 + 11*x - 6
expand(x*(x*(x - 6) + 11) - 6)
ans = x^3 - 6*x^2 + 11*x - 6
Функция также расширяет экспоненциальные и логарифмические выражения. Например, разверните следующее выражение, содержащее экспоненциалы.
expand(exp(x + y)*(x + exp(x - y)))
ans = exp(2*x) + x*exp(x)*exp(y)
Разверните выражение, содержащее логарифм. Расширяющиеся логарифмы не действительны для типичных комплексных чисел, но они действительны для положительных значений.
syms a b c positive expand(log(a*b*c))
ans = log(a) + log(b) + log(c)
Для дальнейших расчетов очистите допущения.
syms a b c
Кроме того, используйте IgnoreAnalyticConstraints
опция при расширении логарифмов.
expand(log(a*b*c),'IgnoreAnalyticConstraints',true)
ans = log(a) + log(b) + log(c)
expand
работает также с тригонометрическими выражениями. Для примера разверните это выражение.
expand(cos(x + y))
ans = cos(x)*cos(y) - sin(x)*sin(y)
expand
использует математические тождества между функциями.
expand(sin(5*x))
ans = sin(x) - 12*cos(x)^2*sin(x) + 16*cos(x)^4*sin(x)
expand(cos(3*acos(x)))
ans = 4*x^3 - 3*x
expand
работает рекурсивно для всех подэкспрессий.
expand((sin(3*x) + 1)*(cos(2*x) - 1))
ans = 2*sin(x) + 2*cos(x)^2 - 10*cos(x)^2*sin(x) + 8*cos(x)^4*sin(x) - 2
Чтобы предотвратить расширение всех тригонометрических, логарифмических и экспоненциальных подэкспрессий, используйте опцию ArithmeticOnly
.
expand(exp(x + y)*(x + exp(x - y)),'ArithmeticOnly',true)
ans = exp(x - y)*exp(x + y) + x*exp(x + y)
expand((sin(3*x) + 1)*(cos(2*x) - 1),'ArithmeticOnly',true)
ans = cos(2*x) - sin(3*x) + cos(2*x)*sin(3*x) - 1
Чтобы вернуть все неприводимые множители выражения, используйте factor
функция. Для примера найдите все неприводимые полиномиальные множители этого полиномиального выражения. Результат показывает, что этот полином имеет три корня: x = 1
, x = 2
, и x = 3
.
syms x factor(x^3 - 6*x^2 + 11*x - 6)
ans = [ x - 3, x - 1, x - 2]
Если полиномиальное выражение неприводимо, factor
возвращает исходное выражение.
factor(x^3 - 6*x^2 + 11*x - 5)
ans = x^3 - 6*x^2 + 11*x - 5
Найдите неприводимые полиномиальные множители выражения x^6 + 1
. По умолчанию, factor
использует факторизацию над рациональными числами, сохраняя рациональные числа в их точной символической форме. Получившиеся множители для этого выражения не показывают полиномиальные корни.
factor(x^6 + 1)
ans = [ x^2 + 1, x^4 - x^2 + 1]
Использование других режимов факторизации позволяет вам факторизировать это выражение дальше. Для примера множите одно и то же выражение над комплексными числами.
factor(x^6 + 1,'FactorMode','complex')
ans = [ x + 0.86602540378443864676372317075294 + 0.5i,... x + 0.86602540378443864676372317075294 - 0.5i,... x + 1.0i,... x - 1.0i,... x - 0.86602540378443864676372317075294 + 0.5i,... x - 0.86602540378443864676372317075294 - 0.5i]
factor
работает также с выражениями, отличными от полиномов и рациональных выражений. Для примера можно определить следующее выражение, которое содержит логарифмические, синусоидальные и косинусоидные функции. Внутренне, factor
преобразует такие выражения в полиномы и рациональные выражения путем подстановки подэкспрессий переменными. После вычисления неприводимых факторов функция восстанавливает исходные подэкспрессии.
factor((log(x)^2 - 1)/(cos(x)^2 - sin(x)^2))
ans = [ log(x) - 1, log(x) + 1, 1/(cos(x) - sin(x)), 1/(cos(x) + sin(x))]
Использовать factor
множить символические целые числа и символические рациональные числа.
factor(sym(902834092)) factor(1/sym(210))
ans = [ 2, 2, 47, 379, 12671] ans = [ 1/2, 1/3, 1/5, 1/7]
factor
также может быть использовано число множителей больше, чем flintmax
что MATLAB® factor
невозможно. Чтобы точно представлять большое число, поместите его в кавычки.
factor(sym('41758540882408627201'))
ans = [ 479001599, 87178291199]
children
функция возвращает подэкспрессии выражения.
Задайте выражение f
с несколькими подэкспрессиями.
syms x y f = exp(3*x)*y^3 + exp(2*x)*y^2 + exp(x)*y;
Извлеките подэкспрессии f
при помощи children
.
expr = children(f)
expr = [ y^2*exp(2*x), y^3*exp(3*x), y*exp(x)]
Вы можете извлечь подэкспрессии более низкого уровня, позвонив children
неоднократно по результатам.
Извлеките подэкспрессии expr(1)
по вызову children
неоднократно. Когда вход в children
является вектором, выход - массивом ячеек.
expr1 = children(expr(1)) expr2 = children(expr1)
expr1 = [ y^2, exp(2*x)] expr2 = 1×2 cell array {1×2 sym} {1×1 sym}
Доступ к содержимому массива ячеек expr2
использование скобок.
expr2{1} expr2{2}
ans = [ y, 2] ans = 2*x
Если математическое выражение содержит члены с теми же степенями заданной переменной или выражения, collect
функция реорганизовывает выражение путем группировки таких терминов. При вызове collect
, задайте переменные, которые функция должна считать неизвестными. collect
функция рассматривает исходное выражение как полином в заданных неизвестных и группирует коэффициенты с равными степенями. Сгруппировать условия выражения с равными степенями x
.
syms x y z expr = x*y^4 + x*z + 2*x^3 + x^2*y*z +... 3*x^3*y^4*z^2 + y*z^2 + 5*x*y*z; collect(expr, x)
ans = (3*y^4*z^2 + 2)*x^3 + y*z*x^2 + (y^4 + 5*z*y + z)*x + y*z^2
Сгруппировать условия того же выражения с равными степенями y
.
collect(expr, y)
ans = (3*x^3*z^2 + x)*y^4 + (x^2*z + 5*x*z + z^2)*y + 2*x^3 + z*x
Сгруппировать условия того же выражения с равными степенями z
.
collect(expr, z)
ans = (3*x^3*y^4 + y)*z^2 + (x + 5*x*y + x^2*y)*z + 2*x^3 + x*y^4
Если вы не задаете переменные, которые collect
должна считать неизвестными, функция использует symvar
для определения переменной по умолчанию.
collect(expr)
ans = (3*y^4*z^2 + 2)*x^3 + y*z*x^2 + (y^4 + 5*z*y + z)*x + y*z^2
Соберите условия выражения относительно нескольких неизвестных путем определения этих неизвестных в качестве вектора.
collect(expr, [y,z])
ans = 3*x^3*y^4*z^2 + x*y^4 + y*z^2 + (x^2 + 5*x)*y*z + x*z + 2*x^3
Чтобы представить выражение в терминах конкретной функции, используйте rewrite
. Эта функция использует математические тождества между функциями. Например, переписать выражение, содержащее тригонометрические функции, в терминах конкретной тригонометрической функции.
syms x rewrite(sin(x),'tan')
ans = (2*tan(x/2))/(tan(x/2)^2 + 1)
rewrite(cos(x),'tan')
ans = -(tan(x/2)^2 - 1)/(tan(x/2)^2 + 1)
rewrite(sin(2*x) + cos(3*x)^2,'tan')
ans = (tan((3*x)/2)^2 - 1)^2/(tan((3*x)/2)^2 + 1)^2 +... (2*tan(x))/(tan(x)^2 + 1)
Использовать rewrite
выразить эти тригонометрические функции в терминах экспоненциальной функции.
rewrite(sin(x),'exp')
ans = (exp(-x*1i)*1i)/2 - (exp(x*1i)*1i)/2
rewrite(cos(x),'exp')
ans = exp(-x*1i)/2 + exp(x*1i)/2
Использовать rewrite
выразить эти гиперболические функции в терминах экспоненциальной функции.
rewrite(sinh(x),'exp')
ans = exp(x)/2 - exp(-x)/2
rewrite(cosh(x),'exp')
ans = exp(-x)/2 + exp(x)/2
rewrite
также выражает обратные гиперболические функции в терминах логарифмов.
rewrite(asinh(x),'log')
ans = log(x + (x^2 + 1)^(1/2))
rewrite(acosh(x),'log')
ans = log(x + (x - 1)^(1/2)*(x + 1)^(1/2))
partfrac
функция возвращает рациональное выражение в виде суммы полинома и рациональных членов. В каждом рациональном члене степень числителя меньше степени знаменателя. Для некоторых выражений, partfrac
возвращает визуально более простые формы.
syms x n = x^6 + 15*x^5 + 94*x^4 + 316*x^3 + 599*x^2 + 602*x + 247; d = x^6 + 14*x^5 + 80*x^4 + 238*x^3 + 387*x^2 + 324*x + 108; partfrac(n/d, x)
ans = 1/(x + 1) + 1/(x + 2)^2 + 1/(x + 3)^3 + 1
Знаменатели в рациональных терминах представляют факторизованный общий знаменатель исходного выражения.
factor(d)
ans = [ x + 1, x + 2, x + 2, x + 3, x + 3, x + 3]
simplifyFraction
функция представляет исходное рациональное выражение как один рациональный член с расширенным числителем и знаменателем. Наибольший общий делитель числителя и знаменателя возвращаемого выражения равен 1. Эта функция более эффективна для упрощения дробей, чем simplify
функция.
syms x y simplifyFraction((x^3 + 3*y^2)/(x^2 - y^2) + 3)
ans = (x^3 + 3*x^2)/(x^2 - y^2)
simplifyFraction
отменяет общие коэффициенты, которые появляются в числителе и знаменателе.
simplifyFraction(x^2/(x + y) - y^2/(x + y))
ans = x - y
simplifyFraction
также обрабатывает выражения, отличные от полиномов и рациональных функций. Внутренне он преобразует такие выражения в полиномы или рациональные функции путем подстановки подэкспрессий идентификаторами. После нормализации выражения с временными переменными, simplifyFraction
восстанавливает исходные подэкспрессии.
simplifyFraction((exp(2*x) - exp(2*y))/(exp(x) - exp(y)))
ans = exp(x) + exp(y)
Форма Хорнера, или вложенная, полиномиального выражения, эффективна для числовой оценки, потому что она часто включает меньше арифметических операций по сравнению с другими математически эквивалентными формами того же полинома. Обычно эта форма выражения численно стабильна. Чтобы представлять полиномиальное выражение в вложенной форме, используйте horner
функция.
syms x horner(x^3 - 6*x^2 + 11*x - 6)
ans = x*(x*(x - 6) + 11) - 6
Если полиномиальные коэффициенты являются числами с плавающей запятой, полученная форма Хорнера представляет их как рациональные числа.
horner(1.1 + 2.2*x + 3.3*x^2)
ans = x*((33*x)/10 + 11/5) + 11/10
Чтобы преобразовать коэффициенты в результате в числа с плавающей запятой, используйте vpa
.
vpa(ans)
ans = x*(3.3*x + 2.2) + 1.1