2010-11-11 2 views
2

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

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] 

ответ

3

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

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]+.... 

Было ли это то, что вы были после?

+0

Это работает с символами для переменных, например, 'sumProduct [f, {{a, b}}, {{a, {1, 2}}, {b, {0}}}]'. – Janus

+0

+1 Указание фиксированных и свободных переменных таким образом упрощает работу. –

+0

спасибо, это аккуратно! –

Смежные вопросы