Symbolic Math Toolbox™ обеспечивает функцию combine
для объединения подвыражений исходного выражения. Функция combine
использует математические тождества для функций, которые вы задаете. Например, объедините тригонометрическое выражение.
syms x y combine(2*sin(x)*cos(x),'sincos')
ans = sin(2*x)
Если вы не задаете целевую функцию, combine
использует тождества для степеней везде, где эти тождества допустимы:
a b ac = a b + c
a c bc = (a b) c
(a b) c = a bc
Например, по умолчанию функция комбинирует следующие квадратные корни.
combine(sqrt(2)*sqrt(x))
ans = (2*x)^(1/2)
Функция не комбинирует эти квадратные корни, потому что идентичность не допустима для отрицательных величин переменных.
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
Найдите неприводимые полиномиальные факторы этого выражения. По умолчанию 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