Объединение шаблонов для сбора терминов - PullRequest
1 голос
/ 08 декабря 2011

У меня есть выражения 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 [_]?

1 Ответ

1 голос
/ 10 декабря 2011

Ваша длинная история, но я думаю, что ваш вопрос сводится к:

Как получить внешний продукт списков внутри списка?

Еслиэто единственное, что вы хотели знать, что вы были близки.Это можно сделать просто так:

booleanLists = {{True, False}, {True, False, False, False}};

Outer[And, ##] & @@ booleanLists

(* ==>  {{True, False, False, False}, {False, False, False, False}} *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...