Wolfram mathematica Mathematica中自动生成和

Wolfram mathematica Mathematica中自动生成和,wolfram-mathematica,Wolfram Mathematica,这是我在执行时遇到的一个设计问题。假设您需要自动生成以下形式的表达式 (来源:) 对于每个这样的表达式,会自动生成sum、固定变量和“SUMMETER over”变量内的术语,“f”函数是单独定义的。要生成上面的表达式,我可能需要调用 sumProduct(factors,fixedVariables,fixedValues,freeVariables,freeRanges) 在哪里 factors={{1,4},{3,4},{3,4,5}} fixedVariables={1,3} fix

这是我在执行时遇到的一个设计问题。假设您需要自动生成以下形式的表达式


(来源:)

对于每个这样的表达式,会自动生成sum、固定变量和“SUMMETER over”变量内的术语,“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 Janus的解决方案,为可读性而重写

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]

我将固定变量和自由变量组合在一起,并将它们全部指定在一个列表中

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

这就是你想要的吗?

这也适用于变量的符号,例如
sumProduct[f,{a,b},{a,{1,2},{b,{0}}]
+1以这种方式指定固定和自由变量会使事情变得更容易。@Yaroslaw你的编辑是否暗示我的代码是不可读的——仅仅因为它包含
,#)&)@@@
?;)在工作安全代码方面,你无法击败Mathematica。