python实现三次样条插值

  

本文实例为大家分享了python实现三次样条插值的具体代码,供大家参考,具体内容如下

  

<强>函数:

  

 python实现三次样条插值

  

<强>算法分析

  

三次样条插值。就是在分段插值的一种情况。

  

<>强要求:

  
      <李>在每个分段区间上是三次多项式(这就是三次样条中的三次的来源)   <李>在整个区间(开区间)上二阶导数连续(当然啦,这里主要是强调在节点上的连续)   <李>加上边界条件。边界条件只需要给出两个方程。构建一个方程组,就可以解出所有的参数。
      李   
  

这里话,根据第一类样条作为边界。(就是知道两端节点的导数数值,然后来做三次样条插值)

  

但是这里也分为两种情况,分别是这个数值是随便给的一个数,还是说根据函数的在对应点上数值给出。

  

<强>情况一:两边导数数值给出

  

这里假设数值均为1,即f′(x0)=f′(xn)=f′(xn)=1的情况。

  

情况一图像

  

 python实现三次样条插值”> <br/>
  </p>
  <p>情况一代码</p>
  
  <pre类=   进口numpy np   从sympy进口*   进口matplotlib。pyplot作为plt         def f (x):   返回1/(1 + x * * 2)         def卡尔(开始、结束我):=f(开始)   嗯=f(结束)   I=[我]*女士((- n)结束* * 3)/6 +女士(I + 1) * ((n -开始)* * 3)/6 +(-[我]女士/6)*(结束- n) + (   嗯,女士(i + 1)/6) * (n -开始)   返回我         def ff (x): # f (x0, x1,…,xk)   ans=0   因为我在范围(len (x)):   temp=1   j的范围(len (x)):   如果我!=珍:   临时*=x (x[我]- [j])   ans +=f (x[我])/temp   回报答         def平静():   林=[1]+ [1、2]* 9   最后,=[1、2]* 9 + [1]   # Y=1/(1 + n * * 2)   # df=diff (Y, n)   x=np.array(范围(11))- 5所示   # ds=[6 * (ff (x [0:2])——df。潜艇(n, x [0]))   ds=[6 * (ff (x [0:2]) - 1))   因为我在范围(9):   ds。追加(6 * ff (x[我+ 3]))   # ds。附加(6 * (df。潜艇(n, x [10]) - ff (x [2])))   ds。追加(6 * (1 - ff (x [2])))   垫=np。眼睛(11日11)* 2   因为我在范围(11):   如果我==0:   垫[我][1]=lam[我]   elif我==10:   垫[我][9]=个人喜好(i - 1)   其他:   垫[我][i - 1]=个人喜好(i - 1)   垫(我)(i + 1)=lam[我]   ds=np.mat (ds)   垫=np.mat(垫)=ds * Mat.I女士   返回Ms.tolist () [0]         def calnf (x):   nf=[]   因为我在范围(len (x) - 1):   nf。追加(卡尔(x[我],[i + 1], i))   返回nf         def小腿(f (x):   y=[]   因为我在x:   y.append (f。潜艇(n,我)   返回y         def nfSub (x, nf):   tempx=np.array(范围(11))- 5所示   dx=[]   因为我在范围(10):   labelx=[]   j的范围(len (x)):   如果x [j]祝辞=tempx x[我]和[j] & lt;tempx (i + 1):   labelx.append (x [j])   elif我==9 x [j]祝辞=tempx x[我]和[j] & lt;=tempx (i + 1):   labelx.append (x [j])   dx=dx +小腿(nf[我],labelx)   返回np.array (dx)         def画(nf):   plt.rcParams['字体。无衬线']=[' SimHei ')   plt.rcParams['轴。unicode_minus ']=False   x=np。linspace (5 5 101)   y=f (x)   Ly=nfSub (x, nf)   plt。情节(x, y,标签='原函数”)   plt。情节(x, Ly,标签='三次样条插值函数”)   plt.xlabel (“x”)   plt.ylabel (y)   plt.legend ()      plt.savefig (1. png)   plt.show ()         def lossCal (nf):   x=np。linspace (5 5 101)   y=f (x)   Ly=nfSub (x, nf)   Ly=np.array (Ly)   temp=Ly - y   temp=abs(临时)   print (temp.mean ())         if __name__==癬_main__”:   x=np.array(范围(11))- 5所示   y=f (x)      n m=符号(' n m ')   init_printing (use_unicode=True)   女士=平静()   nf=calnf (x)   画(nf)   lossCal (nf)      

<强>情况二:两边导数数值由函数本身算出

  

这里假设数值均为1,即f′(xi)=S′(xi) (i=0, n) f′(xi)=S′(xi) (i=0, n)的情况。

  

情况二图像

  

 python实现三次样条插值

  

情况二代码

python实现三次样条插值