在 Julia(或 MATLAB)中创建完整切比雪夫多项式的向量?

Create vector of complete Chebyshev polynomials in Julia (or MATLAB)?

假设我们有一个二维函数 f(x,y),我们想用一组高达 2 次的切比雪夫多项式来逼近。设第 j 次的切比雪夫多项式为 Tj(x) 或 Tj(y)。我们通常通过构造函数 g(x,y) 来近似 f(x,y),该函数是一维多项式的张量积,

我想做的是生成一个完整的N级切比雪夫多项式。这就是上面的张量积,但是其中索引k+l的总和必须小于或等于N。所以如果 N 是 3,那么除了 T2(x)*T2(y) 之外,我们将得到上面总和中的所有项,因为2+2=4 > 3。随着函数维数的增加,更多的项被删除。

最终,我想通过灵活选择级别来做到这一点,并且如果我使用超过 2 个或 3 个维度,则不必写出一堆嵌套循环。似乎 @nloops 是可行的方法,但我不太明白。

例如,假设我想计算 (.5,.5) 处的二维切比雪夫多项式。我可以编写一个内联函数,该函数 returns 点 x 处 N 级的一维切比雪夫多项式。

cheb(d,x) = cos((d)*acos(x))
a = [.5, .5]
polys1d = [cheb(d,a[i]) for d = 0:2, i = 1:length(a)]

创建二维(甚至更多)的完整张量乘积多项式很容易。例如:

polys2d = kron(polys1d[:,1],polys1d[:,2])

但是以一般方式创建完整的多项式有点棘手。我希望它以一种我不通过构建完整张量积然后删除度数之和大于水平的多项式开始的方式来实现。如果维数和层数都很大,会占用大量内存。

如果我们定义如下辅助函数:

using Iterators   # install with Pkg.add("Iterators")

nlimitedkparts(n,k) = (diff([0;v]).-1 for v in subsets(1:(n+k),k))

我们可以生成以下内容:

julia> ["T_$(r[1])(x)*T_$(r[2])(y)" for r in nlimitedkparts(3,2)]
10-element Array{String,1}:
 "T_0(x)*T_0(y)"
 "T_0(x)*T_1(y)"
 "T_0(x)*T_2(y)"
 "T_0(x)*T_3(y)"
 "T_1(x)*T_0(y)"
 "T_1(x)*T_1(y)"
 "T_1(x)*T_2(y)"
 "T_2(x)*T_0(y)"
 "T_2(x)*T_1(y)"
 "T_3(x)*T_0(y)"

当然,除了生成这些字符串,您可能还想做一些其他事情,但使用相同的 nlimitedkparts 函数。