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

Блокноты 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 в f гарантирует, что константы, появляющиеся многократно всегда, получают тот же идентификатор. Кроме того, можно получить доступ к помнить таблице процедуры f и выбор, какие замены вы хотите сделать:

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