给定 f f 为定义在区间[-1,1]上的函数,其他定义在[a,b]上的函数可以通过简单的平移和缩放转变为该标准形式。给定一组基底 ,期望能将函数 f f 在这一组基底上进行展开为的形式。这里我们用了爱因斯坦求和约定,即相同的指标会被求和,等价于 f=∑iaiei f = ∑ i a i e i 。
一般来说,如果基底
ei
e
i
为正交基,即
<ei,ej>=δij
<
e
i
,
e
j
>=
δ
i
j
<script type="math/tex" id="MathJax-Element-41">
=\delta_{ij}</script>,则展开可以直接写为:
当 ei e i 不是正交基时,事情就不太一样了,此时 <ei,ej> < e i , e j > <script type="math/tex" id="MathJax-Element-44"> </script>不再为单位对角阵,而且一个一般的矩阵。一般我们可以选用施密特正交化将这一组非正交的基底正交化,再进行投影。不过在这里我们采用另一种办法。
同样地,我们有
下面给出一个简单的例子:
将函数 ex e x 在区间[-1,1]上展开,展开基底为[ 1,x,x2,x3 1 , x , x 2 , x 3 ]。
注意,这里基地并非正交基,也并非完备基,更不是归一基。和以前基底的三要素:正交归一完备一个不沾。此时的展开为最小二乘展开,即在这几个基底所张成的函数空间上进行投影。
Code:
using QuadGK
order=3;
e=Base.MathConstants.e;
F=x->e^x;
basis=[x->x^n for n=0:order];
IJ=[quadgk(x->i(x)*j(x),-1,1)[1] for i in basis,j in basis];
FJ=[quadgk(x->i(x)*F(x),-1,1)[1] for i in basis];
coff=IJ\FJ
输出coff为 [0.996294, 0.997955, 0.536722, 0.176139]
将其拟合函数和原始函数绘制出来如下,可见拟合效果。
using PyPlot
x=-1:0.1:1;
Mx=hcat([f.(x) for f in basis]...)*coff
Ex=exp.(x)
plot(x,Ex,"b.",alpha=0.7,label=L"e^x")
plot(x,Mx,"r--",alpha=0.7,label="Model")
grid()
legend()