expand

Расширьте выражение

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

expand(f, options)
expand(f, g1, g2, …, options)

Описание

expand(f) расширяет арифметическое выражение f.

Самое важное использование expand является приложением закона о дистрибутивности, чтобы переписать продукты сумм как суммы продуктов. В этом отношении expand является обратной функцией factor.

Числитель части расширен, и затем часть переписана как сумма частей с более простыми числителями; смотрите Пример 1. В некотором смысле это - обратная функциональность normal. Используйте partfrac для более мощного способа переписать часть как сумму более простых частей.

expand(f) применяет следующие правила при перезаписи степеней, происходящих как подвыражения в f:

  • x a + b = x a  xb.

  • Если b является целым числом или x ≥ 0 или y ≥ 0, то (xy) b = x b  yb.

  • Если b является целым числом, то (x a) b = x ab.

За исключением третьего правила, это поведение expand является обратной функциональностью combine. Смотрите Пример 2.

expand работает рекурсивно над подвыражениями выражения f. Если f имеет контейнерный тип array или table, expand только возвращает f и не сопоставляет на записях. Чтобы расширить все записи одного из контейнеров, используйте map. Смотрите Пример 3.

Если дополнительные аргументы, g1, g2, ... присутствует, то любое подвыражение f, который равен одному из этих дополнительных аргументов, не расширено; смотрите Пример 4. Смотрите раздел “Background” для описания, как это работает.

Свойства идентификаторов учтены (см. assume). Идентификаторы без любых свойств приняты, чтобы быть комплексными. Смотрите Пример 9.

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

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

Взаимодействия среды

expand чувствителен к свойствам набора идентификаторов через assume.

Примеры

Пример 1

expand расширяет продукты сумм путем умножения:

expand((x + 1)*(y + z)^2)

После расширения числителя часть переписана как сумма частей:

expand((x + 1)^2*y/(y + z)^2)

Пример 2

Степень с суммой в экспоненте переписана как продукт степеней:

expand(x^(y + z + 2))

Пример 3

expand работает рекурсивным способом. В следующем примере степень (x + y) z + 2 сначала расширен в продукт двух степеней. Затем степень (x + y) 2 расширена в сумму. Наконец, продукт последней суммы и остающейся степени (x + y) z умножается:

expand((x + y)^(z + 2))

Вот другой пример:

expand(2^((x + y)^2))

expand сопоставляет на записях списков, наборов и матриц:

expand([(a + b)^2, (a - b)^2]);
expand({(a + b)^2, (a - b)^2});
expand(matrix([[(a + b)^2, 0],[0, (a - b)^2]]))

expand не сопоставляет на записях таблиц или массивов:

expand(table((a + b)^2=(c + 1)^2)),
expand(array(1..1, [(a + b)^2]))

Используйте map в порядке расширить все записи контейнера:

map(table((a + b)^2=(c + 1)^2), expand),
map(array(1..1, [(a + b)^2]), expand)

Обратите внимание на то, что этот вызов расширяет только записи в таблице, не ключи. В (редком) случае, что вы хотите ключи, расширенные также, преобразуйте таблицу к списку или системе уравнений сначала:

T := table((a + b)^2=(c + 1)^2):
table(expand([op(T)]))

Пример 4

Если дополнительные аргументы обеспечиваются, expand выполняет только частичное расширение. Эти дополнительные выражения, такие как x + 1 в следующем примере, не расширены:

expand((x + 1)*(y + z))

expand((x + 1)*(y + z), x + 1)

Пример 5

По умолчанию expand работает над всеми подвыражениями включая тригонометрические подвыражения:

e := (sin(2*x) + 1)*(1 - cos(2*x)):
expand(e)

Чтобы предотвратить расширение подвыражений, используйте опцию ArithmeticOnly:

expand(e, ArithmeticOnly)

Опция не предотвращает расширение степеней и корней:

