條件
(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...