Автоматическое создание сумм в Mathematica - PullRequest
2 голосов
/ 11 ноября 2010

Это проблема дизайна, с которой я столкнулся, работая над реализацией Общего закона о распределении .Предположим, вам нужно автоматически сгенерировать выражения следующей формы

http://yaroslavvb.com/upload/sum-prod-formula.png

Термины внутри суммы, фиксированные переменные и переменные «суммируются» автоматически генерируются для каждого такого выражения, и «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]

1 Ответ

3 голосов
/ 11 ноября 2010

Я бы собрал вместе фиксированные и свободные переменные и указал бы их все в списке как

variables={{1,{-1}},{3,{9}},{4,Range[5]},{5,Range[6]}};

Тогда ваш sumProduct может быть реализован довольно кратко

sumProduct[f_, factors_, vars_] := Module[{x}, Sum[
   Times @@ ((Subscript[f, ##] @@ (Subscript[x, #] & /@ {##}) &) @@@ factors),
   Sequence @@ ({Subscript[x, #1], #2} & @@@ vars)]]

называется sumProduct[f,factors,variables], чтобы выплюнуть длинную вещь:

Subscript[f, 1,4][-1,1] Subscript[f, 3,4][9,1] Subscript[f, 3,4,5][9,1,1]+....

Это было то, что вы преследовали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...