三次样条插值函数c语言 三次样条函数插值法

用c语言将x∈[0,2π]区间几等分,试用三次样条插值法方式求x=1.4时y=sinx的值并与y=sin(1.4)作比较

#include stdio.h

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、成都网站建设、和静网络推广、成都小程序开发、和静网络营销、和静企业策划、和静品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供和静建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

#include math.h

double fun(double x,double x0,double x1,double x2,double y0,double y1,double y2)

{

double yx=0;

yx=y0*(x-x1)*(x-x2)/((x0-x1)*(x0-x2))+

y1*(x-x0)*(x-x2)/((x1-x0)*(x1-x2))+

y2*(x-x0)*(x-x1)/((x2-x0)*(x2-x1));//3点插值公式

return yx;

}

int main(int argc, char *argv[])

{

double x,x0,x1,x2,y0,y1,y2;

printf("输入待求值x:\n");

scanf("%lf",x);

x0=x-0.1;x1=x+0.1;x2=x+0.15;//需要输入3个插值点,即对应的x值和函数y值,这里简单计算的可以手动输入

y0=sin(x0);y1=sin(x1);y2=sin(x2);

printf("sin(%lf)=%lf-------fun(%lf)=%lf\n",x,sin(x),x,fun(x,x0,x1,x2,y0,y1,y2));

return 0;

}

三次样条插值C语言

我记得大三学的计算方法课上有,课后作业实现了的。不过在实验室那个电脑上,如果你有条件的话先参考《数值分析》书上吧。

至于c语言和c++的区别,这个程序应该没什么区别,反正都拿数组做。

求助:求三次样条插值函数的C++程序

#includeiostream

#includeiomanip

using

namespace

std;

const

int

MAX

=

50;

float

x[MAX],

y[MAX],

h[MAX];

float

c[MAX],

a[MAX],

fxym[MAX];

float

f(int

x1,

int

x2,

int

x3){

float

a

=

(y[x3]

-

y[x2])

/

(x[x3]

-

x[x2]);

float

b

=

(y[x2]

-

y[x1])

/

(x[x2]

-

x[x1]);

return

(a

-

b)/(x[x3]

-

x[x1]);

}

//求差分

void

cal_m(int

n){

//用追赶法求解出弯矩向量M……

float

B[MAX];

B[0]

=

c[0]

/

2;

for(int

i

=

1;

i

n;

i++)

B[i]

=

c[i]

/

(2

-

a[i]*B[i-1]);

fxym[0]

=

fxym[0]

/

2;

for(i

=

1;

i

=

n;

i++)

fxym[i]

=

(fxym[i]

-

a[i]*fxym[i-1])

/

(2

-

a[i]*B[i-1]);

for(i

=

n-1;

i

=

0;

i--)

fxym[i]

=

fxym[i]

-

B[i]*fxym[i+1];

}

void

printout(int

n);

int

main(){

int

n,i;

char

ch;

do{

cout"Please

put

in

the

number

of

the

dots:";

cinn;

for(i

=

0;

i

=

n;

i++){

cout"Please

put

in

X"i':';

cinx[i];

//coutendl;

cout"Please

put

in

Y"i':';

ciny[i];

//coutendl;

}

for(i

=

0;

i

n;

i++)

//求

步长

h[i]

=

x[i+1]

-

x[i];

cout"Please

输入边界条件\n

1:

已知两端的一阶导数\n

2:两端的二阶导数已知\n

默认:自然边界条件\n";

int

t;

float

f0,

f1;

cint;

switch(t){

case

1:cout"Please

put

in

Y0\'

Y"n"\'\n";

cinf0f1;

c[0]

=

1;

a[n]

=

1;

fxym[0]

=

6*((y[1]

-

y[0])

/

(x[1]

-

x[0])

-

f0)

/

h[0];

fxym[n]

=

6*(f1

-

(y[n]

-

y[n-1])

/

(x[n]

-

x[n-1]))

/

h[n-1];

break;

case

2:cout"Please

put

in

Y0\"

Y"n"\"\n";

cinf0f1;

c[0]

=

a[n]

=

0;

fxym[0]

=

2*f0;

fxym[n]

=

2*f1;

break;

default:cout"不可用\n";//待定

};//switch

for(i

=

1;

i

n;

i++)

fxym[i]

=

6

*

f(i-1,

i,

i+1);

for(i

=

1;

i

n;

i++){

a[i]

=

h[i-1]

/

(h[i]

+

h[i-1]);

c[i]

=

1

-

a[i];

}

a[n]

=

h[n-1]

/

(h[n-1]

+

h[n]);

cal_m(n);

cout"\n输出三次样条插值函数:\n";

printout(n);

cout"Do

you

to

have

anther

try

?

y/n

:";

cinch;

}while(ch

==

'y'

||

ch

==

'Y');

return

0;

}

void

printout(int

n){

coutsetprecision(6);

for(int

i

=

0;

i

n;

i++){

couti+1":

["x[i]"

,

"x[i+1]"]\n""\t";

/*

coutfxym[i]/(6*h[i])"

*

("x[i+1]"

-

x)^3

+

""

*

(x

-

"x[i]")^3

+

"

(y[i]

-

fxym[i]*h[i]*h[i]/6)/h[i]"

*

("x[i+1]"

-

x)

+

"

(y[i+1]

-

fxym[i+1]*h[i]*h[i]/6)/h[i]"(x

-

"x[i]")\n";

coutendl;*/

float

t

=

fxym[i]/(6*h[i]);

if(t

0)coutt"*("x[i+1]"

-

x)^3";

else

cout-t"*(x

-

"x[i+1]")^3";

t

=

fxym[i+1]/(6*h[i]);

if(t

0)cout"

+

"t"*(x

-

"x[i]")^3";

else

cout"

-

"-t"*(x

-

"x[i]")^3";

cout"\n\t";

t

=

(y[i]

-

fxym[i]*h[i]*h[i]/6)/h[i];

if(t

0)cout"+

"t"*("x[i+1]"

-

x)";

else

cout"-

"-t"*("x[i+1]"

-

x)";

t

=

(y[i+1]

-

fxym[i+1]*h[i]*h[i]/6)/h[i];

if(t

0)cout"

+

"t"*(x

-

"x[i]")";

else

cout"

-

"-t"*(x

-

"x[i]")";

coutendlendl;

}

coutendl;

}

三次样条插值用c语言具体怎么做

void SPL(int n, double *x, double *y, int ni, double *xi, double *yi); 是你所要。

已知 n 个点 x,y; x 必须已按顺序排好。要插值 ni 点,横坐标 xi[], 输出 yi[]。

程序里用double 型,保证计算精度。

SPL调用现成的程序。

现成的程序很多。端点处理方法不同,结果会有不同。想同matlab比较,你需 尝试 调用 spline()函数 时,令 end1 为 1, 设 slope1 的值,令 end2 为 1 设 slope2 的值。


分享文章:三次样条插值函数c语言 三次样条函数插值法
分享网址:http://myzitong.com/article/doiciid.html