Упростите символьные выражения

Упрощение математического выражения не является ясно заданным предметом. Нет никакой универсальной идеи, относительно которой форма выражения является самой простой. Форма математического выражения, которое является самым простым для одной проблемы, оказывается сложной или даже неподходящей для другой проблемы. Например, следующие два математических выражения представляют тот же полином в различных формах:

(x + 1)(x - 2)(x + 3)(x - 4),

  x4 - 2x3 - 13x2 + 14x + 24.

Первая форма ясно показывает корни этого полинома. Эта форма более проста для работы с корнями. Вторая форма служит лучше всего, когда это необходимо, чтобы видеть коэффициенты полинома. Например, эта форма удобна, когда вы дифференцируете или интегрируете полиномы.

Если задача, которую вы хотите решить, требует конкретной формы выражения, лучший подход должен выбрать соответствующую функцию упрощения. Смотрите Выбирают Функцию, чтобы Перестроить Выражение.

Помимо определенного simplifiers, Symbolic Math Toolbox™ предлагает общий simplifier, simplify.

Если вам не нужна конкретная форма выражений (расширенный, учтенный, или выразил в конкретных терминах), используйте simplify сокращать математические выражения. Например, используйте этот simplifier, чтобы найти более короткую форму для конечного результата ваших расчетов.

simplify работает над различными типами символьных выражений, такими как полиномы, выражения с тригонометрическими, логарифмическими, и специальными функциями. Например, упростите эти полиномы.

syms x y
simplify((1 - x^2)/(1 - x))
simplify((x - 1)*(x + 1)*(x^2 + x + 1)*(x^2 + 1)*(x^2 - x + 1)*(x^4 - x^2 + 1))
ans =
x + 1
 
ans =
x^12 - 1

Упростите выражения, включающие тригонометрические функции.

simplify(cos(x)^(-2) - tan(x)^2)
simplify(cos(x)^2 - sin(x)^2)
ans =
1
 
ans =
cos(2*x)

Упростите выражения включающие экспоненты и логарифмы. В третьем выражении используйте log(sym(3)) вместо log(3). Если вы используете log(3), затем MATLAB® вычисляет log(3) с двойной точностью, и затем преобразует результат в символьное число.

simplify(exp(x)*exp(y))
simplify(exp(x) - exp(x/2)^2)
simplify(log(x) + log(sym(3)) - log(3*x) + (exp(x) - 1)/(exp(x/2) + 1))
ans =
exp(x + y)
 
ans =
0
 
ans =
exp(x/2) - 1

Упростите выражения, включающие специальные функции.

simplify(gamma(x + 1) - x*gamma(x))
simplify(besselj(2, x) + besselj(0, x))
ans =
0
 
ans =
(2*besselj(1, x))/x

Также можно упростить символьные функции при помощи simplify.

syms f(x,y)
f(x,y) = exp(x)*exp(y)
f = simplify(f)
f(x, y) =
exp(x)*exp(y)
 
f(x, y) =
exp(x + y)

Упростите Используя опции

По умолчанию, simplify использует строгие правила упрощения и гарантирует, что упрощенные выражения всегда математически эквивалентны начальным выражениям. Например, это не комбинирует логарифмы для комплексных чисел в целом.

syms x
simplify(log(x^2) + log(x))
ans =
log(x^2) + log(x)

Можно применить дополнительные правила упрощения, которые не правильны для всех значений параметров и всех случаев, но использования который simplify может возвратить более короткие результаты. Для этого подхода используйте IgnoreAnalyticConstraints. Например, упрощая то же выражение с IgnoreAnalyticConstraints, вы получаете результат с объединенными логарифмами.

simplify(log(x^2) + log(x),'IgnoreAnalyticConstraints',true)
ans =
3*log(x)

IgnoreAnalyticConstraints обеспечивает ярлык, разрешающий вам упростить выражения под обычно используемыми предположениями о значениях переменных. В качестве альтернативы можно установить соответствующие предположения на переменных явным образом. Например, объединение логарифмов не допустимо для комплексных чисел в целом. Если вы принимаете тот x действительное значение, simplify логарифмы объединений без IgnoreAnalyticConstraints.

