三次樣條插值 c

2021-09-07 21:17:19 字數 1665 閱讀 9425

#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--)

return x;

}int main()

;double y=;

double s1=-1,s2=1; //

上下邊界導數值

double resx=1.5;

double resy=0.0;

double *h=null;

double *u=null;

double *v=null;

double *b=null;

double *d=null;

int n=0;

double *m=null;

n=sizeof(x)/sizeof(double);

h=(double*)malloc(sizeof(double)*(n-1));

for (int i=0;i1;i++)

u=(double*)malloc(sizeof(double)*(n-2));

v=(double*)malloc(sizeof(double)*(n-2));

for (int i=0;i2;i++)

u[n-2]=1;

d=(double*)malloc(sizeof(double)*n);

for (int i=1;i1;i++)

d[0]=6/h[0]*((y[1]-y[0])/h[0]-s1);

d[n-1]=6/h[n-2]*(s2-(y[n-1]-y[n-2])/h[n-2]);

b=(double*)malloc(sizeof(double)*n);

for (int i=0;i2;

}double tmp=0;

for (int i=n-2;i>0;i--)

v[0]=1;

m=(double*)malloc(sizeof(double)*n);

m=zuigan(u,b,v,d,n);

int j=0;

for (double k=x[0];k<=x[n-1];k+=0.1) //

求擬合值,步進為0.1

}

double r1=x[j+1]-resx;

double r2=resx-x[j];

resy=(pow(r1,3.0)/(6.0*h[j]))*m[j]+

(pow(r2,3.0)/(6.0*h[j]))*m[j+1]+

(y[j]-m[j]*h[j]*h[j]/6.0)*(r1/h[j])+

(y[j+1]-m[j+1]*h[j]*h[j]/6.0)*(r2/h[j]);

cout<"

pause

");return

0;}

最初求得結果和matlab結果不一樣,後來發現matlab中spline函式沒有使用邊界導數這個條件,而這個程式中使用了邊界導數s1,s2,所以和spline函式直接求結果會有出入。

三次樣條插值

條件 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 上的線性函式,所以設 ...

三次樣條插值介紹

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

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