商丘网站制作费用,网站建设需注意哪些事项,望野的翻译,建设工程项目首先#xff0c;我们来看初边值问题#xff1a;伯格斯方程#xff1a;假设函数是定义在上的函数#xff0c;且满足#xff1a;右侧第一项表示自对流#xff0c;第二项则表示扩散#xff0c;在许多物理过程中#xff0c;这两种效应占据着主导地位#xff0c;为了固定一…首先我们来看初边值问题伯格斯方程假设函数是定义在上的函数且满足右侧第一项表示自对流第二项则表示扩散在许多物理过程中这两种效应占据着主导地位为了固定一个特定的解我们对其施加一个初始条件以及一个或者多个边值条件由上面的三个式子所组成的问题被称为初边值问题(IBVP)如果我们同时设置a为-infb为 inf那么我们会得到一个初值问题(IVP)这里主要介绍两个比较常用的方法1、有限差分空间导数我们选用有限组等距值来表示区间其中步长那么我们根据导数的定义可以得到以及这样的话我们就可以用前向欧拉方法来计算但是这样的话我们就要进行稳定性分析(之前的博客里面是有的)为了保证显式时间步进是稳定的就要确保,其中C是一个同阶常数那么从这里我们实际上可以看得到显式差分的时间步长收到了空间步长的制约这是显式差分的一个弊病。2、周期问题的谱技术空间导数方法说实话我之前一直很想用伪谱法但是因为本科期间没有学过复数和傅里叶变换等所以一直不敢动手做今天有这个机会那就得好好学一学。谱方法是有限差分法的一个有用的替代方法仍然使用伯格斯方程进行讲解首先考虑空间域被映射到频率域上的一个特殊情况假设的x具有周期如果用来表示相对于x的傅里叶变换因为的傅里叶变换是那么通过傅里叶变换可以恢复的空间导数所以对于伯格斯方程需要一个傅里叶变换和两个傅里叶逆变换来恢复等式右侧的两个导数需要把其变成一个光谱算法假设在区间的n个等距点上用函数值表示每一个t时刻的那么就可以构造离散傅里叶变换(DFT)其广义上是的傅里叶级数展开的前N项为每个项乘以适当的乘数然后计算逆dft。如果我们知道是平滑的也就是说存在任意多个x导数并且有界那么对于任意大的kDFT的截断误差是如果就大致可以返回阶的误差有限差分法的则需要N~来达到同样的精度如果N只有小的素数因子比如说那么DFT以及其逆变换可以采用快速傅里叶变换FFT来计算需要次的运算关键是既是周期性的也是平滑性的如果那么周期延拓将会是不连续的并且吉布斯现象将破坏所有这些估计的精确性。scipy中有一个非常有用的函数diff如果输入的是一个numpy数组表示在上均匀间隔的值则函数返回一个与u形状相同的数组包含相同x值的order阶导数的值。看一个书上给的例子计算导数值import numpy as np
from scipy.fftpack import diffdef fd(u):返回2*dx有限差分udnp.empty_like(u)ud[1:-1]u[2:]-u[:-2]ud[0]u[1]-u[-1]ud[-1]u[0]-u[-2]return ud
for N in [4,8,16,32,64,128,256]:dx2.0*np.pi/Nxnp.linspace(0,2.0*np.pi,N,endpoint False)unp.exp(np.sin(x))du_exnp.cos(x)*udu_spdiff(u)du_fdfd(u)/(2.0*dx)err_spnp.max(np.abs(du_sp-du_ex))err_fgnp.max(np.abs(du_fd-du_ex))print(N%d,err_sp%.4e,err_sp%.4e% (N,err_fg,err_sp))图1从图一可以看出点数每增加一倍有限差分法的误差的无限范数最大绝对值就减少大约4倍光谱误差岁每个加倍呈现平方的增大直到N非常大N30这种快速的误差减小方式通常被称作指数收敛。我们再来看一个空间周期问题的IVP考虑线性对流其精确解是图2结果图形说明了伪谱法的优点即使是较粗糙的网格间距也能够产生平滑的结果。import numpy as np
from scipy.fftpack import diff
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#6-19建立问题
def u_exact(t,x):Exact solutionreturn np.exp(np.sin(x-2*np.pi*t))
def rhs(u,t):return rhs.return -2.0*np.pi*diff(u)
N32
xnp.linspace(0,2*np.pi,N,endpointFalse)
u0u_exact(0,x)
t_initial0.0
t_final64*np.pi
tnp.linspace(t_initial,t_final,101)
#20行用来求解
solodeint(rhs,u0,t,mxstep5000)
#可视化
figplt.figure()
axfig.add_subplot(1,1,1, projection3d)
t_gr,x_grnp.meshgrid(x,t)
ax.plot_surface(t_gr,x_gr,sol,alpha0.5)
ax.elve,ax.azim47,-137
ax.set_xlabel(x)
ax.set_ylabel(t)
ax.set_zlabel(u)
plt.show()
u_exu_exact(t[-1],x)
errnp.abs(np.max(sol[-1,:]-u_ex))
print(with %d fourier nodes the final error %g%(N,err))再再看看理解理解。