使用任意线性无关函数基的函数逼近

给定 f f 为定义在区间[-1,1]上的函数,其他定义在[a,b]上的函数可以通过简单的平移和缩放转变为该标准形式。给定一组基底 ei,期望能将函数 f f 在这一组基底上进行展开为f=aiei的形式。这里我们用了爱因斯坦求和约定,即相同的指标会被求和,等价于 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>,则展开可以直接写为:

<f,ej>=ai<ei,ej>=aiδij=aj < f , e j >= a i < e i , e j >= a i δ i j = a j
<script type="math/tex; mode=display" id="MathJax-Element-42"> =a_i =a_i\delta_{ij}=a_j</script>

ei e i 不是正交基时,事情就不太一样了,此时 <ei,ej> < e i , e j > <script type="math/tex" id="MathJax-Element-44"> </script>不再为单位对角阵,而且一个一般的矩阵。一般我们可以选用施密特正交化将这一组非正交的基底正交化,再进行投影。不过在这里我们采用另一种办法。

同样地,我们有

<f,ej>=ai<ei,ej> < f , e j >= a i < e i , e j >
<script type="math/tex; mode=display" id="MathJax-Element-45"> =a_i </script>此时 ai a i 需要通过求解线性方程组求出,即
ai=<ei,ej>1<f,ej> a i =< e i , e j > − 1 < f , e j >
其中我们用到了求逆操作,这要求矩阵 <ei,ej> < e i , e j > <script type="math/tex" id="MathJax-Element-48"> </script>必须要是满秩的。或者说 ei e i 必须是线性无关的。

下面给出一个简单的例子:

将函数 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()

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值