2010-11-11 3 views
2

Il s'agit d'un problème de conception que j'ai rencontré lors de la mise en œuvre de Generalized Distributive Law. Supposons que vous avez besoin de générer automatiquement des expressions de la forme suivanteGénération automatique de sommes dans Mathematica

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

termes à l'intérieur de la somme, les variables fixes et « additionnées sur » variables sont générées automatiquement pour chaque expression, et les fonctions « f » sont définies séparément. Pour générer l'expression ci-dessus, je peux avoir besoin d'appeler

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]} 

et la sortie de cette fonction sera équivalente à

Total[{f14[-1,1]f34[9,1]f345[9,1,1],f14[-1,2]f34[9,2]f345[9,2,1],....}] 

Représentation des termes f pourrait être différent, c'est-à-dire f [{1,4}, {- 1,1}] au lieu de f14 [-1,1]. Utiliser aussi Integer pour désigner chaque variable n'est qu'un choix de conception.

Quelqu'un peut-il suggérer une approche élégante pour implémenter sumProduct?

Modifier 11/11 solution de Janus, réécrite pour la lisibilité

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] 

Répondre

3

Je tassent les fixes et variables libres et les spécifier dans une liste comme

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

Ensuite, votre sumProduct peut être mis en œuvre assez concis

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

qui est appelé sumProduct[f,factors,variables] cracher une longue chose:

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

Était-ce ce que vous étiez après?

+0

Cela fonctionne également avec des symboles pour des variables, par ex. 'sumProduct [f, {{a, b}}, {{a, {1, 2}}, {b, {0}}}]'. – Janus

+0

+1 La spécification des variables fixe et libre facilite ainsi la tâche. –

+0

merci, c'est propre! –

Questions connexes