基于径向基函数(RBF)的函数插值

基于径向基函数(RBF)的函数插值1 函数插值 2 RBF 函数插值代码实现

基于径向基函数的函数插值

1. 函数插值

函数插值问题: 用形式简单的插值函数 f ^ ( x ) \hat f(x) f^(x) 近似原函数

( 1 ) \uad(1) (1) 设函数 y = f ( x ) y=f(x) y=f(x) 在某个区间上有定义,并且已知该区间上的一些数据点 { x i , y i } \{x_i,y_i\} {
xi,yi}
严格满足 y i = f ( x i ) , i = 1 , ⋯   , N y_i=f(x_i),i=1,\cdots,N yi=f(xi),i=1,,N,这些数据点称为“控制节点”或“插值节点

( 2 ) \uad(2) (2) 如果存在一个形式上比较简单(比如 n n n 次多项式)的函数 f ^ ( x ) \hat{f}(x) f^(x),使得 f ^ ( x i ) = y i , i = 1 , ⋯   , N \hat f(x_i)=y_i,i=1,\cdots,N f^(xi)=yi,i=1,,N 都成立,就称 f ^ ( x ) \hat{f}(x) f^(x) f ( x ) f(x) f(x) 的插值函数。

\uad 典型的函数插值方法:拉格朗日插值和牛顿插值、 H e r m i t e Hermite Hermite插值、样条插值等。

2. RBF函数插值

\uad 与拉格朗日插值之类的常规函数插值不同,基于核函数的函数插值“通过引入核函数”来刻画数据的局部化特征

\uad 径向基函数 (Radial Basis Function,RBF) \text{(Radial\ Basis\ Function,RBF)} (Radial Basis Function,RBF) 就是一类特殊的基函数,最常用的就是“高斯基函数”,定义为:

φ ( x ) = e − x 2 2 σ 2 \uad\uad\uad\varphi(x)=e^{-\frac{x^2}{2\sigma^2}} φ(x)=e2σ2x2  (以一维情况为例)

\uad 在这里插入图片描述
RBF函数插值:  f ^ ( x ) = ∑ i = 1 N w i φ ( ∥ x − x i ∥ ) \hat{f}(x)=\displaystyle\sum_{i=1}^Nw_i\varphi(\parallel x-x_i\parallel) f^(x)=i=1Nwiφ(xxi)

\uad 假设有 N N N 个插值节点,也就是已知 { x j , y j } ∣ j = 1 N \{x_j,y_j\}\big |_{j=1}^N {
xj,yj}
j=1N
,其中 f ^ ( x j ) = y j = f ( x j ) \hat{f}(x_j)=y_j=f(x_j) f^(xj)=yj=f(xj),如下图所示。

\uad 在这里插入图片描述

图中,红色实线为真实函数曲线,绿色空心圆圈代表插值节点 ( x j , y j ) (x_j,y_j) (xj,yj)蓝色实心点为RBF插值所求得的权值 w j w_j wj

\uad { x j , y j } ∣ j = 1 N \{x_j,y_j\}\big |_{j=1}^N {
xj,yj}
j=1N
带入方程 f ^ ( x ) = ∑ i = 1 N w i φ ( ∥ x − x i ∥ ) \hat{f}(x)=\displaystyle\sum_{i=1}^Nw_i\varphi(\parallel x-x_i\parallel) f^(x)=i=1Nwiφ(xxi),可得到:

[ φ 11 φ 12 ⋯ φ 1 N φ 21 φ 22 ⋯ φ 2 N ⋮ ⋮ ⋮ φ 11 φ 12 ⋯ φ 1 N ] ⏟ Φ [ w 1 w 2 ⋮ w N ] ⏟ W = [ y 1 y 2 ⋮ y N ] ⏟ y \uad\uad\underbrace{\left[ \begin{matrix} \varphi_{11} & \varphi_{12} & \cdots & \varphi_{1N} \\ \varphi_{21} & \varphi_{22} & \cdots & \varphi_{2N} \\ \vdots & \vdots & &\vdots \\ \varphi_{11} & \varphi_{12} & \cdots & \varphi_{1N} \end{matrix} \right] }_{\Phi}\underbrace{ \left[ \begin{matrix} w_1 \\ w_2 \\ \vdots \\ w_N \end{matrix} \right]}_{\bold W}=\underbrace{\left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_N \end{matrix} \right]}_{\bold y} Φ



