exponenta event banner

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

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

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

  x4 - 2x3 - 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)