如何快速实现基于Chebyshev多项式的光滑函数级数展开?
切比雪夫级数展开的高效实现问题
我希望用类似泰勒级数的形式,通过切比雪夫多项式生成光滑函数的级数展开,但一直没找到给定系数下高效计算该展开的方法。实际测试发现,硬编码切比雪夫(或泰勒)多项式比调用现有库函数快得多,但当近似阶数较高时,硬编码显然不现实,因此想寻求更高效的代码实现方案。以下是我的尝试代码:
library(mpoly) library(foreach) library(microbenchmark) # 补充原代码缺失的依赖库 n=5 # 硬编码1到4阶切比雪夫多项式 cheb = function(x) {x} # 1阶切比雪夫多项式 cheb2 = function(x) {-1 + 2*x^2} # 2阶切比雪夫多项式 cheb3 = function(x) {-3*x+4*x^3} # 3阶切比雪夫多项式 cheb4 = function(x) {1-8*x^2+8*x^4} # 4阶切比雪夫多项式 # 用mpoly库的chebyshev()生成n-1阶以内的切比雪夫多项式,并转为可调用函数 cheb_funs = foreach(n_ind = 1:n) %do% as.function(chebyshev(n_ind-1)) # 基于硬编码多项式计算级数展开 Cheb_app1 = function(x) { p = x$p v = x$v_cheb v[1] + v[2]*cheb(p) + v[3]*cheb2(p) + v[4]*cheb3(p) + v[5]*cheb4(p) } # 基于foreach循环和动态生成的cheb_funs计算级数展开 Cheb_app2 = function(x) { p = x$p; v = x$v_cheb; foreach(p_ind = p, .combine = "c") %do% (foreach(n_ind = 1:n, .combine = "sum") %do% (v[n_ind]*(cheb_funs[[n_ind]](p_ind)))) } # 性能基准测试 z = list(p = runif(10, -1,1), v_cheb = runif(n, -1,1)) microbenchmark(Cheb_app1(z), Cheb_app2(z))
基准测试结果
Unit: microseconds expr min lq mean median uq max neval Cheb_app1(z) 3.473 4.011 120.6585 7.955 12.944 11217.96 100 Cheb_app2(z) 30249.810 33243.943 35605.0237 34127.602 38195.954 47322.77 100
内容的提问来源于stack exchange,提问作者spellard
相关产品推荐
相关产品推荐

