高斯脉冲传播的解析解及其matlab求解

一、前言

做CFD的气动声学仿真的时候,尤其是出于气动声学本身对高精度格式的需要,我们通常要将仿真的结果和解析解进行比较。而非线性偏微分方程的解析解几乎不存在(尚未发现)。所幸传统上气动声学的计算是用LEE(线性化欧拉方程)来计算的,在最下方的参考文献中Tam教授给出了求解的步骤以及解析解(本人才疏学浅,最早的出处没有发现),于是仿真的结果和解析解(精确解)的比较也就成为了可能。

这篇博文记录我如何利用matlab计算声波(acoustic wave)在某一时间下的压力脉动。

二、LEE(线性化欧拉方程)

高斯脉冲传播的解析解及其matlab求解_第1张图片

所用的线性化欧拉方程如上所示,本博文设置主流为0(即无主流流动),所以u0为0,因此方程还能进一步简化。

三、解析解

初始条件如下:

p的公式可能有点不太清晰,我又从其他地方截过来:

在这样的初始条件下,Tam给出了该方程组的解析解:

解释一下,在LEE中,ρ和p基本是一样的,因为他们之间建立了线性的比例关系(跟空气系数γ和全局音速c0有关),所以解的形式一样。

看上式,J0是零阶的贝塞尔函数,具体可看:https://blog.csdn.net/c602273091/article/details/35896915

贝塞尔函数跟伽马函数有关,不属于初等函数的范畴,同时上式也是无穷积分,无法得到更explicit的表达式,因此上式便是终点。具体的值还是需要用数值的计算方法来求得。因为matlab上有内置贝塞尔函数,且能计算无穷积分,所以下面用matlab对上式进行求解。

四、matlab编程得解析解的数值解

matlab的代码如下,解析都在每句代码的后面,再次不另作解释。

clear,clc;
eps=0.01;%扰动幅值
alfa=log(2)/0.04;%跟半宽有关的值,越小则波越窄
deltax=0.01;%设置x方向的间隔
x=(0:deltax:(100)*deltax);%因为解析解是中心对称的,所以只用算半边,节省计算量
deltat=0.00161624;%按照参考文献算的最大时间间隔
t=(deltat:deltat:1000*deltat);%1到1000步对应的实际时间
p=zeros(length(x),1);%预设压强的数组
syms kesi;
count=0;
time=200;%计算第200个时间步
for i=1:length(x)
    count=count+1;
    f=exp(-kesi^2/(4*alfa))*cos(kesi*t(time))*besselj(0,kesi*x(i))*kesi;%被积函数
    p(i)=eps/(2*alfa)*int(f,kesi,0,inf);%按公式做无穷积分
    disp(count/length(x)*100);
end
%计算完毕,下面将p复制翻面
xfinal=(-100*deltax:deltax:100*deltax);
pfinal=zeros(201,1);
for i=1:100
    pfinal(i)=p(101-i+1);
end
for i=101:201
    pfinal(i)=p(i-100);
end

五、计算结果

当时间步为200时,计算结果如下:

高斯脉冲传播的解析解及其matlab求解_第2张图片

多说几句。本来预设的扰动幅值eps为0.01的,200个时间步后峰值差不多是0.002,可见高斯脉冲波的幅值是会随时间递减的。

matlab文件:https://download.csdn.net/download/weixin_39124457/12527569

参考文献:

C.K.W.Tam and J.C.Webb,Dispersion-relation-preserving schemes for Computational acoustics , J.Comput. Phys. 107, 262 (1993).
 

你可能感兴趣的:(matlab,气动声学,高斯脉冲,matlab)