Упрощение математического выражения не является ясно заданным предметом. Нет никакой универсальной идеи, относительно которой форма выражения является самой простой. Форма математического выражения, которое является самым простым для одной проблемы, оказывается сложной или даже неподходящей для другой проблемы. Например, следующие два математических выражения представляют тот же полином в различных формах:
(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)