assume(x,'real')
simplify(log(x^2) + log(x))
ans =
log(x^3)

Для дальнейших расчетов очистите предположение на x путем воссоздания его с помощью syms.

syms x

Другой подход, который может улучшить упрощение выражения или функции, является синтаксисом simplify(f,'Steps',n), где n положительное целое число, которое управляет сколько шагов simplify берет. Определение большего количества шагов упрощения может помочь вам упростить выражение лучше, но требуется больше времени. По умолчанию, n = 1. Например, создайте и упростите это выражение. Результат короче, чем исходное выражение, но это может быть упрощено далее.

syms x
y = (cos(x)^2 - sin(x)^2)*sin(2*x)*(exp(2*x) - 2*exp(x) + 1)/...
    ((cos(2*x)^2 - sin(2*x)^2)*(exp(2*x) - 1));
simplify(y)
ans =
(sin(4*x)*(exp(x) - 1))/(2*cos(4*x)*(exp(x) + 1))

Задайте количество шагов упрощения для того же выражения. Во-первых, используйте 25 шагов.

simplify(y,'Steps',25)
ans =
(tan(4*x)*(exp(x) - 1))/(2*(exp(x) + 1))

Используйте 50 шагов, чтобы упростить выражение еще больше.

simplify(y,'Steps',50)
ans =
(tan(4*x)*tanh(x/2))/2

Предположим, вы уже упростили выражение или функцию, но вы хотите другие формы того же выражения. Для этого можно установить 'All' опция к true. Синтаксис simplify(f,'Steps',n,'All',true) показывает другие эквивалентные результаты того же выражения на шагах упрощения.

syms x
y = cos(x) + sin(x)
simplify(y,'Steps',10,'All',true)
ans =
                                                   2^(1/2)*sin(x + pi/4)
                                                   2^(1/2)*cos(x - pi/4)
                                                         cos(x) + sin(x)
 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)

Чтобы возвратить еще больше эквивалентных результатов, увеличьте число шагов к 25.

simplify(y,'Steps',25,'All',true)
ans =
                                                   2^(1/2)*sin(x + pi/4)
                                                   2^(1/2)*cos(x - pi/4)
                                                         cos(x) + sin(x)
                                      -2^(1/2)*(2*sin(x/2 - pi/8)^2 - 1)
           2^(1/2)*(exp(- x*1i + (pi*1i)/4)/2 + exp(x*1i - (pi*1i)/4)/2)
 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)

Упростите Используя предположения

Некоторые выражения не могут быть упрощены в целом, но становиться намного короче под конкретными предположениями. Например, упрощение этого тригонометрического выражения без дополнительных предположений возвращает исходное выражение.

syms n
simplify(sin(2*n*pi))
ans =
sin(2*pi*n)

Однако, если вы принимаете ту переменную n представляет целое число, то же тригонометрическое выражение упрощает до 0.

assume(n,'integer')
simplify(sin(2*n*pi))
ans =
0

Для дальнейших расчетов очистите предположение.

syms n

Упростите части

Можно использовать общую функцию упрощения, simplify, упростить части. Однако Symbolic Math Toolbox предлагает более эффективное функционально-специализировано для этой задачи: simplifyFraction. Оператор simplifyFraction(f) представляет выражение f как часть, где и числитель и знаменатель являются полиномами, наибольший общий делитель которых равняется 1. Например, упростите эти выражения.

syms x y
simplifyFraction((x^3 - 1)/(x - 1))
ans =
x^2 + x + 1
simplifyFraction((x^3 - x^2*y - x*y^2 + y^3)/(x^3 + y^3))
ans =
(x^2 - 2*x*y + y^2)/(x^2 - x*y + y^2)

По умолчанию, simplifyFraction не расширяет выражения в числителе и знаменателе возвращенного результата. Чтобы расширить числитель и знаменатель в получившемся выражении, используйте Expand опция. Для сравнения сначала упростите эту часть без Expand.

simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(exp(x) + 1)^3

Теперь упростите те же выражения с Expand.

simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4,'Expand',true)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(3*exp(2*x) + exp(3*x) + 3*exp(x) + 1)