一维的热传导方程向前差分法

热传导方程

    • 一维问题
      • 问题背景
      • 问题抽象
      • 离散方法
        • 1 向前差分
          • 迭代格式
          • 初值设定
          • 取参数
          • C语言实现
          • fortran实现
          • 画图

hexo博客为啥用不了了,将就着先用这个博客吧

一维问题

问题背景

摘抄自网络 :在距离为L的两个半无限长壁面之间有传热的流体。假设整个流场初始时刻具有温度T=T1(常数,本题中取10摄氏度),并处于平衡状态(即:初始时刻壁面和流体的温度都为10摄氏度)。两个壁面的初始温度Tw1=Tw2=T1(本题中即为10摄氏度)。现假设在t=0时刻,右边的壁面温度突然增加到Tw2=T2并保持在T2(本题中取T2为20摄氏度),而左边的壁面温度保持在Tw1=T1(即10摄氏度)。求时间t1、t2和时间趋于无穷时壁面间流体温度的分布?

问题抽象

u t = α ⋅ ∂ 2 u ∂ x 2 初 值 : u ( x , 0 ) = u 0 ( x ) 边 值 : u ( 0 , t ) = μ 0 ( t ) , u ( l , t ) = μ 1 ( t ) u_t=\alpha\cdot \frac{\partial^2u}{\partial x^2} \\ 初值:u(x,0)=u_0(x)\\ 边值:u(0,t)=\mu_0(t),u(l,t)=\mu_1(t) ut=αx22uu(x,0)=u0(x)u(0,t)=μ0(t),u(l,t)=μ1(t)

离散方法

1 向前差分

u ( x i , t + Δ t ) − u ( x i , t ) Δ t = α ⋅ u ( x i + 1 , t ) − 2 u ( x i , t ) + u ( x i − 1 , t ) Δ x 2 \frac{u(x_i,t+\Delta t)-u(x_i,t)}{\Delta t}=\alpha\cdot\frac{u(x_{i+1},t)-2u(x_{i},t)+u(x_{i-1},t)}{\Delta x^2} Δtu(xi,t+Δt)u(xi,t)=αΔx2u(xi+1,t)2u(xi,t)+u(xi1,t)

迭代格式

u ( x i , t + Δ t ) = r u ( x i + 1 , t ) + ( 1 − 2 r ) u ( x i , t ) + u ( x i − 1 , t ) u(x_i,t+\Delta t)=ru(x_{i+1},t)+(1-2r)u(x_i,t)+u(x_{i-1},t) u(xi,t+Δt)=ru(xi+1,t)+(12r)u(xi,t)+u(xi1,t)
其中 r = a Δ t ( Δ x ) 2 r=\frac{a\Delta t}{(\Delta x)^2} r=(Δx)2aΔt

初值设定

T 1 = 10 T 2 = 20 L = 0.2 m t = 10 s T_1=10\\ T_2=20\\ L=0.2m\\ t=10s T1=10T2=20L=0.2mt=10s

取参数

d x = 0.01 d t = 0.001 dx=0.01\\ dt=0.001 dx=0.01dt=0.001

C语言实现
#include 
#include 
#include
int main()
{
     
    float dx,dt,t,L=0.2,a[100000],b[100000],alpha=1.42857*10e-3;
    /*dx表示delta(x),dt表示delta(t),alpha为热扩散率。由于数组大小随输入值而变化,所以取得比较大*/
    int i,n1,n2,n=0,total=1;
    FILE *F;//文件指针
    F=fopen("data.txt","w");
    dx=0.01;
    dt=0.001;
    t=10;
    n1=(int)(L/dx);
    n2=(int)(t/dt);
  //printf("n1=%d  n2=%d\n",n1,n2);
    for(i=0;i<n1;i++){
          /*初始赋值*/
        if(i<n1-1){
     
            a[i]=10;
        }
        else a[i]=20;
    fprintf(F,"%8.4f",a[i]);//写入t=0时刻的温度
    }
    fprintf(F,"\n");    //换行
    while(n<n2){
         /*时间到了,停止循环*/
        for(i=0;i<n1;i++){
     
        /*计算*/
        if(i==0){
     
            b[i]=10;
            a[i]=b[i];
        }     /*表示左壁面的温度始终保持在10摄氏度*/
        else if(i==n1-1){
     
            b[i]=20;
            a[i]=b[i];
        }     /*表示右壁面的温度始终保持在20摄氏度*/
        else{
     
            b[i]=a[i]+alpha*dt*(a[i+1]-2*a[i]+a[i-1])/(dx*dx);   /*差分方程的表达式*/
            a[i]=b[i];
        }
        n++;
        fprintf(F,"%8.4f",a[i]);
        //printf("%8.4f",a[i]);
        if(total%n1==0){
                  /*输出data文件*/
            //printf("\n");
            fprintf(F,"\n");
        }
            total++;
        }
    }
    fclose(F);
    return 0;
}

输出结果为data.txt

fortran实现
program f1
implicit none
    integer::i,n1,n2,n,total,coun
    real::a(100000),b(100000)
    real::dx,dt,t,L,alpha
    open(unit=1,file='data-f.txt')  !打开文件
    n=1
    total=0
    dx=0.01
    dt=0.001
    t=10 !时间
    L=0.2   !长度
    alpha=1.42857*10e-3
    n1=int(L/dx)
    n2=int(t/dt)
    do coun=1,n1        !类似于C语言的for循环
        if (coun

数据储存在文件data-f.txt中

画图

想画随时间变化的动图,不知道怎么画

你可能感兴趣的:(计算数学,算法)