expand((sin(2*x) + 1)^3, ArithmeticOnly)

Чтобы сохранить подвыражения с целочисленными степенями нерасширенными, используйте опцию MaxExponent.

Пример 6

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

expand(ln(a*b*c*d), IgnoreAnalyticConstraints)

Не используя эту опцию, вы получаете математически правильный результат:

expand(ln(a*b*c*d))

Пример 7

Если дополнительный MaxExponent, если, expand выполняет только частичное расширение. Полномочия с целочисленной экспонентой, больше, чем связанный данный, не расширены:

expand((a + b)^3, MaxExponent = 2)

Если экспонента меньше, или равняйтесь связанному данному, степень расширена:

expand((a + b)^2, MaxExponent = 2)

Пример 8

Функция expand может принять несколько опций одновременно. Предположим, что вы хотите расширить следующее выражение:

e := (sin(2*x) + 1)*(x + 1)^3

expand без любых опций работает рекурсивно. Функция расширяет все подвыражения включая тригонометрические функции и степени:

expand(e)

Опция ArithmeticOnly предотвращает расширение термина sin(2x). Опция MaxExponent предотвращает расширение (x + 1) 3:

expand(e, ArithmeticOnly);
expand(e, MaxExponent = 2)

Комбинируя эти опции в одном вызове функции expand, вы вводите оба ограничения для расширения:

expand(e, MaxExponent = 2, ArithmeticOnly)

Пример 9

Следующие расширения не допустимы для всех значений a, b от комплексной плоскости. Therefore, MuPAD® не расширяет эти выражения:

expand(ln(a^2)), expand(ln(a*b)), expand((a*b)^n)

Расширения допустимы под предположением, что a является положительным вещественным числом:

assume(a > 0):  expand(ln(a^2)), expand(ln(a*b)), expand((a*b)^n)

Очистите предположение для дальнейших вычислений:

unassume(a):

Также, чтобы получить расширенный результат для третьего выражения, примите, что n является целым числом:

expand((a*b)^n) assuming n in Z_

Используйте опцию IgnoreAnalyticConstraints, чтобы расширить эти выражения без явным образом заданных предположений:

expand(ln(a^2), IgnoreAnalyticConstraints),
expand(ln(a*b), IgnoreAnalyticConstraints),
expand((a*b)^n, IgnoreAnalyticConstraints)

Пример 10

Теоремы сложения тригонометрии реализованы "expand" - слоты тригонометрических функций sin и cos:

expand(sin(a + b)), expand(sin(2*a))

То же самое верно для гиперболических функций sinh и cosh:

expand(cosh(a + b)), expand(cosh(2*a))

Показательная функция с суммой в качестве аргумента расширена через exp::expand:

expand(exp(a + b))

Вот являются еще некоторые примеры расширения для функций sum, fact, abs, coth, sign, binomial, beta, gamma, cot, tan, exp и psi:

sum(f(x) + g(x),x);  expand(%)

fact(x + 1);  expand(%)

abs(a*b);  expand(%)

coth(a + b);  expand(%)

coth(a*b);  expand(%)

sign(a*b);  expand(%)

binomial(n, m);  expand(%)

beta(n, m);  expand(%)

gamma(x + 1);  expand(%)

tan(a + b); expand(%)

cot(a + b); expand(%)

exp(x + y);  expand(%)

psi(x + 2);  expand(%)

В отличие от предыдущих версий MuPAD, expand не переписывает tan с точки зрения sin и cos:

expand(tan(a))

Пример 11

Этот пример иллюстрирует, как расширить функциональность expand к пользовательским математическим функциям. Как пример, мы рассматриваем синусоидальную функцию. (Конечно, системная функция sin уже имеет слот "expand"; смотрите Пример 10.)

Мы сначала встраиваем нашу функцию в функциональную среду, которая мы вызываем Sin, по порядку чтобы не перезаписать системную функцию sin. Затем мы реализуем теорему сложения sin (x + y) = sin (x)  cos (y) + sin (y)  cos (x) в слоте "expand" функциональной среды, т.е. стандартная программа слота Sin::expand:

