📄 b.c
字号:
#include<stdio.h>
#include<math.h>
void tridag(double a[],double b[],double c[],double r[],double u[],int n)
{
int j;
const int nmax=100;
double gam[100];
double bet=b[1];
if(b[1]==0.0)
{
return;
}
u[1]=r[1]/bet;
for(j=2;j<=n;j++)
{
gam[j]=c[j-1]/bet;
bet=b[j]-a[j]*gam[j];
if(bet==0.0)
{
return;
}
u[j]=(r[j]-a[j]*u[j-1])/bet;
}
for(j=n-1;j>=1;j--)
{
u[j]=u[j]-gam[j+1]*u[j+1];
}
}
double b3(double x)
{
if(fabs(x)>=2)
return 0.0;
else if(fabs(x)<=1)
return fabs(x)*fabs(x)*fabs(x)/2.0-x*x+2.0/3.0;
else
return -fabs(x)*fabs(x)*fabs(x)/6.0+x*x-2*fabs(x)+4.0/3.0;
}
void BSpline(double x[],double y[],double h,int n,int k,double m,double y0,double yn)
{
int i;
double s=0;
double F[100];
double a[100];
double b[100];
double c1[100];
double F1[100];
double c[100];
if(k==2)
{
for(i=2;i<n-1;i++)
F[i]=6*y[i];
F[1]=6*y[1]-y[0]+h*h*y0/6.0;
F[n-1]=6*y[n-1]-y[n]+h*h*yn/6.0;
for(i=2;i<n;i++)
a[i]=1;
for(i=1;i<n-1;i++)
c1[i]=1;
for(i=1;i<n;i++)
b[i]=4;
tridag(a,b,c1,F,c,n-1);
c[0]=y[0]-(h*h/6.0)*y0;
c[n+2]=2*c[0]-c[1]+h*h*y0;
c[n]=y[n]-(h*h/6.0)*yn;
c[n+1]=2*c[n]-c[n-1]+h*h*yn;
}
else
{
for(i=1;i<n;i++)
F[i]=6*y[i];
F[0]=6*y[0]+2*h*y0;
F[n]=6*y[n]-2*h*yn;
for(i=2;i<=n;i++)
a[i]=1;
a[n+1]=2;
for(i=1;i<=n+1;i++)
b[i]=4;
for(i=2;i<=n;i++)
c1[i]=1;
c1[1]=2;
for(i=1;i<=n+1;i++)
F1[i]=F[i-1];
tridag(a,b,c1,F1,c,n-1);
c[n+2]=c[1]-2*h*y0;
c[n+1]=c[n-1]+2*h*yn;
}
s=c[6]*b3(m)+c[0]*b3(m-1)+c[1]*b3(m-2)+c[2]*b3(m-3)+c[3]*b3(m-4)+c[4]*b3(m-5)+c[5]*b3(m-6);
printf("%f\n",s);
}
main()
{
double m=3.0/2.0;
double x[]={1,2,3,4,5};
double y[]={2,4,8,4,2};
double c[100]={0};
BSpline(x,y,1,4,2,m,0,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -