加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[系列]Python计算CFD问题<5>:一维Burgers方程

(2015-03-09 21:04:58)
标签:

杂谈

【来源:http://nbviewer.ipython.org/github/barbagroup/CFDPython/blob/master/lessons/05_Step_4.ipynb#Saving-Time-with-SymPy

一维Burgers方程形式为:

从方程形式上来看,该方程是前面的非线性对流方程与扩散方程的混合体。采用前面提到的离散方法,可以将Burgers方程离散成:

将其写成迭代的形式为:

除了迭代形式外,我们还必须知道初始条件和边界条件。

该方程有解析解:

因此本次计算设初始条件为:

设置边界条件为:

初始条件中含有偏导项,无法直接赋值,需要采用一些数学化简手段进行处理。

Python中提供了sympy库,该库是一个符号计算库,可以帮助进行化简。

完整的程序如下:

# -*-coding:utf-8 -*-

import numpy as np

import sympy

from sympy.utilities.lambdify import lambdify

import matplotlib.pylab as plt

 

x,nu,t = sympy.symbols("x,nu,t")

phi = sympy.exp(-(x-4*t)**2/(4*nu*(t+1))) + sympy.exp(-(x-4*t-2*np.pi)**2/(4*nu*(t+1)))

phiprime = phi.diff(x)

u = -2*nu*(phiprime/phi)+4

ufunc = lambdify((t,x,nu),u)

 

nx = 101

nt=100

dx = 2*np.pi/(nx-1)

nu=0.07

dt=dx*nu

 

x= np.linspace(0,2*np.pi,nx)

un = np.empty(nx)

t=0

u=np.asarray([ufunc(t,x0,nu) for x0 in x]) #list 转化成 np.array

 

plt.figure(figsize=(4,4),dpi=100)

plt.plot(x,u,lw=2)

plt.xlim([0,2*np.pi])

plt.ylim([0,8])

 

for n in range(nt):

un = u.copy()

for i in range(nx-1):

u[i] = un[i] - un[i] * dt/dx *(un[i] - un[i-1]) + nu*dt/dx**2*(un[i+1]-2*un[i]+un[i-1])

u[-1] = un[-1] - un[-1] * dt/dx * (un[-1] - un[-2]) + nu*dt/dx**2*(un[0]-2*un[-1]+un[-2])

 

u_analytical = np.asarray([ufunc(nt*dt,xi,nu) for xi in x])

 

plt.figure(figsize=(6,6),dpi=100)

plt.plot(x,u,marker="o",color="blue",lw=2,label='Computational')

plt.plot(x,u_analytical,color="yellow",label='analytical')

plt.xlim([0,2*np.pi])

plt.ylim([0,10])

plt.legend()

plt.show()

 

初始条件如图:

计算结果如图:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有