重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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;
}
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插值多项式
//算法描述:
// 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;
}