У меня есть выражения Mathematica (называемые expr), которые являются суммой многих терминов.Также у меня есть список (называемый var) с некоторыми переменными и функциями, которые могут встречаться в некоторых из этих терминов.
Первое, что я хотел бы сделать, это извлечь термины, которые содержат ряд переменных ифункционирует определенное количество раз.Например, если var = {a, f[_]}
, то я могу извлечь все термины, которые содержат переменную a
один раз и функцию f
2 раза.f[f[a + b]]
является примером термина, который удовлетворяет этим критериям.
Второе, что я хотел бы сделать, - это создать список (называемый выходным), который содержит все термины исходного выражения один раз.Список должен быть таким, чтобы он группировал термины в соответствии с тем, сколько раз они содержат переменные и функции, указанные в var.Для var = {a, f[_]}
результат будет output = {{sum of those terms containing 0 * a and 0 * f[_], "sum of..." 1 * a and 0 f, "sum of..." 2a 0f, ... }, {"sum of..." 0a 1f, "sum of..." 1a, 1f, ... }}
. Учитывая решение проблемы 2, легко решить проблему 1: чтобы извлечь определенный член выражения, вам просто нужно выбрать правильный элемент извывод списка.По этой причине я попытался решить проблему 2. Чтобы все было ясно, я начал с простого выражения, содержащего только один термин.Сначала я генерирую список шаблонов
expr = f[a + f[y]]
var = {{a, 1}, {f[_], 3}}
basicpattern[symbol_, n_, term_] =
Hold[Table[Count[{term}, symbol, 10] == i, {i, 0, n}]]
basicpattern[#1, #2, expr] & @@@ var // ReleaseHold
Выходные данные
{{False, True}, {False, False, True, False}}
Интерпретация такова: переменная a встречается один раз, функция f появляется 2 раза.Теперь я хотел бы взять внешний продукт списков внутри basicpattern для создания комбинаций шаблонов.Затем новый список шаблонов можно использовать вместе с делами, чтобы выбрать термины из выражения и поместить их в список.
Здесь я застрял: как взять внешний продукт списков внутри списка?Я догадался
Outer[And, {{True, False}, {True, False, False, False}}, 1]
Но это не дает восьми терминов.
Обновление
С помощью Sjoerd я пошел немного дальше.
expr = f[a + f[y]];
var = {{a, 1}, {f[_], 3}};
basicpattern[symbol_, n_, term_] :=
Table[Hold[Count[{term}, symbol, 10]] == i, {i, 0, n}];
basicpattern[#1, #2, expr] & @@@ var;
Outer[And, ##] & @@ %;
test = %[[2, 3]]
%// ReleaseHold
Дает на выходе
Hold[Count[{f[a + f[y]]}, a, 10]] == 1 &&
Hold[Count[{f[a + f[y]]}, f[_], 10]] == 2
True
Интерпретация заключается в том, что f [a + f [y]] содержит один раз a и два раза f [_].Внешний продукт - это список тестов, подобных этим.
Предположим, я изменил expr на
expr = f [a + f [y]] + g [z] + y ^ 2 - 13 x + 12a + af [x]
Как я могу использовать содержимое теста, чтобы собрать все термины, содержащие один а и два раза f [_]?