《声波方程数值模拟实验报告(共12页).doc》由会员分享,可在线阅读,更多相关《声波方程数值模拟实验报告(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上声波方程数值模拟实验报告一基础理论知识需要的已知条件包括:11)震源函数2)地层速度(波速)3)边界条件2弹性波方程:声波方程的有限差分法数值模拟对于二维速度-深度模型,地下介质中地震波的传播规律可以近似地用声波方程描述: (4-1)是介质在点(x , z)处的纵波速度,为描述速度位或者压力的波场,为震源函数。为求式(4-1)的数值解,必须将此式离散化,即用有限差分来逼近导数,用差商代替微商。为此,先把空间模型网格化(如图4-1所示)。设x、z方向的网格间隔长度为,为时间采样步长,则有: (i为正整数) (j为正整数) (n为正整数)表示在(i,j)点,k时刻的波场值
2、。将在(i,j)点k时刻用Taylor展式展开:(4-2)将在(i,j)点k时刻用Taylor展式展开:(4-3)将上两式相加,略去高阶小量,整理得(i,j)点k时刻的二阶时间微商为:(4-4)对于空间微分,采用四阶精度差分格式,(以X方向为例)即将、分别在(i,j)点k时刻展开到四阶小量,消除四阶小量并解出二阶微分得: (4-5)同理可得: (4-6)这就实现了用网个点波场值的差商代替了偏微分方程的微商,将上三个式子代入(4-1)式中得: (4-7)式中为介质速度的空间离散值,是空间离散步长,为时间离散步长,为震源函数,关于一般使用一个理论的雷克型子波代替,即: (4-8)上式中,为时间,
3、为中心频率,一般取为20-40HZ,为控制频带宽度的参数,一般取3-5。在实际计算过程中,需把此震源函数离散,参与波场计算。确定震源位置。稳定性条件:(4-8)这里表示的是地下介质的最大波速;若地下介质网格间隔、最小速度、及时间采样间隔不符合(4-8)式时,第推求解(4-7)式,波场值会出现误差(高阶小量)累积,出现不稳定现象。频散关系式: (4-9)式中为最小速度,为Nyquist频率。一般取震源子波中的主频的2倍值参与计算,G为每个波长所占的网格点数,对于空间二阶差分、时间二阶差分取8,而对于空间为四阶差分的情况则取4方能有效减少频散。二实验步骤1、 应用声波方程作为正演模拟的波动方程,忽
4、略转换波的产生、传播;2、 将所提供震源函数离散后绘图;震源函数为雷克子波,离散绘图如下:fm=30;r=3;t=0.002; for n=1:200w(n)=exp(-(2*pi*fm/r)2*(t*n)2)*cos(2*pi*fm*t*n); endfigure(1),plot(w);3、 对于小模型,整个区域的速度值可设为常数,即只有一种介质,将震源点放在模型中间,分别记录两个时刻的波前快照(即区域内所有网格点的波场值)。第一时刻为地震波还未传播到边界上的某时刻。由稳定条件,设v为2000,可以令DT=0.001,DH=5,此时精度较高,且满足频散关系程序,图形如下:#include #
5、include #include #define PI 3.#define FM 30#define R 3#define KN 200#define XN 101#define ZN 101#define DH 5#define DT 0.001void main()FILE *fp;int i,j,k,m,n; float u1XNZN,u2XNZN,u3XNZN,u4XNZN,fXNZN; /不能直接初值为0 float u5XNZN,vXNZN,wKN,uu0,uu1,uu2; for(k=0;kKN;k+) wk=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)
6、*(k*DT)*cos(2*PI*FM*k*DT); for(i=0;iXN;i+) /定义f函数,当且仅当i,j同时为50时,f为1,其余为0 for(j=0;jZN;j+) if(i=50&j=50) fij=1; else fij=0; for(i=0;iXN;i+) for(j=0;jZN;j+) u1ij=0.0; u2ij=0.0; u3ij=0.0; u4ij=0.0; vij=2000; /速度相同表示同一介质 for(k=0;kKN;k+) for(i=2;iXN-2;i+) for(j=2;jZN-2;j+) uu0=(vij)*(vij)*(DT/DH)*(DT/DH);
7、 uu1=-1.0/12*(u2i-2j+u2i+2j)+4.0/3*(u2i-1j+u2i+1j)-5.0/2*u2ij; uu2=-1.0/12*(u2ij-2+u2ij+2)+4.0/3*(u2ij-1+u2ij+1)-5.0/2*u2ij; u3ij=2*u2ij-u1ij+uu0*uu1+uu0*uu2+wk*fij; for(m=0;mXN;m+) for(n=0;nZN;n+) u1mn=u2mn; u2mn=u3mn; if(k=100) for(m=0;mXN;m+) for(n=0;nZN;n+) u4mn=u3mn;/记录波前快照,中间点 if(fp=fopen(wave
8、front.dat,w)!=NULL) fprintf(fp,%dn,XN); fprintf(fp,%dn,ZN); for(i=0;iXN;i+) for(j=0;jZN;j+) fprintf(fp,%fn,u4ij); fclose(fp); 第二时刻为地震波已经传播到边界上的某时刻,体会其人工边界反射;程序图形如下:#include #include #include #define PI 3.#define FM 30#define R 3#define KN 200#define XN 101#define ZN 101#define DH 5#define DT 0.001vo
9、id main()FILE *fp;int i,j,k,m,n; float u1XNZN,u2XNZN,u3XNZN,u4XNZN,fXNZN; /不能直接初值为0 float u5XNZN,vXNZN,wKN,uu0,uu1,uu2; for(k=0;kKN;k+) wk=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT)*cos(2*PI*FM*k*DT); for(i=0;iXN;i+) /定义f函数,当且仅当i,j同时为50时,f为1,其余为0 for(j=0;jZN;j+) if(i=50&j=50) fij=1; else fij=0; for(
10、i=0;iXN;i+) for(j=0;jZN;j+) u1ij=0.0; u2ij=0.0; u3ij=0.0; u4ij=0.0; vij=2000; /速度相同表示同一介质 for(k=0;kKN;k+) for(i=2;iXN-2;i+) for(j=2;jZN-2;j+) uu0=(vij)*(vij)*(DT/DH)*(DT/DH); uu1=-1.0/12*(u2i-2j+u2i+2j)+4.0/3*(u2i-1j+u2i+1j)-5.0/2*u2ij; uu2=-1.0/12*(u2ij-2+u2ij+2)+4.0/3*(u2ij-1+u2ij+1)-5.0/2*u2ij; u
11、3ij=2*u2ij-u1ij+uu0*uu1+uu0*uu2+wk*fij; for(m=0;mXN;m+) for(n=0;nZN;n+) u1mn=u2mn; u2mn=u3mn; if(k=160) /只需改动K值,即显示边界反射 for(m=0;mXN;m+) for(n=0;nZN;n+) u4mn=u3mn;/记录波前快照,边界 if(fp=fopen(wavefront.dat,w)!=NULL) fprintf(fp,%dn,XN); fprintf(fp,%dn,ZN); for(i=0;iXN;i+) for(j=0;jZN;j+) fprintf(fp,%fn,u4ij
12、); fclose(fp); 4、 对于大模型,定义为水平层状速度模型;做两个实验,一是将震源点放在区域表层任一点,记录下某些时刻的波前快照,体会地震波在两种介质的分界面上传播规律,指出哪是反射波,哪是透射波;这时取小模型的常量,为减少频散,速度v至少为2400程序图形如下:#include #include #include #define PI 3.#define FM 30#define R 3#define KN 200#define XN 200#define ZN 100#define DH 5#define DT 0.001void main()FILE *fp;int i,j,
13、k,m,n; float u1XNZN,u2XNZN,u3XNZN,u4XNZN,u5XNZN; /不能直接初值为0 float fXNZN,vXNZN,wKN,uu0,uu1,uu2; for(k=0;kKN;k+) wk=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT)*cos(2*PI*FM*k*DT); for(i=0;iXN;i+) for(j=0;jZN;j+) u1ij=0.0; u2ij=0.0; u3ij=0.0; u4ij=0.0; fij=0.0; if (j=30) vij=2400; /第一层速度为2400 else vij=300
14、0; /第二层速度为3000 f10010=1; /定义f函数,在100,10为1 for(k=0;kKN;k+) for(i=2;iXN-2;i+) for(j=2;jZN-2;j+) uu0=(vij)*(vij)*(DT/DH)*(DT/DH); uu1=-1.0/12*(u2i-2j+u2i+2j)+4.0/3*(u2i-1j+u2i+1j)-5.0/2*u2ij; uu2=-1.0/12*(u2ij-2+u2ij+2)+4.0/3*(u2ij-1+u2ij+1)-5.0/2*u2ij; u3ij=2*u2ij-u1ij+uu0*uu1+uu0*uu2+wk*fij; u5ik=u1i
15、10; /地震记录 for(m=0;mXN;m+) for(n=0;nZN;n+) u1mn=u2mn; u2mn=u3mn; if(k=100) for(m=0;mXN;m+) for(n=0;nZN;n+) u4mn=u3mn;/记录波前快照 if(fp=fopen(wavefront.dat,w)!=NULL) fprintf(fp,%dn,XN); fprintf(fp,%dn,ZN); for(i=0;iXN;i+) for(j=0;jZN;j+) fprintf(fp,%fn,u4ij); fclose(fp); 反射波透射波二是合成一个地震记录,即记录下与震源同一深度点的各点所有
16、时刻的波场值,并指出记录上的同向轴分别对应哪些波?这时取小模型的常量,为减少频散,速度v至少为2400程序图像如下:#include #include #include #define PI 3.#define FM 30#define R 3#define KN 200#define XN 200 #define ZN 200#define DH 5#define DT 0.001void main()FILE *fp;int i,j,k,m,n; float u1XNZN,u2XNZN,u3XNZN,u4XNZN,u5XNZN; /不能直接初值为0 float fXNZN,vXNZN,wK
17、N,uu0,uu1,uu2; for(k=0;kKN;k+) wk=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT)*cos(2*PI*FM*k*DT); for(i=0;iXN;i+) for(j=0;jZN;j+) u1ij=0.0; u2ij=0.0; u3ij=0.0; u4ij=0.0; fij=0.0; if (j=30) vij=2400; /第一层速度为2400 else vij=3100; /第二层速度为3100 f10010=1; /定义f函数,在100,10为1 for(k=0;kKN;k+) for(i=2;iXN-2;i+) for
18、(j=2;jZN-2;j+) uu0=(vij)*(vij)*(DT/DH)*(DT/DH); uu1=-1.0/12*(u2i-2j+u2i+2j)+4.0/3*(u2i-1j+u2i+1j)-5.0/2*u2ij; uu2=-1.0/12*(u2ij-2+u2ij+2)+4.0/3*(u2ij-1+u2ij+1)-5.0/2*u2ij; u3ij=2*u2ij-u1ij+uu0*uu1+uu0*uu2+wk*fij; u5ik=u1i10; /地震记录 for(m=0;mXN;m+) for(n=0;nZN;n+) u1mn=u2mn; u2mn=u3mn; if(k=100) for(m
19、=0;mXN;m+) for(n=0;nZN;n+) u4mn=u3mn;/记录波前快照 if(fp=fopen(sei_record.dat,w)!=NULL) fprintf(fp,%dn,XN/2); fprintf(fp,%dn,KN); for(i=0;iXN;i=i+2) for(j=0;jKN;j+) fprintf(fp,%fn,u5ij); fclose(fp); 从上向下看的两条直线为与震源同深度点的各点所有时刻的波场值,在向下与两直线紧邻的双曲线为第二层界面反射的记录。三 通过实验所发现的问题和认识(1) 在用C语言写程序时,很多小问题不注意比如将i=i+2写成i+2,在m,n循环中出现i,j等等,导致无限循环,数据过大,不能出现dat文件等问题。经过这次试验对C语言和matlab的使用有了更加深刻的认识。(2)程序成图时,图形不合适,调试数据时出现The data file length error! 按照,对数据进行多次修改,得到较合理的图形。(3)通过这次试验对地下介质中地震波的传播规律和声波方程有了深刻的认识。专心-专注-专业