在R中求正交归一Gegenbauer多项式基,midasml包结果异常求助
问题原因与替代方案
问题原因
- 正交性的定义差异:midasml包的
gb()函数生成的Gegenbauer多项式,仅保证带权重的连续正交性,而非你用t(B) %*% B计算的离散无权重正交。Gegenbauer多项式的正交性是基于带权重$(1-x2){\alpha-0.5}$的连续内积:
$$\int_{-1}^1 C_n^{(\alpha)}(x) C_m^{(\alpha)}(x) (1-x2){\alpha-0.5} dx = 0 \quad (n \neq m)$$
你直接计算离散点的普通内积,没有引入权重函数,因此结果不会是对角矩阵。 - 缺乏归一化处理:该函数默认仅保证正交性,未对多项式做归一化(即让各阶多项式的范数为1),即使引入权重,也需要额外步骤完成归一化。
替代方案
方案1:使用orthopolynom包(推荐)
该包专门处理正交多项式,支持直接生成归一化的Gegenbauer多项式:
library(orthopolynom) # 生成3阶以内、alpha=1的归一化Gegenbauer多项式 gegenbauer_polys <- gegenbauer.polynomials(3, alpha = 1, normalized = TRUE) # 计算x点上的多项式值 x <- seq(-1, 1, length.out = 100) B <- sapply(gegenbauer_polys, function(p) polyval(p, x)) # 带权重验证正交归一性(权重为(1-x²)^(1-0.5) = sqrt(1-x²)) weights <- sqrt(1 - x^2) round(t(B) %*% (B * weights), 3)
方案2:使用gsl包
借助GSL库的正交多项式模块生成归一化结果:
library(gsl) x <- seq(-1, 1, length.out = 100) degree <- 3 alpha <- 1 # 逐阶生成归一化Gegenbauer多项式值 B <- matrix(nrow = length(x), ncol = degree + 1) for (n in 0:degree) { B[, n+1] <- gegenbauer_n(n, alpha, x, normalized = TRUE) } # 带权重验证 weights <- sqrt(1 - x^2) round(t(B) %*% (B * weights), 3)
方案3:手动归一化midasml的结果
如果必须使用midasml包,可手动引入权重并完成归一化:
library(midasml) x <- seq(-1, 1, length.out = 100) alpha <- 1 B <- gb(degree = 3, alpha = alpha, a = -1, b = 1, X = x) # 计算权重函数 weights <- (1 - x^2)^(alpha - 0.5) # 计算各列的加权范数 norms <- sqrt(colSums(B^2 * weights)) # 归一化多项式矩阵 B_normalized <- B / norms # 验证加权内积 round(t(B_normalized) %*% (B_normalized * weights), 3)
内容的提问来源于stack exchange,提问作者fina
相关产品推荐
相关产品推荐

