1D热传导方程的FDM-齐次边界和右端项

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 28 08:07:25 2020

@author: Mr.
"""
""" 

函数形如       狄利克雷条件
                Ut=a**2*Uxx  (0<x<l, t>0)  
                
                U(0,t)=0       t>0
                U(l,t)=0       t>0
                U(x,0)=φ(x)    0<x<l

例子:
                Ut=a**2*Uxx  (0<x<pi, t>0)  
                
                U(0,t)=0       t>0
                U(l,t)=0       t>0
                U(x,0)=100    0<x<pi

"""
import numpy as np
import matplotlib.pyplot as plt
from  matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
#from scipy.integrate import quad #,dblquad,nquad
from sympy import symbols,integrate
import seaborn as sns
#from CAL.PyCAL import *
#font.set_size(20)https://wenku.baidu.com/view/e645feafc9d376eeaeaad1f34693daef5ef71393.html   分离变量法求解
'''a=1
l=np.pi
def g(x1):
    f=100
    return f
def Fenli_f(x,t):
    s=0
    for i in range(1,100):#np.inf
        x1=symbols('x1')
        f=x1#g(x1)*np.sin((i*x1*np.pi)/l)
        A=integrate(f,(x1,0,l))
        
        s=s+A*(np.sin(i*np.pi*x/l)*np.exp(-((i*a*np.pi)/l)**2*t))
        print(s)
    #s=np.sin(x*t)
    return s
x=np.linspace(0,np.pi,10)
t=np.linspace(0,1,5)
x1,t1=np.meshgrid(x,t)
z=Fenli_f(x1,t1)
fig1=plt.figure()
ax1=Axes3D(fig1)

ax1.plot_surface(x1,t1,z,rstride=1,cstride=1,cmap='rainbow',alpha=0.9)   #绘面
ax1.set_xlabel('x')
ax1.set_ylabel('t')
ax1.set_zlabel('U')
ax1.set_title('Frnli variability method')
ax1.set_xlim(0,np.pi)
ax1.set_ylim(0,1)
ax1.set_zlim(0,100)
'''

#%%

def E_f(x,t):
    B=150
    k=0.02
    f=np.exp(-(x-0.4)**2/(4*k*t+1/B))/(np.sqrt(4*B*k*t+1))
    return f

def Main_f(x,T,N,m,InitialCondition,Boundary_left,Boundary_right):
    
    n=N
    x1=np.linspace(0,1,50)
    y1=InitialCondition(x1)#map(InitialCondition,x)
    plt.figure(figsize=(10,6))
    plt.plot(x1,y1)
    plt.xlabel('$x$',fontsize=15)
    plt.ylabel('$f(x)$',fontsize=15)
    plt.title('1DHeat Equation Initial Condition')
    print(x)
    x=x
    t=T
    h=(max(x)-min(x))/n  #  步长 x轴方向
    k=(max(t)-min(t))/m # 时间步长

    kappa=0.02      #1
    rho=kappa*k/h/h
    print('rho')
    '''
    显式格式不能任意取时间和空间的网格点数,即M与N不能随意取值。
    我们称显式格式为条件稳定。特别地,需       要满足所谓CFL条件(Courant–Friedrichs–Lewy):
    '''
    if(rho<=0.5):
        print('显示格式此时满足条件稳定:')
    print('rh0=%f' % (rho))
    U=np.zeros((n+1,m+1)) #
    #print(U)
    
    for i in range(1,n):  #表示列数     初值条件的赋值
        U[i][0]=InitialCondition(x[i])
    for j in range(0,m+1):   #表示 行数   边值条件的赋值 
        U[0][j]=Boundary_left(t[j])
        U[n][j]=Boundary_right(t[j])
    #print('初始化的U:')
    #print(U)

    for j in range(0,m):#  (1,  3)
        for i in range(1,n):  # (0,  5)
            U[i][j+1]=rho*U[i+1][j]+(1-2*rho)*U[i][j]+rho*U[i-1][j]
    
#%%    
    plt.figure(figsize=(10,6))
    plt.plot(x, U.T[0,:])
    plt.plot(x, U.T[int(0.10/ k),:])
    plt.plot(x, U.T[int(0.15/ k),:])
    plt.plot(x, U.T[int(0.20/ k),:])
    plt.xlabel('$x$', fontsize = 15)
    plt.ylabel(r'$U(dot, tau)$', fontsize = 15)
    plt.title(u'1D Heat equation', fontsize = 15)
    plt.legend([r'$t = 0.$', r'$t = 0.10$', r'$t = 0.15$', r'$t = 0.20$'], fontsize = 15)
#%%       
    fig=plt.figure(figsize=(10,6))
    ax=Axes3D(fig)
    x1,y1=np.meshgrid(t,x)
    surf=ax.plot_surface(x1,y1,U,rstride=1,cstride=1,cmap=cm.coolwarm,alpha=0.9)   #绘面'rainbow'
    ax.set_xlabel('t')
    ax.set_ylabel('x')
    ax.set_zlabel('U')
    ax.set_xticks([0,0.05,0.1,0.15,0.2])
    ax.set_yticks([0,0.2,0.4,0.6,0.8,1])
    #ax.set_zticks([0,0.2,0.4,0.6,0.8,1])
    ax.set_title('Hot equation$ u_t=A u_{xx} $')     
    ax.grid(False)
    
    cbar=plt.colorbar(surf,shrink=0.5,aspect=5)
    plt.show()
#%%
    fig1=plt.figure(figsize=(10,6))
    #ax1=Axes3D(fig1)
    ax1=fig1.add_subplot(1,1,1,projection='3d')
    x1,y1=np.meshgrid(x,t)
    surf1=ax1.plot_surface(x1,y1,U.T,cmap=cm.coolwarm)   #绘面'rainbow' rstride=1,cstride=1,cmap=cm.coolwarm,alpha=0.9
    
    ax1.set_xlabel('x',fontdict={"size":16})
    ax1.set_ylabel('t',fontdict={"size":16})
    ax1.set_zlabel('U',fontdict={"size":16})
    ax1.set_xticks([0,0.2,0.4,0.6,0.8,1])
    #ax1.set_yticks([0,0.05,0.1,0.15,0.2])
    ax1.set_yticks([0,0.2,0.4,0.6,0.8,1])
    #ax1.set_zticks([0,0.2,0.4,0.6,0.8,1])
    ax1.set_title('Numeri Hot equation$ u_t=A u_{xx} ,$')     
    ax1.grid(False)
    cbar=fig1.colorbar(surf1,shrink=0.75,aspect=5)
    plt.show()
#%%    
    fig2=plt.figure(figsize=(10,6))
    #ax1=Axes3D(fig1)
    ax2=fig2.add_subplot(1,1,1,projection='3d')
    x2,y2=np.meshgrid(x,t)
    surf2=ax2.plot_surface(x2,y2,E_f(x2,y2),cmap=cm.coolwarm)   #绘面'rainbow' rstride=1,cstride=1,cmap=cm.coolwarm,alpha=0.9
    
    ax2.set_xlabel('x',fontdict={"size":16})
    ax2.set_ylabel('t',fontdict={"size":16})
    ax2.set_zlabel('U',fontdict={"size":16})
    ax2.set_xticks([0,0.2,0.4,0.6,0.8,1])
    #ax2.set_yticks([0,0.05,0.1,0.15,0.2])
    ax2.set_yticks([0,0.2,0.4,0.6,0.8,1])
    #ax2.set_zticks([0,0.2,0.4,0.6,0.8,1])
    ax2.set_title('Real Hot equation$ u_t=A u_{xx} ,$')     
    ax2.grid(False)
    cbar=fig2.colorbar(surf2,shrink=0.75,aspect=5)
    plt.show()
#%%    
    fig3=plt.figure(figsize=(10,6))
    #ax1=Axes3D(fig1)
    ax3=fig3.add_subplot(1,1,1,projection='3d')
    x3,y3=np.meshgrid(x,t)
    surf3=ax3.plot_surface(x3,y3,abs(E_f(x2,y2)-U.T),cmap=cm.coolwarm)   #绘面'rainbow' rstride=1,cstride=1,cmap=cm.coolwarm,alpha=0.9
    
    ax3.set_xlabel('x',fontdict={"size":16})
    ax3.set_ylabel('t',fontdict={"size":16})
    ax3.set_zlabel('U',fontdict={"size":16})
    ax3.set_xticks([0,0.2,0.4,0.6,0.8,1])
    #ax3.set_yticks([0,0.05,0.1,0.15,0.2])
    ax3.set_yticks([0,0.2,0.4,0.6,0.8,1])
    #ax3.set_zticks([0,0.2,0.4,0.6,0.8,1])
    ax3.set_title('Error Hot equation$ u_t=A u_{xx} ,$')     
    ax3.grid(False)
    cbar=fig3.colorbar(surf3,shrink=0.75,aspect=5)
    plt.show()    
    
    return U
    
print('===================')
'''
X一维变量的取值范围为
T 时间变量的取值范围
初始条件的形状
    N X方向的网格数
    M 时间T方向的网格数
    T 最大时间期限
    X 最大空间范围
    U 用来存储差分网格点上值得矩阵

'''
#  热传导方程 案例1
N,m=25,1500 #6000,1500#
T,x=np.linspace(0,1,m+1),np.linspace(0,1,N+1)  #m+1项数列  T 0.2
Initia=lambda x:E_f(x,0  )#lambda x :4.0*(1-x)*x                     #初值条件
Boundary_left=lambda t:E_f(0,t)      #lambda t:0                         #左边值
Boundary_right=lambda t:E_f(1,t)     #lambda t:0                        #右边值
print(Main_f(x,T,N,m,Initia,Boundary_left,Boundary_right))

#  热传导方程 案例2

输出结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值