Sin := funcenv(Sin):
Sin::expand := proc(u) // compute expand(Sin(u))
  local x, y;
begin
  // recursively expand the argument u
  u := expand(op(u));

   if type(u) = "_plus" then // u is a sum
    x := op(u, 1); // the first term
    y := u - x;    // the remaining terms

    // apply the addition theorem and
    // expand the result again
    expand(Sin(x)*cos(y) + cos(x)*Sin(y))
  else
    Sin(u)
  end_if
end_proc:

Теперь, если expand сталкивается с подвыражением формы Sin(u), это вызывает Sin::expand(u), чтобы расширить Sin(u). Следующая команда сначала расширяет аргумент a*(b+c) через рекурсивный вызов в Sin::expand, затем применяет теорему сложения, и наконец сам expand расширяет продукт результата с z:

expand(z*Sin(a*(b + c)))

Расширение после приложения теоремы сложения в Sin::expand необходимо, чтобы обработать случай, когда u является суммой больше чем с двумя условиями: затем y является снова суммой, и cos(y) и Sin(y) расширены рекурсивно:

expand(Sin(a + b + c))

Параметры

f, g1, g2, …

арифметические выражения

Опции

ArithmeticOnly

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

Эта опция не предотвращает расширение степеней и корней. Технически, опция не использует перегрузку функции expand для каждого термина исходного выражения. Смотрите Пример 5.

IgnoreAnalyticConstraints

При использовании этой опции expand применяет следующие правила когда разложения выражений:

  • ln (a) + ln (b) = ln (ab) для всех значений a и b. В частности:

    для всех значений a, b и c

  • ln (a b) = bln (a) для всех значений a и b. В частности:

    для всех значений a, b и c

  • Если f и g являются стандартными математическими функциями и f (g (x)) = x для всех маленьких положительных чисел, f (g (x)) =, x принят, чтобы быть допустимым для всего комплексного x. В частности:

    • arcsin (sin (x)) = x, arccos (cos (x)) = x, arctan (tan (x)) = x

    • arcsinh (sinh (x)) = x, arccosh (cosh (x)) = x, arctanh (tanh (x)) = x

    • для всех значений k

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

MaxExponent

Опция, заданная как MaxExponent = n

Не расширяйте степени с целочисленными экспонентами, больше, чем n.

Если вы вызываете expand с этой опцией, функция расширяется, не расширяет степени с целочисленными экспонентами, больше, чем n. Смотрите Пример 7.

Возвращаемые значения

арифметическое выражение.

Перегруженный

f

Алгоритмы

С дополнительными аргументами g1, g2, ... может быть предотвращено расширение определенных подвыражений f. Это работает можно следующим образом: каждое вхождение g1, g2, ... в f заменяется вспомогательной переменной перед расширением, и впоследствии вспомогательные переменные заменяются исходными подвыражениями.

Пользователи могут расширить функциональность expand к их собственным специальным математическим функциям через перегрузку. С этой целью встройте свою функцию в функциональную среду g и реализуйте поведение expand для этой функции в слоте "expand" функциональной среды.

Каждый раз, когда expand сталкивается с подвыражением формы g(u,..), это издает приказ g::expand(g(u,..)) к стандартной программе слота, чтобы расширить подвыражение, передавая еще расширенные аргументы g(u,..) в качестве аргументов. Результат этого вызова не расширен дальше expand. Смотрите Пример 11 выше.

Точно так же слот "expand" может быть задан для пользовательской библиотеки domainT. Каждый раз, когда expand сталкивается с подвыражением d области typeT, это издает приказ T::expand(d) к стандартной программе слота, чтобы расширить d. Результат этого вызова не расширен дальше expand. Если T не имеет никакого слота "expand", то d остается неизменным.