该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
求问大佬,为啥我这在运行过程中不能输入kk值?
以下是源代码,环境:devC++。
#include
#include
#include
#define PI 3.1415926
int main()
{
int i, j, m, kk=0;
double h = 1.0 / 32; //空间步长
int H = 32 + 1; //空间节点总数
double tao; //时间步长
double Te = 3.45; //时间总值
double t; //t=tao*时间层
//不同网格比 lamda=tao/h
double lamda;
printf("请输入你所选择的网格比:");
scanf("%ld\n",&lamda);
//lamda = 0.8;
//lamda=1.2;
tao = lamda * h;
//时间步长增加次数与网格比有关 T=Te/tao=te/(lamda*h)
int T; //时间步长增加次数
if(lamda==0.8)
{
T=138; //lamda=0.8
}
else if(lamda==1.2)
{
T=92; //lamda=1.2
}
//k=1 2 3 4 5
printf("请输入你所选择的k值(k=1、2、3、4、5):");
scanf("%d\n",&kk);
//动态分配内存并进行初始化,初值均为0
double *u = (double *)calloc((T+1)*H,sizeof(double));
//应用初始位移条件求第0层时间的所有位移 t=n*tao
for (j = 0; j < H; j++)
{
u[j] = 0.0; //本题的fi=0
}
//应用初始速度求第1层时间的所有位移 //以下使用一种
//为了保证精度,此处使用二阶精度的中心差分来计算u|j|1 //u|下标|上标 x=jh
for(j=1;j
{
u[H+j]=0.5*(lamda*lamda*u[j+1]+2*(1-lamda*lamda)*u[j]+lamda*lamda*u[j-1]+2*tao*sin((2*kk+1)*PI*j*h));
//本题ffi= sin((2*k+1)*pi*x)
}
//如果不追求精度,可使用一阶精度的向前差分计算 u|j|1
/*for (j = 1; j < H - 1; j++)
{
u[H + j] = tao * sin((2 * k + 1) * PI * j * h) + u[j];
}*/
//应用左、右边界条件求边界点位移
for (i = 1; i <= T; i++)
{
u[i * H] = 0.0; //左边界
u[(i + 1) * H - 1] = 0.0;//右边界
}
//三阶显式差分格式 计算范围改一下
for (i = 2; i <= T; i++) //时间
{
for (j = 1; j < H; j++) //空间
{
u[(i) * H + j] = 2 * u[(i-1) * H + j] - u[(i - 2) * H + j] + lamda * lamda * (u[(i-1) * H + j + 1] - 2 * u[(i-1) * H + j] + u[(i-1) * H + j - 1]);
//printf("*****%lf \n", u[(i + 1) * H + j]);
}
//printf("++++++++++++++++++\n");
}
//printf("done!");
//输出指定时间数值解
for(i=0;i<=T;i++)
{
t = i * tao;
printf("t=%f s,各节点的数值解为:\n", t);
for(j=0;j
{
printf("%lf , \n",u[i*H+j]);
}
printf("\n");
}
//解析解
//double u_AnalyticalSolution[H];
double *u_AnalyticalSolution = (double *)calloc(H,sizeof(double));
printf("**********************************************************************\n");
printf("以下是t=3.45s时解析解的计算结果");
for(i=0;i
{
u_AnalyticalSolution[i]=((cos((2*kk+1)*PI*(i*h-Te)))-(cos((2*kk+1)*PI*(i*h+Te))))/(2*(2*kk+1)*PI);
printf("%lf \n",u_AnalyticalSolution[i]);
}
}