Измените подвыражения

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

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

Найдите и замените подвыражения

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

evalAt замены задали объекты в дереве выражений с заданными значениями или подвыражениями, и затем выполняют выражение. Эта функция заменяет только целые ветви деревьев выражений. Это не может заменить часть ветви, например, двух условий в сумме трех условий:

a*(b + c) | b = d,
a*(b + c) | b + c = d,
a*(b + c + 1) | b + c = d

evalAt замены только свободные идентификаторы:

int(f(x), x = 0..1) + f(x) | x = 100

subs замены задали объекты в дереве выражений с заданными значениями или подвыражениями. Эта функция не может заменить часть ветви в дереве выражений:

subs(a*(b + c), b + c = d),
subs(a*(b + c + 1), b + c = d)

После замены, subs не выполняет получившееся выражение (несмотря на то, что оно может упростить выражение). Можно осуществить оценку модифицированных подвыражений при помощи EvalChanges опция:

subs(ln(x), x = E),
subs(ln(x), x = E, EvalChanges)

subs замены и свободные и зависимые идентификаторы. В некоторых случаях заменение зависимых идентификаторов может вызвать недопустимые результаты:

subs(int(f(x), x = 0..1) + f(x), x = 100)

subsex анализирует ассоциативные системные операторы и может заменить часть ветви в дереве выражений:

subsex(a*(b + c), b + c = d),
subsex(a*(b + c + 1), b + c = d)

subsex не выполняет получившееся выражение:

subsex(ln(x + a + 1),  x + a = E - 1)

Используйте eval оценивать результаты, возвращенные subsex:

eval(%)

subsop замены только целые ветви в дереве выражений выражения, тот же путь как subs. При использовании subsop, необходимо знать положение (индекс) ветви в выражении во внутреннем порядке, который может отличаться от выходного порядка, используемого, чтобы представлять выражение на экране. Чтобы найти внутренний индекс конкретного подвыражения, используйте op функция:

ex := sin(a*x + b)  + cos(a*x + b):
op(ex);

op(ex, 2);

op(ex, [2, 1]);

op(ex, [2, 1, 2]);

op(ex, [2, 1, 2, 1])

Теперь можно использовать subsop заменять параметр a с некоторым значением. Например, замените его на значение 3:

subsop(ex, [2, 1, 2, 1] = 3)

prog::find помогает вам найти все случаи определенного значения в выражении. Например, найдите все суммы в этом выражении:

ex := (x + 1)/(x^2 + 2*x - 2) - 1/x + 1/(x + 1):
pos := [prog::find(ex, hold(_plus))];
map(pos, p -> op(ex, p));
map(pos, p -> op(ex, p[1..-2]))

Рекурсивная замена

Также можно найти все подвыражения конкретного типа (например, все Функции Бесселя или все ветви, не содержащие x), выполните некоторый код для этих subexressions и замените их на возвращаемое значение того кода. Для этой задачи используйте misc::maprec функция.

Предположим, что вы хотите переписать все условия, которые содержат синусоидальные функции и функции тангенса в терминах косинусных функций. (В этом примере не используйте sin (x) 2 = 1 - cos (x) 2 и подобные тождества.) Сначала, создайте функции sin2cos и tan2cos та перезапись выражения в терминах косинусной функции. Эти функции получают доступ к операндам синусоидальных функций и функций тангенса с помощью op(ex):

sin2cos := ex -> cos(op(ex) - PI/2):
tan2cos := ex -> cos(op(ex) - PI/2)/cos(op(ex)):

Теперь можно использовать эти функции когда заменяющий все случаи синусоидальных функций и функций тангенса в выражении. Чтобы заменить подвыражения исходного выражения, используйте misc::maprec. misc::maprec функционируйте использует синтаксис misc::maprec(expression, selector = replacement), где:

  • expression исходное выражение (подвыражения которого вы хотите заменить).

  • selector критерий выбора (например, набор типов подвыражений, которые вы хотите заменить).

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

MuPAD применяет misc::maprec рекурсивно ко всем подвыражениям исходного выражения. Например, в этом вызове misc::maprec замены все случаи sin и tan, включая синусоидальную функцию в tan(sin(x)):

misc::maprec(sin(x) + tan(x^2) - tan(sin(x)),
  {"sin"} = sin2cos,
  {"tan"} = tan2cos)

Помимо типов данных или типов выражений, таких как "sin" или "tan", можно использовать процедуры, чтобы представлять критерии выбора в misc::maprec. В этом примере, критерии выбора misc::maprec процедура ex -> bool(freeIndets(ex) = {}) это исключает свободные идентификаторы и выбирает все константы выражения. Используя процедуру f как replacement, misc::maprec замены все нерациональные константы выражения с новыми идентификаторами:

f :=
proc(x)
  option remember;
begin
  if testtype(x, Type::Rational) then x
  else genident();
  end_if;
end:
misc::maprec(a = 5*b + PI*sqrt(2)*c + PI,
  (ex -> bool(freeIndets(ex) = {})) = f)

option remember inf гарантирует, что константы, появляющиеся многократно всегда, получают тот же идентификатор. Кроме того, можно получить доступ к помнить таблице процедуры f и выберите, какие замены вы хотите сделать:

select([op(op(f,5))], _not@bool)