φ11φ21φ11φ12φ22φ12φ1Nφ2Nφ1N
W



w1w2wN
=
y



y1y2yN
,其中 φ j i = φ ( ∥ x j − x i ∥ ) \varphi_{ji}=\varphi(\parallel x_j-x_i\parallel) φji=φ(xjxi)

\uad
\uad 其中, Φ = [ φ j i ] \Phi=[\varphi_{ji}] Φ=[φji]插值矩阵。因为 φ j i = φ ( ∥ x j − x i ∥ ) = φ i j \varphi_{ji}=\varphi(\parallel x_j-x_i\parallel)=\varphi_{ij} φji=φ(xjxi)=φij,因此插值矩阵是对称的。对于高斯核函数而言,插值矩阵的对角线元素的值为 1 1 1

\uad 将线性方程组记为 Φ W = y \Phi\bold W=\bold y ΦW=y,该方程组的第 j j j 行为:

f ^ ( x j ) = y j = w 1 φ ( ∥ x j − x 1 ∥ ) + w 2 φ ( ∥ x j − x 2 ∥ ) + ⋯ + w N φ ( ∥ x j − x N ∥ ) \uad\uad\hat{f}(x_j)=y_j=w_1\varphi(\parallel x_j-x_1\parallel)+w_2\varphi(\parallel x_j-x_2\parallel)+\cdots+w_N\varphi(\parallel x_j-x_N\parallel) f^(xj)=yj=w1φ(xjx1)+w2φ(xjx2)++wNφ(xjxN)

\uad 因此,可求出 RBF \text{RBF} RBF 插值的系数为: W = Φ − 1 y \bold W=\Phi^{-1}\bold y W=Φ1y,其示意图如下图所示。

Micchelli定理可以保证采用高斯函数时,插值矩阵 Φ \Phi Φ 是可逆的(只要插值节点互不相同)。

\uad 在这里插入图片描述

代码实现

import numpy as np import matplotlib.pyplot as plt def gen_data(x1,x2): y_sample = np.sin(np.pi*x1/2)+np.cos(np.pi*x1/3) y_all = np.sin(np.pi*x2/2)+np.cos(np.pi*x2/3) return y_sample, y_all def kernel_interpolation(y_sample,x1,sig): gaussian_kernel = lambda x,c,h: np.exp(-(x-x[c])2/(2*(h2))) num = len(y_sample) w = np.zeros(num) int_matrix = np.asmatrix(np.zeros((num,num))) for i in range(num): int_matrix[i,:] = gaussian_kernel(x1,i,sig) w = int_matrix.I * np.asmatrix(y_sample).T return w def kernel_interpolation_rec(w,x1,x2,sig): gkernel = lambda x,xc,h: np.exp(-(x-xc)2/(2*(h2))) num = len(x2) y_rec = np.zeros(num) for i in range(num): for k in range(len(w)): y_rec[i] = y_rec[i] + w[k]*gkernel(x2[i],x1[k],sig) return y_rec if __name__ == '__main__': snum = 20 # control point数量 ratio = 20 # 总数据点数量:snum*ratio sig = 1 # 核函数宽度 xs = -8 xe = 8 x1 = np.linspace(xs,xe,snum) x2 = np.linspace(xs,xe,(snum-1)*ratio+1) y_sample, y_all = gen_data(x1,x2) plt.figure(1) w = kernel_interpolation(y_sample,x1,sig) y_rec = kernel_interpolation_rec(w,x1,x2,sig) plt.plot(x2,y_rec,'k') plt.plot(x2,y_all,'r:') plt.ylabel('y') plt.xlabel('x') for i in range(len(x1)): plt.plot(x1[i],y_sample[i],'go',markerfacecolor='none') plt.legend(labels=['reconstruction','original','control point'],loc='lower left') plt.title('kernel interpolation:$y=sin(\pi x/2)+cos(\pi x/3)$') plt.show() 

