С этой проблемой я столкнулся, работая над реализацией Общего закона о распределении. Предположим, вам нужно автоматически сгенерировать выражения следующей формы
(источник: yaroslavvb.com)
Термины внутри суммы, фиксированные переменные и переменные "суммируются" автоматически генерируются для каждого такого выражения, а функции "f" определяются отдельно. Чтобы сгенерировать выражение выше, мне может потребоваться вызвать
sumProduct(factors,fixedVariables,fixedValues,freeVariables,freeRanges)
где
factors={{1,4},{3,4},{3,4,5}}
fixedVariables={1,3}
fixedValues={-1,9}
freeVariables={4,5}
freeRanges={Range[5],Range[6]}
и вывод этой функции будет эквивалентен
Total[{f14[-1,1]f34[9,1]f345[9,1,1],f14[-1,2]f34[9,2]f345[9,2,1],....}]
Представление терминов f может отличаться, т.е. f [{1,4}, {-1, 1}] вместо f14 [-1, 1]. Также использование Integer для ссылки на каждую переменную - это всего лишь один выбор дизайна.
Кто-нибудь может предложить элегантный подход к реализации sumProduct?
Изменить 11/11 Решение Януса, переписанное для удобства чтения
factors = {{1, 4}, {3, 4}, {3, 4, 5}};
vars = {{1, {-1}}, {3, {9}}, {4, Range[5]}, {5, Range[6]}};
(* list of numbers => list of vars *)
arglist[factor_] := Subscript[x, #] & /@ factor;
(* list of factors => list of functions for those factors *)
terms = Apply[f[#], arglist[#]] & /@ factors;
(* {var,range} pairs for each variable *)
args = {Subscript[x, #1], #2} & @@@ vars;
Sum[Times @@ terms, Sequence @@ args]