ved*_*ran 5 wolfram-mathematica
考虑一种情况,即表单列表中包含数据
data = {{x1, x2, x3, ..., xn, y}, {...}, ..., {...}}
Run Code Online (Sandbox Code Playgroud)
例如,
data = {{0, 2, 3, 2}, {0, 0, 1, 4}, {7, 6, 8, 3}}
Run Code Online (Sandbox Code Playgroud)
我想将数据拟合为多元多项式,例如,2.因此,3变量函数值是:
{2, 4, 3}
Run Code Online (Sandbox Code Playgroud)
各点
{{0, 2, 3}, {0, 0, 1}, {7, 6, 8}}
Run Code Online (Sandbox Code Playgroud)
我会说类似的东西
Fit[data, {1, x, y, z, x^2, y^2, z^2, x y , x z, y z}, {x, y, z}]
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我可能没有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}
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以为n
变量生成这样的列表m
?像m
一个n
变量函数的幂级数展开式中的术语(没有系数).
虽然@ruebenko的解决方案是完全正确的,但我想提一下,对于更高的功率/更大数量的变量来说,这将是非常缓慢的,因为更高功率的复杂性Tuples
和大量重复.这是一种代数方法,对于这些情况(运行时和内存方式)具有更好的性能:
List @@ Expand[(1 + x + y + z + t)^2] /. a_Integer*b_ :> b
Run Code Online (Sandbox Code Playgroud)
以下是大量变量的比较:
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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们观察到1000倍的加速,但通常这两种方法只是具有不同的计算复杂性.上面的代码是一个通用而且很好的方法的应用程序,称为代数编程.有关在Mathematica中进行的有趣讨论,请参阅Andrzej Kozlowski的Mathematica Journal论文.