Упрощение символьных выражений

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

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

  x4 - 2х3 - 13x2 + 14x + 24.

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

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

Помимо конкретных упрощений, Symbolic Math Toolbox™ предлагает общий упрощатель, simplify.

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

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)