c语言双向插值函数 c语言双向值传递

求c语言写的双三次插值函数

void

成都创新互联公司主营峰峰矿网站建设的网络公司,主营网站建设方案,成都app开发,峰峰矿h5小程序定制开发搭建,峰峰矿网站营销推广欢迎峰峰矿等地区企业咨询

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

的值。

#include

stdio.h

#include

math.h

int

spline

(int

n,

int

end1,

int

end2,

double

slope1,

double

slope2,

double

x[],

double

y[],

double

b[],

double

c[],

double

d[],

int

*iflag)

{

int

nm1,

ib,

i,

ascend;

double

t;

nm1

=

n

-

1;

*iflag

=

0;

if

(n

2)

{

/*

no

possible

interpolation

*/

*iflag

=

1;

goto

LeaveSpline;

}

ascend

=

1;

for

(i

=

1;

i

n;

++i)

if

(x[i]

=

x[i-1])

ascend

=

0;

if

(!ascend)

{

*iflag

=

2;

goto

LeaveSpline;

}

if

(n

=

3)

{

d[0]

=

x[1]

-

x[0];

c[1]

=

(y[1]

-

y[0])

/

d[0];

for

(i

=

1;

i

nm1;

++i)

{

d[i]

=

x[i+1]

-

x[i];

b[i]

=

2.0

*

(d[i-1]

+

d[i]);

c[i+1]

=

(y[i+1]

-

y[i])

/

d[i];

c[i]

=

c[i+1]

-

c[i];

}

/*

----

Default

End

conditions

*/

b[0]

=

-d[0];

b[nm1]

=

-d[n-2];

c[0]

=

0.0;

c[nm1]

=

0.0;

if

(n

!=

3)

{

c[0]

=

c[2]

/

(x[3]

-

x[1])

-

c[1]

/

(x[2]

-

x[0]);

c[nm1]

=

c[n-2]

/

(x[nm1]

-

x[n-3])

-

c[n-3]

/

(x[n-2]

-

x[n-4]);

c[0]

=

c[0]

*

d[0]

*

d[0]

/

(x[3]

-

x[0]);

c[nm1]

=

-c[nm1]

*

d[n-2]

*

d[n-2]

/

(x[nm1]

-

x[n-4]);

}

/*

Alternative

end

conditions

--

known

slopes

*/

if

(end1

==

1)

{

b[0]

=

2.0

*

(x[1]

-

x[0]);

c[0]

=

(y[1]

-

y[0])

/

(x[1]

-

x[0])

-

slope1;

}

if

(end2

==

1)

{

b[nm1]

=

2.0

*

(x[nm1]

-

x[n-2]);

c[nm1]

=

slope2

-

(y[nm1]

-

y[n-2])

/

(x[nm1]

-

x[n-2]);

}

/*

Forward

elimination

*/

for

(i

=

1;

i

n;

++i)

{

t

=

d[i-1]

/

b[i-1];

b[i]

=

b[i]

-

t

*

d[i-1];

c[i]

=

c[i]

-

t

*

c[i-1];

}

/*

Back

substitution

*/

c[nm1]

=

c[nm1]

/

b[nm1];

for

(ib

=

0;

ib

nm1;

++ib)

{

i

=

n

-

ib

-

2;

c[i]

=

(c[i]

-

d[i]

*

c[i+1])

/

b[i];

}

b[nm1]

=

(y[nm1]

-

y[n-2])

/

d[n-2]

+

d[n-2]

*

(c[n-2]

+

2.0

*

c[nm1]);

for

(i

=

0;

i

nm1;

++i)

{

b[i]

=

(y[i+1]

-

y[i])

/

d[i]

-

d[i]

*

(c[i+1]

+

2.0

*

c[i]);

d[i]

=

(c[i+1]

-

c[i])

/

d[i];

c[i]

=

3.0

*

c[i];

}

c[nm1]

=

3.0

*

c[nm1];

d[nm1]

=

d[n-2];

}

else

{

b[0]

=

(y[1]

-

y[0])

/

(x[1]

-

x[0]);

c[0]

=

0.0;

d[0]

=

0.0;

b[1]

=

b[0];

c[1]

=

0.0;

d[1]

=

0.0;

}

LeaveSpline:

return

0;

}

double

seval

