Выберите функцию, чтобы переставить выражение

Объедините условия тех же алгебраических структур

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