在Julia(或MATLAB)中创建完整Chebyshev多项式的向量?

时间:2017-07-26 19:48:53

标签: matlab julia polynomials function-approximation polynomial-approximations

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

我想要做的是生成一个N级的完整Chebyshev多项式。这只是上面的张量积,但是其中索引k + l的总和必须小于或等于N.所以如果N如果是2,那么我们将具有上述总和中的所有项,除了T 2 (x)* T 2 (y),因为2 + 2 = 4> 3.随着函数维数的增加,更多的术语会被删除。

最终我想通过灵活选择关卡来完成这项工作,如果我使用2或3个以上的维度,则无需写出一堆嵌套循环。好像@nloops似乎是要走的路,但我无法弄明白。

例如,假设我想在(.5,.5)处评估二维Chebyshev多项式。我可以编写一个内联函数,在x点返回N级的一维Chebyshev多项式。

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

创建2维(甚至更多)的全张量积多项式很容易。例如:

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

但是以一般方式创建完整的多项式有点棘手。我希望它能够通过构建完整张量积然后去除度数之和大于水平的多项式来开始。如果维度和级别都很大,这将占用大量内存。

1 个答案:

答案 0 :(得分:1)

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

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函数。