(int

n,

double

u,

double

x[],

double

y[],

double

b[],

double

c[],

double

d[],

int

*last)

{

int

i,

j,

k;

double

w;

i

=

*last;

if

(i

=

n-1)

i

=

0;

if

(i

0)

i

=

0;

if

((x[i]

u)

||

(x[i+1]

u))

{

i

=

0;

j

=

n;

do

{

k

=

(i

+

j)

/

2;

if

(u

x[k])

j

=

k;

if

(u

=

x[k])

i

=

k;

}

while

(j

i+1);

}

*last

=

i;

w

=

u

-

x[i];

w

=

y[i]

+

w

*

(b[i]

+

w

*

(c[i]

+

w

*

d[i]));

return

(w);

}

void

SPL(int

n,

double

*x,

double

*y,

int

ni,

double

*xi,

double

*yi)

{

double

*b,

*c,

*d;

int

iflag,last,i;

b

=

(double

*)

malloc(sizeof(double)

*

n);

c

=

(double

*)malloc(sizeof(double)

*

n);

d

=

(double

*)malloc(sizeof(double)

*

n);

if

(!d)

{

printf("no

enough

memory

for

b,c,d\n");}

else

{

spline

(n,0,0,0,0,x,y,b,c,d,iflag);

if

(iflag==0)

printf("I

got

coef

b,c,d

now\n");

else

printf("x

not

in

order

or

other

error\n");

for

(i=0;ini;i++)

yi[i]

=

seval(ni,xi[i],x,y,b,c,d,last);

free(b);free(c);free(d);

};

}

main(){

double

x[6]={0.,1.,2.,3.,4.,5};

double

y[6]={0.,0.5,2.0,1.6,0.5,0.0};

double

u[8]={0.5,1,1.5,2,2.5,3,3.5,4};

double

s[8];

int

i;

SPL(6,

x,y,

8,

u,

s);

for

(i=0;i8;i++)

printf("%lf

%lf

\n",u[i],s[i]);

return

0;

}

求双线性插值法的C语言程序!帮帮忙!拜托各位了!

a   b

t

c   d

就是两次线性插值,先在x方向插出t上下方的_t1、_t2,然后再用它们插出t来

float test(float x,float y)

{

float _t1,_t2,t;

_t1 = a+(b-a)*(x-ax)/(bx-ax);

_t2 = c+(d-c)*(x-cx)/(dx-cx);

t = _t1 +(_t2-_t1)*(y - ay);

return t;

}

两元lagrange插值如何用C语言表示

//Lagrange插值多项式

//算法描述:

// 1、输入:插值节点控制数n,插值点序列(x_i,y_i),i=0,1,...n,要计算的函数点x。

// 2、for(i=0,1,2,...,n)

// {

// temp=1;

// for(j=0,1,...i,i+1,...n)

// !x要事先给定

// temp=temp*(x-x_j)/(x_i-x_j);

// }

// fx=fx+temp*y_i;

// }

#includestdio.h

#includestring.h

#define MAX_n 20

typedef struct tagPOINT

{

double x;

double y;

}POINT;

double Lagrange()

{

int n,i,j;

double x,temp,fx=0;

POINT points[MAX_n];

printf("Now,please input the n value: \n");

scanf("%d",n);

if(n=1||nMAX_n)

{

printf("The value of n should be between 2 and %d\n",MAX_n);

return 1;

}

printf("Now,please input the (x_i,y_i),i=0,...,%d\n",n-1);

for(i=0;in;i++)

scanf("%lf%lf",points[i].x,points[i].y);

printf("Now,please input the x value:\n");

scanf("%lf",x);

for(i=0;in;i++)

{

temp=1;

for(j=0;jn;j++)

if(i==j)continue;

else temp=temp*(x-points[j].x)/(points[i].x-points[j].x);

fx=fx+temp*points[i].y;

}

printf("So,when x=%lf,the Lagrange(%lf)=%lf\n",x,x,fx);

}

int main()

{

char s[10];

Lagrange();

gets(s);

while(strcmp(s,"exit"))

{

if(strcmp(s,"con")==0)

{

Lagrange();

getchar();

}

printf("继续(输入con),退出(输入exit)!\n");

gets(s);

}

return 0;

}


文章名称:c语言双向插值函数 c语言双向值传递
文章起源:http://scjbc.cn/article/ddghgih.html

其他资讯