一维Burgers方程数值解法

一维Burgers方程

一维burgers方程为:

由于等式右边可以进行积分:

利用F = u**2,则方程为:

假设u初始为阶跃函数:

数值解法采用MacCormack格式:

但是这一解法,有失真的性质,后面具体介绍。

所以根据这一格式,可以直接数值求解,并利用matplotlib画出动态的数值图形,具体代码如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 20 14:32:23 2015
1D burges equation
@author: myjiayan
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation

def u_initial():
    first = np.ones(40)
    second = np.zeros(41)
    result = np.array(list(first)+list(second))
    return result

def computeF(u):
    F = 0.5*u**2
    return F

def maccormack(u,nt,dt,dx):
    un = np.zeros((nt,len(u)))
    un[0] = u.copy()
    ustar = u.copy()

    for t in xrange(1,nt):
        F = computeF(u)
        ustar[:-1] = u[:-1] - (F[1:]-F[:-1])*dt/dx
        ustar[-1] = 0.0
        Fstar = computeF(ustar)
        un[t,1:] = 0.5*(u[1:]+ustar[1:]-(Fstar[1:]-Fstar[:-1])*dt/dx)
        un[t,0] = 1.0
        u = un[t].copy()

    return un

if __name__ == '__main__':
    nx = 81
    nt = 70
    dx = 4.0/(nx-1)

    def animate(data):
        x = np.linspace(0,4,nx)
        y = data
        line.set_data(x,y)
        return line,

    u = u_initial()
    sigma = .5
    dt = sigma*dx

    un = maccormack(u,nt,dt,dx)
    fig = plt.figure();
    ax = plt.axes(xlim=(0,4),ylim=(-.5,2));
    line, = ax.plot([],[],lw=2);
    anim = animation.FuncAnimation(fig, animate, frames=un, interval=50)
    plt.show()

直接将代码保存为burgers.py文件,打开terminal:

$python burgers.py

数值结果就以动态的形式表现出来了。

很明显,数值结果失真了,数值结果中u的值竟然比1大,如何改进MacCormack格式呢?

我们在预测步上加一个人工项,新的格式为:

选取Ephsilon为0.5后改进格式得到的数值结果为:

比1大的值已经消失。

时间: 2024-10-08 23:42:05

一维Burgers方程数值解法的相关文章

非线性方程的数值解法解释

非线性方程的数值解法通常有逐步搜索法,二分法,迭代法,牛顿法,牛顿下山法,弦截法,抛物线法... 从迭代法开始讨论 比如一个方程 f(x)=0 没有求根公式,只能用数值的方式来解决,那么就必须用迭代来求解 很多数学方面的书会告诉你上面的这些XX法怎么做,可是他们TMD就是不告诉你为什么这些迭代方式是有效的! 学了泛函我才知道原来涉及到 不动点理论,压缩映射,范数 这些东西.你们这些写书的把这些东西写在数值法解非线性方程部分的前面会死啊! 设第n步迭代结果为 xn 那么这些XX法总会构造这么个 迭

Euler-Maruyama discretization("欧拉-丸山"数值解法)

欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分的最基本的一类显型方法(Explicit method). [编辑] 什么是欧拉法 欧拉法是以流体质点流经流场中各空间点的运动即以流场作为描述对象研究流动的方法.--流场法 它不直接追究质点的运动过程,而是以充满运动液体质点的空间--流场为对象.研究各时刻质点在流场中的变化规律.将个别流体质点运动过

MATLAB常微分方程的数值解法

一.实验目的 科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是求未知函数在一系列离散点处的近似值. 二.实验原理 三.实验程序 1. 尤拉公式程序 四.实验内容 选一可求解的常微分方程的定解问题,分别用以上1, 4两种方法求出未知函数在 节点处的近似值,并对所求结果与分析解的(数值或图形)结果进行比较. 五.解答(按如下顺序提交电子版) 1.(程序) 求解初值问题 取n=10 源程序: euler23.m: function [A1,A2,B1,B2,C1,C2]=euler23(a,

V-rep学习笔记:机器人逆运动学数值解法(Damped Least Squares / Levenberg-Marquardt Method)

The damped least squares method is also called the Levenberg-Marquardt method. Levenberg-Marquardt算法是最优化算法中的一种.它是使用最广泛的非线性最小二乘算法,具有梯度法和牛顿法的优点.当λ很小时,步长等于牛顿法步长,当λ很大时,步长约等于梯度下降法的步长. The damped least squares method can be theoretically justified as follo

一维Poisson方程计算

package com.smartmap.algorithm.equation.differential.partial.ellipsoidal; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; public class PoissonIteration { public static void main(S

微分方程 以及 数值解法

https://blog.csdn.net/qq_29831163/article/details/89703598 https://www.gameres.com/749181.html 原文地址:https://www.cnblogs.com/butterflybay/p/11325542.html

数值优化:计算基本理论

1. 优化问题 最一般的优化问题的表述是这样的: 求解等式约束 $\boldsymbol{g}(\boldsymbol{x})=0$ 和不等式约束 $\boldsymbol{h}(\boldsymbol{x})\leq 0$ 下使得取得 $\min f(\boldsymbol{x})$ 的解 $\boldsymbol{x}$ 其中 $f:\mathbb{R}^n\Rightarrow \mathbb{R}$,$\boldsymbol{g}:\mathbb{R}^n\Rightarrow \mat

【分享】数学物理方法/方程学习资源合集下载

 二阶椭圆型方程与椭圆型方程组.pdf 3.1 MB  弹性结构的数学理论.pdf 4.2 MB  物理学中的数学方法 第一卷_拜仑.pdf 5.2 MB  物理学中的数学方法 第二卷_拜仑.pdf 5.9 MB  中国科学院研究生教学丛书 数学物理中的渐进方法.pdf 7.4 MB  数学物理方法1(柯朗)(英文版).pdf 5.2 MB  数学物理方法2(柯朗)(英文版).pdf 8.3 MB  数学物理方程与特殊函数(王元明)课后答案.pdf 10.38 MB  数学物理方程与特殊函数-王

解方程的历史

不要小瞧这个看上去普通的话题,一元代数方程的解的问题直接导致了如今的抽象数学的诞生. 一元二次方程的解公式是公元八.九世纪阿拉伯数学家花拉子米给出的.中国的<九章算术>中也给出了二次方程的数值解法.当然,在这个上边外国人是遥遥领先:外国人给出的是解析解,中国人给的是数值解,差距不是一点点.之后的很长一段时间对高次方程的讨论是空白,人们始终没有找到一元三次方程的解法.直到16世纪的欧洲,人们再次对这一难题发起冲击. 先从塔尔塔利亚(Tartaglia)谈起.Tartaglia原名Niccolò