考虑一种情况,即表格列表中有数据
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
- 幂函数的幂级数展开。
答案 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]