在相同区间、分别采用 8 , 12 , 16 , 20 8,12,16,20 8,12,16,20 个控制节点 (control point) \text{(control\ point)} (control point) 进行函数插值的结果
显然,插值节点过少,无法体现整个函数的特征;插值节点越多,函数插值的结果越精确

在这里插入图片描述

扩大插值区间范围,控制节点 (control point) \text{(control\ point)} (control point) 也需要增加数量,才能保持函数插值的准确性

\quad
另外, Scipy \text{Scipy} Scipy 的插值模块也提供了 RBF \text{RBF} RBF 插值,其实现代码如下:

import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import Rbf f = lambda x: np.sin(np.pi*x/2)+np.cos(np.pi*x/3) snum = 20 # control point数量 ratio = 20 # 总数据点数量:snum*ratio xs = -8 xe = 8 x1 = np.linspace(xs,xe,snum) # control points x2 = np.linspace(xs,xe,(snum-1)*ratio+1) # 作图总数据点 y1 = f(x1) # control points rf = Rbf(x1, y1) # reconstructed Rbf function y2 = rf(x2) # Rbf reconstruction plt.plot(x2, y2, 'k-', x2, f(x2),'r-', x1, y1, 'go', markerfacecolor='none') plt.legend(["Radial basis functions", "Orignal", "control point"],loc='best') plt.show() 

\quad
此外, RBF \text{RBF} RBF函数插值还可以通过径向基函数网络来实现。

\quad
参考:函数插值的python实现——拉格朗日、牛顿插值

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229489.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午4:36
下一篇 2026年3月16日 下午4:36


相关推荐

  • mysql c preparestatement「建议收藏」

    mysql c preparestatement「建议收藏」今天折腾了一个mysql的c的insert语句,与java访问oracle类似,mysql也支持这种preparestatement,使用这种语句的好处有很多,在oracle之中,这种方式在后台是sql是进行软解析,而直接拼凑insert的sql语句,则是叫硬解析,即每一个数据库都要重新分析一个sql的语法,对于大量的数据插入的情况,最好使用preparestatement,第2个好处是,如果直接

    2022年5月16日
    34
  • 主键(Primary Key)设置

    主键(Primary Key)设置版权声明 Copyright 2008 2020 david AllRightsRes 本文为博主原创文章 转载请标明出处 https blog csdn net jssg tzw article details lt div gt lt linkrel st

    2026年3月18日
    2
  • OpenClaw改名始末:Clawdbot到Moltbot再到OpenClaw的完整演变历程

    OpenClaw改名始末:Clawdbot到Moltbot再到OpenClaw的完整演变历程

    2026年3月13日
    2
  • macos idea2021激活码(JetBrains全家桶)

    (macos idea2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~23LNPMIJZT-eyJsaWNlbnNlSWQiOi…

    2022年3月29日
    136
  • vue 上传插件_vue上传文件前端完整实例

    vue 上传插件_vue上传文件前端完整实例插件描述:vue文件上传插件,可配置更新时间:2020-12-2310:17:131、本插件基于vue+element,使用前请先使用npminstall安装相关依赖2、运行项目npmrunserve3、打包项目npmrunbuild4、dist文件夹内为打包后的文件5、src内components组件为组件的源码6、因为是本地项目,因此不支持预览,但可在本插件基础上进行修改7、e…

    2022年8月16日
    5
  • apachestruts2是什么_apache免费吗

    apachestruts2是什么_apache免费吗 1.org.apache.struts2.dispatcher.FilterDispatcher?    是Struts2的主要的Filter,负责四个方面的功能:        (1)执行Actions        (2)清除ActionContext        (3)维护静态内容        (4)清除request生命周期内的XWork的interceptors    另注

    2022年8月16日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号