三次樣條插值

2021-09-07 23:13:00 字數 3804 閱讀 6209

條件

(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_]$上的線性函式,所以設$s^=m_\frac-x}}+m_\frac}}$,$h_=x_-x_$。對$s^$兩次積分,並利用$s(x_)=y_,s(x_)=y_$,得到:

$s(x)=m_\frac-x)^}}+m_\frac)^}}+(y_-\frach_^})\frac-x}}+(y_-\frach_^})\frac}}$

對上式求導得到:

$s^(x)=-m_\frac-x)^}}+m_\frac)^}}+\frac-y_}}-\frac-m_}h_$

根據在$x_,1\leq j\leq n-1$處一階導數相等可得:

$\mu_m_+2m_+\lambda _m_=d_,1\leq j\leq n-1$

其中$\mu_=\frac}+h_}$,$\lambda _=\frac}+h_}$,$d_=6\frac,x_]-f[x_,x_]}+h_}$,$f[x_,x_]=\frac-y_}-x}$

同時對於邊界條件$s^(x_)=f^(x_)$,$s^(x_)=f^(x_)$可得:$2m_+m_=\frac}(f[x_,x_]-f^(x_))$,$m_+2m_=\frac}(f^(x_)-f[x_,x_])$.

#include #include 

#include

#include

#include

#include

class

mclvector

mclvector(

int len,double initval=0.0

)

double

operator(int id) const

double& operator(int

id)

double length() const

mclvector

operator*(double val) const

mclvector

operator/(double val) const

mclvector

operator+(const mclvector &newvector) const

mclvector

operator-(const mclvector &newvector) const

mclvector

operator*=(double

val)

mclvector

operator/=(double

val)

mclvector

operator+=(const mclvector &newvector)

mclvector

operator-=(const mclvector &newvector)

mclvector gettranspose()

const

void print() const

};class

mclmatrix

mclmatrix(

int _row,int _col,double initval=0.0

)

void

setidentitymatrix()}}

mclmatrix gettranspose()

const

}return

ans;

}void print() const

mclvector& operator(int id) const

mclvector& operator(int

id)

mclmatrix

operator*(const mclmatrix &matrix) const}}

return

ans;

}mclmatrix

operator+(const mclmatrix &matrix) const

}return

ans;

}mclmatrix

operator-(const mclmatrix &matrix) const

}return

ans;

}mclvector getcol(

int colid) const

mclvector getrow(

int rowid) const

mclmatrix

operator*=(const mclmatrix &matrix)

mclmatrix

operator+=(const mclmatrix &matrix)

mclmatrix

operator-=(const mclmatrix &matrix)

mclmatrix

operator*(double x) const

}return

ans;

}};mclmatrix vectormulvector(

const mclvector &a,const mclvector&b)

}return

ans;

}else

return

ans;

}}int sgn(double

x)/*

* 高斯消去 a為n*n b為n*1**/

mclvector gauss(mclmatrix a,mclvector b)

}if(row!=i)

for(int j=1;j<=n;j++) if(i!=j)

}for(int i=1;i<=n;i++) ans[i]=b[i]/a[i][i];

return

ans;}/*

* n: 點個數[0,n]

rangesplitpos: 分界點 大小(n+1)

splitposvalue: 函式值 大小(n+1)

lvalue,rvalue: 兩側的一階導數

返回值: 每個區間的多項式 大小n**/

std::vector

cubicsplineinterpolation(

const

intn,

const std::vectorrangesplitpos,

const std::vectorsplitposvalue,

const

double

lvalue,

const

double

rvalue)

mclmatrix a=mclmatrix(n+1,n+1

);

for(int i=1;i<=n+1;i++)

mclvector b=mclvector(n+1

);

for(int i=1;i<=n+1;i++) b[i]=d[i-1

];

delete

mou;

delete

lamd;

delete

d; mclvector marr=gauss(a,b);

std::vector

lastans;

for(int j=0;j)

return

lastans;

}

三次樣條插值 c

include include include include using namespace std double zuigan double a,double b,double c,double f,int n 追趕法求線性方程組 for int i 0 ifor int i n 2 i 0 i...

三次樣條插值介紹

樣條插值是一種工業設計中常用的 得到平滑曲線的一種插值方法,三次樣條是其中用的較為廣泛的一種。樣條插值最初是用於函式擬合 對於平面上的離散點,進行函式擬合時,一種簡單粗暴的方法就是不光滑的直線來將離散的點相連,即我們通常所說的線性擬合。線性擬合會存在乙個問題,擬合出來的函式不夠 光滑 為了讓線條更加...

Python實現線性插值和三次樣條插值

關於python資料分析在數學建模中的更多相關應用 python資料分析在數學建模中的應用彙總 持續更新中!y sin x 資料準備 x np.arange np.pi,np.pi,1 定義樣本點x,從 pi到pi每次間隔1 y np.sin x 定義樣本點y,形成sin函式 new x np.ar...