B樣條插值演算法

2021-07-26 14:01:09 字數 1817 閱讀 6710

k階b樣條插值應用非常廣,其中函式性質也是對稱的,通過矩陣求逆,很容易得到係數矩陣。從而得到任意點的值,以及n階導數。

k階b樣條函式ω(k,x)的遞推性質:ω(k,x)=1/k*(x+(k+1)/2)*ω(k-1,x+0.5)-1/k*(x-(k+1)/2)*ω(k-1,x-0.5)

k階b樣條函式的導數性質:ω『(k,x)=ω(k-1,x+0.5)-ω(k-1,x-0.5)

在求解係數矩陣的時候需要額外的k-1個方程條件,一般情況下設定首尾一階導數值或是二階導數值。具體的條件可以自己確定,從而得到完整的方陣。

**很簡單,如下:

* k階b樣條函式 ω(k,x)

* * ω(k,x)的導數性質:ω『(k,x)=ω(k-1,x+0.5)-ω(k-1,x-0.5)

* * ω(k,x)的遞推性質:ω(k,x)=1/k*(x+(k+1)/2)*ω(k-1,x+0.5)-

1/k*(x-(k+1)/2)*ω(k-1,x-0.5)

* 根據遞推性質即可求得函式

* @param x 

* @param k b樣條階數

* @param n n階導數,n=0時得到y值

* @return

*/private static double getokx(double x,double k,int n)else

}else

}/**

* 根據 s(x)=∑(c*ω(k,x))可得:

* ∑(c*ω(k,0))=y[0]

* ∑(c*ω(k,1))=y[1]

* ∑(c*ω(k,2))=y[2]

* ......

* ∑(c*ω(k,n))=y[n]

* * 

* 以及加入條件方程組,得到n+k矩陣

* * a[i]=∑ω(k,i),v=y

* * a*c=v --> c=a逆*v

* * @return c

*/public double getci()

v[i][0]=y[i];

}//還有k-1個條件(n階導數為0)

//自定義k-1個條件方程

//這裡是x0的導數=y0d,xn的導數=ynd;

int m=0;

for(int i=n+1;iif(m==0)

v[i][0]=y0d;

}else if(m==1)

v[i][0]=ynd;

}else

v[i][0]=0;

}m++;

}doublea1=inversematrix(a);//矩陣求逆

double t=times(a1, v);//矩陣相乘

double c=new double[n+k];

for(int i=0;ic[i]=t[i][0];

}return c;//返回係數

}/**

* 獲取曲線上的點s(x)=∑(c*ω(k,x))

* @param x (x,y)

* @param c b樣條函式係數陣列

* @param n n階導數,n=0時得到s(x)值

* @return s(x), s'(x),s''(x)....

*/public static double gety(double x,doublec,int n)

int size=0;

for(int i=(int) x;idouble temp=getokx(x-i+(k-1)/2,k,n);

rst+=c[i]*temp;

size++;

if(size==k+1)

}return rst;

}完整的例子見:

三次樣條插值

條件 1 輸入 x y f x 0 leq i leq n 2 要求擬合的曲線 s x 滿足 對於任意的 1 leq i leq n 1 在 x 處一階二階導數連續,s x 也連續,且 s x f x s x f x 求解過程 設 s m 對於區間 x x s x 是 x x 上的線性函式,所以設 ...

二次樣條插值

encoding utf 8 import numpy as np import matplotlib.pyplot as plt 關鍵點 x 2.0,4.5,7.0,9.0,11.0 y 1.5,2.5,1.5,0.5,5.0 def main 檢查長度 if len x len y print ...

Cesium中的樣條插值

在cesium裡,提供了三種樣條插值方法,linearspline,catmullromspline,hermitespline。在具體的例項上,可以使用樣條插值法利用已知的控制點,插值出一系列的點,用於平滑曲線,特別是在路徑的追朔重演。下面,我們分別介紹這三種樣條插值的使用方法以及效果。linea...