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)
où
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]
Cela fonctionne également avec des symboles pour des variables, par ex. 'sumProduct [f, {{a, b}}, {{a, {1, 2}}, {b, {0}}}]'. – Janus
+1 La spécification des variables fixe et libre facilite ainsi la tâche. –
merci, c'est propre! –