在n个变量中生成m阶幂级数的项

时间:2011-12-20 09:19:23

标签: wolfram-mathematica

考虑一种情况,即表格列表中有数据

data = {{x1, x2, x3, ..., xn, y}, {...}, ..., {...}}

例如,

data = {{0, 2, 3, 2}, {0, 0, 1, 4}, {7, 6, 8, 3}}

我想将数据拟合为多元多项式,例如2。 因此,3变量函数值为:

{2, 4, 3}

各个点

{{0, 2, 3}, {0, 0, 1}, {7, 6, 8}}

我会说像

Fit[data, {1, x, y, z, x^2, y^2, z^2, x y , x z, y z}, {x, y, z}]

这一切都很好,但我可能不只有3变量数据,可能有任意数量的变量,我不知道如何以编程方式生成所有线性,二次或甚至更高阶的项,将它们作为Fit []的第二个参数插入。

对于4变量日期做第二顺序,它将类似于:

{1, x1, x2, x3, x4, x1^2, x2^2, x3^2, x4^2, x1 x2, x1 x3, x1 x4, x2 x3, x2 x4, x3 x4}

有没有什么方法可以为n变量生成m这样的列表? 像m中的术语(没有系数) - n - 幂函数的幂级数展开。

4 个答案:

答案 0 :(得分:8)

这样做你想要的吗?

Union[Times @@@ Tuples[{1, x, y, z}, 2]]

答案 1 :(得分:6)

虽然@ruebenko的解决方案是完全正确的,但我想提一下,对于更高的功率/更大数量的变量来说它会非常慢,因为Tuples的复杂性和更高的重复性权力。这是一种代数方法,对于这些情况(运行时和内存方式)具有更好的性能:

List @@ Expand[(1 + x + y + z + t)^2] /. a_Integer*b_ :> b

以下是大量变量的比较:

In[257]:= (res1=Union[Times@@@Tuples[{1,x,y,z,t},9]])//Short//Timing
Out[257]= {19.345,{1,t,t^2,t^3,t^4,t^5,t^6,t^7,t^8,t^9,x,<<694>>,x^2 z^7,y z^7,
      t y z^7,x y z^7,y^2 z^7,z^8,t z^8,x z^8,y z^8,z^9}}

In[259]:= (res2=List@@Expand[(1+x+y+z+t)^9]/. a_Integer*b_:>b)//Short//Timing
Out[259]= {0.016,{1,t,t^2,t^3,t^4,t^5,t^6,t^7,t^8,t^9,x,<<694>>,x^2 z^7,y z^7,
      t y z^7,x y z^7,y^2 z^7,z^8,t z^8,x z^8,y z^8,z^9}}

In[260]:= res1===res2
Out[260]= True

在这种情况下,我们观察到1000倍的加速,但通常这两种方法只有不同的计算复杂度。上面的代码是一个通用而且很好的方法的应用程序,称为代数编程。有关在Mathematica中进行的有趣讨论,请参阅Andrzej Kozlowski的Mathematica Journal paper

答案 2 :(得分:3)

使用@ ruebenko的简洁解决方案

varsList[y_, n_?IntegerQ, k_?IntegerQ] := 
Union[Times @@@ 
 Tuples[Prepend[Table[Subscript[y, i], {i, 1, n}], 1], k]]

您可以通过varsList[x, 4, 2]生成所需的列表。

答案 3 :(得分:2)

以下是另一种我认为值得了解的方法:

set = {1, x, y, z};

Union @@ Outer[Times, set, set]