📄 fluxionary.cpp
字号:
/*********************************************************************
*本程序功能为计算一阶双曲型偏微分方程的初值问题:
*分别采用3种格式计算:1。迎风格式 2。Lax-Friedrichs格式 3。Lax-Wendroff格式
*每种格式的时间 T又分为: T=0.5 和 T=1
*程序在Dev-C++ 4.9.8.0下编译成功
*本程序在windows xp pro 下运行成功
**********************************************************************/
#include "stdio.h"
void init_step(void);
void ans_display(void);
void compute(int flag);
double a=1;
double h=0.1;
double lambda=0.5,tau,T,N,J;
double xj[400],u0j[400],u1j[400];
int j,n;
int main()
{
tau=lambda*h;
J=1.0/h+1;
printf("=============================当计算到T=0.5时,计算的结果=====================\n");
T=0.5;
N=T/tau;
printf("下面的是迎风格式解法的结果:\n");
compute(1);
printf("下面的是Lax-Friedrichs格式解法的结果:\n");
compute(2);
printf("下面的是Lax-Wendroff格式解法的结果:\n");
compute(3);
tau=lambda*h;
/*
printf("=============================当计算到T=1时,计算的结果=======================\n");
T=1;
N=T/tau;
printf("下面的是迎风格式解法的结果:\n");
compute(1);
printf("下面的是Lax-Friedrichs格式解法的结果:\n");
compute(2);
printf("下面的是Lax-Wendroff格式解法的结果:\n");
compute(3); */
getchar();
}
void init_step(void)
{
for(j=1;j<(int)(J+N+1);j++)
{
xj[j]=(-1)*(j-1)*h+1.0;
if (xj[j]<=0)
u0j[j]=1;
else
u0j[j]=2;
}
}
void ans_display(void)
{
for(j=(int)J;j>=1;j--)
printf("%lf,\t%lf\n",xj[j],u1j[j]);
}
void compute(int flag)
{
init_step();
for(n=1;n<(int)(N);n++)
{
for(j=1;j<(int)(J+1+N-n);j++)
if(flag==1)
u1j[j]=u0j[j]-lambda*0.5*(a+a)*(u0j[j]-u0j[j-1]);
else if(flag==2)
u1j[j]=0.5*(1-a*lambda)*u0j[j+1]+0.5*(1+a*lambda)*u0j[j-1];
else
u1j[j]=u0j[j]-0.5*a*lambda*(u0j[j+1]-u0j[j-1])+0.5*a*lambda*a*lambda*(u0j[j+1]-2*u0j[j]+u0j[j-1]);
for(j=1;j<(int)(J+1+N-n);j++)
u0j[j]=u1j[j];
}
ans_display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -