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

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

(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

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

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));
 y = simplify(y)
y =
(sin(4*x)*(exp(x) - 1))/(2*cos(4*x)*(exp(x) + 1))
y = simplify(y,'Steps',25)
y =
(tan(4*x)*(exp(x) - 1))/(2*(exp(x) + 1))
y = simplify(y,'Steps',50)
y =
(tan(4*x)*tanh(x/2))/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)