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...