📄 1.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int n,i;
double *x,*y,*u,*v,*d,f0,fn,a,*M,*b;
printf("输入节点个数n:");
scanf("%d",&n);
x=(double *)malloc(n*sizeof(double));
y=(double *)malloc(n*sizeof(double));
d=(double *)malloc(n*sizeof(double));
u=(double *)malloc(n*sizeof(double));
v=(double *)malloc(n*sizeof(double));
b=(double *)malloc((n-1)*sizeof(double));
M=(double *)malloc(n*sizeof(double));//根据节点数分配内存
printf("依次输入节点 x[i] y[i]:");
for(i=0;i<n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(i=1;i<n-1;i++)
{
u[i]=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
v[i]=1-u[i];
d[i]=6*((y[i+1]-y[i])/(x[i+1]-x[i])-(y[i]-y[i-1])/(x[i]-x[i-1]))/(x[i+1]-x[i-1]);
}//求三弯矩方程
printf("输入边界条件及其类型(1/2) ");
scanf("%lf%lf%d",&f0,&fn,&i);
if(i==1)
{
d[0]=6*((y[1]-y[0])/(x[1]-x[0])-f0)/(x[1]-x[0]);
d[n-1]=6*(fn-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]))/(x[n-1]-x[n-2]);
u[n-1]=1;
v[0]=1;
}
if(i==2)
{
d[0]=2*f0;
d[n-1]=2*fn;
u[n-1]=0;
v[0]=0;
}//处理边界条件
b[0]=v[0]/2;
for(i=1;i<n-1;i++)
b[i]=v[i]/(2-u[i]*b[i-1]);
v[0]=d[0]/2;
for(i=1;i<n;i++)
v[i]=(d[i]-u[i]*v[i-1])/(2-u[i]*b[i-1]);
M[n-1]=v[n-1];
for(i=n-2;i>=0;i--)
M[i]=v[i]-b[i]*M[i+1];//追赶法解方程组
for(i=0;i<n;i++)
printf("%lf ",M[i]);//输出M[i]
printf("\n三次样条函数S(x) (^表示三次方)");
for(i=0;i<n-1;i++)
{
f0=(6*(x[i+1]-x[i]));
fn=(y[i]/(x[i+1]-x[i])-M[i]*(x[i+1]-x[i])/6);
a=(y[i+1]/(x[i+1]-x[i])-M[i+1]*(x[i+1]-x[i])/6);
printf("\n在区间[%0.2lf %0.2lf]上\nS(x)=",x[i],x[i+1]);
printf("%lf(%0.2lf-x)^",M[i]/f0,x[i+1]);
if(M[i+1]/f0>=0) printf("+");
printf("%lf(x-%0.2lf)^",M[i+1]/f0,x[i]);
if(fn>=0) printf("+");
printf("%lf(%0.2lf-x)",fn,x[i+1]);
if(a>=0) printf("+");
printf("%lf(x-%0.2lf)",a,x[i]);
}//输出函数表达式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -