基于Hermite函数的函数最小二乘逼近问题求助
问题分析与修正方案
你遇到的Hermite函数最小二乘逼近效果不佳的问题,主要源于代码中基函数调用错误、Hermite多项式/函数定义偏差这两个核心问题,下面逐一拆解并修正:
1. 致命错误:逼近值计算时误用基函数阶数
你的calculateVal函数中,循环遍历系数p时,始终用k(基函数总阶数)作为Hermite函数的阶数,导致所有项都使用同一个k阶Hermite函数叠加,完全偏离了最小二乘的线性组合逻辑:
错误代码:
function[y] = calculateVal(p,a,k) y=0; for i=1:size(p) y = y+p(i,1)* hermite(a,k); % 所有项都用k阶Hermite,错误! end end
修正后:
function[y] = calculateVal(p,a) y=0; % 遍历每个系数,对应使用第i阶Hermite基函数 for i=1:length(p) y = y + p(i,1) * hermite(a, i); end end
同时主逻辑中调用calculateVal时,不需要传入k,改为calculateVal(p,x(i))。
2. Hermite多项式与函数的定义偏差
你实现的Hermite函数和多项式不符合标准正交Hermite函数的定义,这会破坏基函数的正交性,导致最小二乘系数求解失效:
问题1:Hermite多项式的一阶项错误
标准概率型Hermite多项式的递推中,$H_1(x)=2x$,你当前写的是h = x,这会导致基函数的形状完全错误:
修正hermitePar函数:
function[h] = hermitePar(k,x) if (k>1) h = (2*x*hermitePar(k-1,x)) - ((2*k-2)*hermitePar(k-2,x)); elseif (k==1) h = 2*x; % 修正为标准H₁(x)=2x elseif (k==0) h =1; end end
问题2:Hermite函数的指数权重错误
标准正交Hermite函数的形式是$H_n(x)e{-x2/2}$(而非你写的$e{-x2}$),这个权重是保证Hermite函数在实数轴上正交的关键:
修正hermite函数:
function[h] = hermite(x,k) h = hermitePar(k,x) * exp(-x^2 / 2); % 修正指数权重为-x²/2 end
3. 其他优化建议
- 简化采样点计算:在
findCoeficients中,你已经生成了x=linspace(-1,1,N),后续计算-1+2*(i-1)/(N-1)其实就是x(i),可以直接替换,避免重复计算:Fi(i,j) = hermite(x(i),j); - 基函数索引一致性:如果你的Hermite多项式从k=0开始定义($H_0=1$),可以考虑将基函数的阶数从0到k-1,这样更符合数学定义,避免混淆。
修正后的核心代码验证
修正上述问题后,Hermite基函数的最小二乘逼近应该能达到和其他基函数类似的效果。你可以先测试小阶数(比如N=5,k=3)的情况,观察拟合曲线是否贴合目标函数$cos(\pi x)e^x$。
内容的提问来源于stack exchange,提问作者sswwqqaa
相关产品推荐
相关产品推荐

