本文实例为大家分享了python实现三次样条插值的具体代码,供大家参考,具体内容如下
<强>函数:强>
<强>算法分析强>
三次样条插值。就是在分段插值的一种情况。
<>强要求:强>
-
<李>在每个分段区间上是三次多项式(这就是三次样条中的三次的来源)李>
<李>在整个区间(开区间)上二阶导数连续(当然啦,这里主要是强调在节点上的连续)李>
<李>加上边界条件。边界条件只需要给出两个方程。构建一个方程组,就可以解出所有的参数。
李>
这里话,根据第一类样条作为边界。(就是知道两端节点的导数数值,然后来做三次样条插值)
但是这里也分为两种情况,分别是这个数值是随便给的一个数,还是说根据函数的在对应点上数值给出。
<强>情况一:强>两边导数数值给出
这里假设数值均为1,即f′(x0)=f′(xn)=f′(xn)=1的情况。
情况一图像
进口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)的情况。
情况二图像
情况二代码