地震正演培训

正演的大致流程

首先有一个观测数据,假设一个速度模型velocity mode,由velocity mode正演得到seismic数据,将seismic数据与观测数据进行比较,并由误差更改速度模型

二维声波方程

研究平面声波的传播行为,即 t t t x x x y y y之间的关系。

常规网格

连续偏导形式

二位声波方程的连续偏导形式如下:
1 v 2 ∂ 2 U ∂ t 2 = ∂ 2 U ∂ x 2 + ∂ 2 U ∂ y 2 \frac{1}{v^2}\frac{\partial^2 U}{\partial t^2}=\frac{\partial^2U}{\partial x^2} + \frac{\partial^2 U}{\partial y^2} v21t22U=x22U+y22U
其中 U U U是声压(声波的压力变化), v v v是声速

二维差分形式

在这里插入图片描述
对连续的偏导形式进行差分处理,实现离散化

泰勒级数

f ( x ) − f ( x − h ) = ∂ f ( x ) ∂ x h − 1 2 ∂ 2 f ( x ) ∂ x 2 + o ( h 2 ) f(x)-f(x-h)=\frac{\partial f(x)}{\partial x}h-\frac{1}{2}\frac{\partial^2 f(x)}{\partial x^2}+o(h^2) f(x)f(xh)=xf(x)h21x22f(x)+o(h2)

f ( x + h ) − f ( x ) = ∂ f ( x ) ∂ x h + 1 2 ∂ 2 f ( x ) ∂ x 2 + o ( h 2 ) f(x+h)-f(x)=\frac{\partial f(x)}{\partial x}h+\frac{1}{2}\frac{\partial^2 f(x)}{\partial x^2}+o(h^2) f(x+h)f(x)=xf(x)h+21x22f(x)+o(h2)

联立得

f ( x + h ) + f ( x − h ) + 2 f ( x ) h 2 = ∂ 2 f ( x ) ∂ x 2 + o ( h 2 ) \frac{f(x+h)+f(x-h)+2f(x)}{h^2}=\frac{\partial^2 f(x)}{\partial x^2}+o(h^2) h2f(x+h)+f(xh)+2f(x)=x22f(x)+o(h2)
其中 h h h就是差分单元,那么再结合上面的二位声波方程就可以得到如下的差分后方程
在这里插入图片描述

代码实现

% 声波二维均匀模型-中心差分格式
tic
clc
close all
clear all

Endtime=0.5;  %模拟时长
delta_t=0.0005;%以秒为单位
delta_x=6;%以米为单位   空间步长
delta_z=6;
CNX=301; %x方向的网格数
CNZ=301; %
v=1500; %波速
Sx=(CNX+1)/2; %震源位置
Sz=(CNZ+1)/2;
f0=30;% 10~40HZ  震源主频

Unow=zeros(CNX,CNZ);
Uprev=zeros(CNX,CNZ);
Unext=zeros(CNX,CNZ);

% 主程序
for time=0:delta_t:Endtime
  for i=2:CNX-1
      for j=2:CNZ-1
      A=(-2*Unow(i,j)+Unow(i+1,j)+Unow(i-1,j))/delta_x^2;
      B=(-2*Unow(i,j)+Unow(i,j+1)+Unow(i,j-1))/delta_z^2;
      Unext(i,j)=2*Unow(i,j)-Uprev(i,j)+v^2*(A+B)*delta_t^2;
      end
  end
  Unext(Sx,Sz)=5.76*f0^2*(1-16*(0.6*f0*time-1)^2)*exp(-8*(0.6*f0*time-1)^2);%震源函数
  Uprev=Unow;  %波场更新
  Unow=Unext;
end

%绘图
surf(Unow)
shading interp;
view(2);%view(90,90)
colormap(gray);
toc

以上是有限差分实现代码,图像如下
在这里插入图片描述

边界网格

地震波传播到介质中断层处时,界面的波阻抗出现差异导致波发生反射和透射,是一种自然的物理现象。在自然传播情况中,地球介质可被视为无限大的区域,但在数值模拟中,受到计算量的限制,可模拟的地震波传播区域大小受限。因而模拟计算区域必定存在人工边界。

代码

% 声波二阶-添加边界-常规网格
tic
clc
close all
clear all

Endtime=0.4;  %模拟时长
delta_t=0.001;%以秒为单位
delta_x=0.006;%以千米为单位   空间步长
delta_z=0.006;
f0=30;% 10~40HZ  震源频率
iteration=1;
nk=1;
n=Endtime/delta_t;

CNX=301; % 
CNZ=301; %
BNX=20;
BNZ=20;
XMAX=CNX+2*BNX;
ZMAX=CNZ+2*BNZ;
Sx=(XMAX+1)/2; %震源位置
Sz=(ZMAX+1)/2;
c=0;

%zeros(XMAX,ZMAX);%波速
v(1:100,1:ZMAX)=2.0;
v(101:200,1:ZMAX)=2.0;
v(201:XMAX,1:ZMAX)=2;

a=-0.15;
S=0.001;

Wave=zeros(n+1,1);
Fnow=zeros(n+1,CNZ);
Unow=zeros(XMAX,ZMAX);
Uprev=zeros(XMAX,ZMAX);
Unext=zeros(XMAX,ZMAX);

Uxnow=zeros(XMAX,ZMAX);%n
Uxprev=zeros(XMAX,ZMAX);%n-1
Uxnext=zeros(XMAX,ZMAX);%n+1
Uznow=zeros(XMAX,ZMAX);%n
Uzprev=zeros(XMAX,ZMAX);%n-1
Uznext=zeros(XMAX,ZMAX);%n+1

Psi2x=zeros(2*BNZ,XMAX);
Uxxprev=zeros(2*BNZ,XMAX);
Psi2xprev=zeros(2*BNZ,XMAX);
Eta2xprev=zeros(2*BNZ,XMAX);
Eta2x=zeros(2*BNZ,XMAX);
Psixprev=zeros(2*BNZ,XMAX);
Psix=zeros(2*BNZ,XMAX);
Etaxprev=zeros(2*BNZ,XMAX);
Etax=zeros(2*BNZ,XMAX);
Thetaxprev=zeros(2*BNZ,XMAX);
Thetax=zeros(2*BNZ,XMAX);


Uzzprev=zeros(ZMAX,2*BNZ);
Psi2zprev=zeros(ZMAX,2*BNZ);
Psi2z=zeros(ZMAX,2*BNZ);
Eta2zprev=zeros(ZMAX,2*BNZ);
Eta2z=zeros(ZMAX,2*BNZ);
Psizprev=zeros(ZMAX,2*BNZ);
Psiz=zeros(ZMAX,2*BNZ);
Etazprev=zeros(ZMAX,2*BNZ);
Etaz=zeros(ZMAX,2*BNZ);
Thetazprev=zeros(ZMAX,2*BNZ);
Thetaz=zeros(ZMAX,2*BNZ);

% 主程序
for time=0:delta_t:Endtime
    for m=4:XMAX-3
      for n=4:ZMAX-3
          c=v(m,n);
     %A=(-2*Unow(m,n)+Unow(m+1,n)+Unow(m-1,n))/delta_x^2;
     %B=(-2*Unow(m,n)+Unow(m,n+1)+Unow(m,n-1))/delta_z^2;
     A=(-2.8194*Unow(m,n)+1.575*(Unow(m+1,n)+Unow(m-1,n))-0.1827*(Unow(m+2,n)+Unow(m-2,n))+0.0174*(Unow(m+3,n)+Unow(m-3,n)))/delta_x^2;
     B=(-2.8194*Unow(m,n)+1.575*(Unow(m,n+1)+Unow(m,n-1))-0.1827*(Unow(m,n+2)+Unow(m,n-2))+0.0174*(Unow(m,n+3)+Unow(m,n-3)))/delta_z^2;
     Unext(m,n)=2*Unow(m,n)-Uprev(m,n)+c^2*(A+B)*delta_t^2;

     %fprintf('their is %8.5f\n',c);
     
     %***************添加边界***************
        if m<=BNX+1 || m>=BNX+CNX || n<=BNZ+1 || n>=BNZ+CNZ
            
              Uxx=A;
              Uzz=B;
  
            %UX方向****************************
            if m<=BNX+1 || m>=CNX+BNX
                if m<=BNX+1
                    XBPos=m;
                    XBDistance=(BNX+1-m)*delta_x;
                else
                    XBPos=m-CNX;
                    XBDistance=(m-(BNX+CNX))*delta_x;
                end
                ZBPos=n;
                
                XBThick=BNX*delta_x ;
                XDecay=-3*c*log(S)/(2*XBThick)*(XBDistance/XBThick)^2;
                XDecay_order=-3*c*log(S)*XBDistance/XBThick^3;
                XAlpha=pi*f0*(1-XBDistance/XBThick);
                XAlpha_order=-pi*f0/XBThick;
                bX=exp(-(XDecay+XAlpha)*delta_t);
                aX=(1-bX)/(XDecay+XAlpha);    
            
                %傅里叶逆变换各部分表达式
                Psi2x(XBPos,ZBPos)=bX*Psi2xprev(XBPos,ZBPos)+aX*0.5*(Uxx+Uxxprev(XBPos,ZBPos));
                Eta2x(XBPos,ZBPos)=bX*Eta2xprev(XBPos,ZBPos)+aX*0.5*(Psi2x(XBPos,ZBPos)+Psi2xprev(XBPos,ZBPos));
                Psix(XBPos,ZBPos)=bX*Psixprev(XBPos,ZBPos)+aX*0.5*(Uxnow(m,n)+Uxprev(m,n));
                Etax(XBPos,ZBPos)=bX*Etaxprev(XBPos,ZBPos)+aX*0.5*(Psix(XBPos,ZBPos)+Psixprev(XBPos,ZBPos))    ;
                Thetax(XBPos,ZBPos)=bX*Thetaxprev(XBPos,ZBPos)+aX*0.5*(Etax(XBPos,ZBPos)+Etaxprev(XBPos,ZBPos)) ;
                
                %指标变换——迭代更新
                Uxxprev(XBPos,ZBPos)=Uxx;
                Psi2xprev(XBPos,ZBPos)=Psi2x(XBPos,ZBPos);
                Eta2xprev(XBPos,ZBPos)=Eta2x(XBPos,ZBPos);
                Psixprev(XBPos,ZBPos)=Psix(XBPos,ZBPos);
                Etaxprev(XBPos,ZBPos)=Etax(XBPos,ZBPos);
                Thetaxprev(XBPos,ZBPos)=Thetax(XBPos,ZBPos);

                %UX方向二阶偏导数的傅里叶逆变换表达式
                Uxx=Uxx-2*XDecay*Psi2x(XBPos,ZBPos)+XDecay^2*Eta2x(XBPos,ZBPos)-XDecay_order*Psix(XBPos,ZBPos)...
                    +XDecay*(2*XDecay_order+XAlpha_order)*Etax(XBPos,ZBPos)-XDecay^2*(XDecay_order+XAlpha_order)*Thetax(XBPos,ZBPos);
            end
%   **************UZ方向****************************
            if n<=BNZ+1 || n>=BNZ+CNZ
                if n<=BNZ+1
                    ZBPos=n;
                    ZBDistance=(BNZ+1-n)*delta_z;
                else
                    ZBPos=n-CNZ;
                    ZBDistance=(n-(BNZ+CNZ))*delta_z;
                end
                XBPos=m;
                
                ZBThick=BNZ*delta_z;
                ZDecay=-3*c/(2*ZBThick)*log(S)*(ZBDistance/ZBThick)^2;
                ZDecay_order=-3*c*log(S)*ZBDistance/ZBThick^3;
                ZAlpha=pi*f0*(1-ZBDistance/ZBThick);
                ZAlpha_order=-pi*f0/ZBThick;
                bZ=exp(-(ZDecay+ZAlpha)*delta_t);
                aZ=(1-bZ)/(ZDecay+ZAlpha);   
                
                %傅里叶逆变换各部分表达式
                Psi2z(XBPos,ZBPos)=bZ*Psi2zprev(XBPos,ZBPos)+aZ*0.5*(Uzz+Uzzprev(XBPos,ZBPos));
                Eta2z(XBPos,ZBPos)=bZ*Eta2zprev(XBPos,ZBPos)+aZ*0.5*(Psi2z(XBPos,ZBPos)+Psi2zprev(XBPos,ZBPos));
                Psiz(XBPos,ZBPos)=bZ*Psizprev(XBPos,ZBPos)+aZ*0.5*(Uznow(m,n)+Uzprev(m,n));
                Etaz(XBPos,ZBPos)=bZ*Etazprev(XBPos,ZBPos)+aZ*0.5*(Psiz(XBPos,ZBPos)+Psizprev(XBPos,ZBPos)) ;
                Thetaz(XBPos,ZBPos)=bZ*Thetazprev(XBPos,ZBPos)+aZ*0.5*(Etaz(XBPos,ZBPos)+Etazprev(XBPos,ZBPos)) ;
                
                %指标变换——迭代更新
                Uzzprev(XBPos,ZBPos)=Uzz;
                Psi2zprev(XBPos,ZBPos)=Psi2z(XBPos,ZBPos);
                Eta2zprev(XBPos,ZBPos)=Eta2z(XBPos,ZBPos);
                Psizprev(XBPos,ZBPos)=Psiz(XBPos,ZBPos);
                Etazprev(XBPos,ZBPos)=Etaz(XBPos,ZBPos);
                Thetazprev(XBPos,ZBPos)=Thetaz(XBPos,ZBPos);
                
                %Z方向二阶偏导数的傅里叶逆变换表达式
                Uzz=Uzz-2*ZDecay*Psi2z(XBPos,ZBPos)+ZDecay^2*Eta2z(XBPos,ZBPos)-ZDecay_order*Psiz(XBPos,ZBPos)...
                    +ZDecay*(2*ZDecay_order+ZAlpha_order)*Etaz(XBPos,ZBPos)-ZDecay^2*(ZDecay_order+ZAlpha_order)*Thetaz(XBPos,ZBPos);
            end
            Unext(m,n)=2*Unow(m,n)-Uprev(m,n)+(c*delta_t)^2*(Uxx+Uzz);
        end %边界循环结束
            if m == Sx
                Fnow(nk,n) = Unext(Sx,n);%地震记录
            end
              Wave(iteration) = Unext(101,151); %波形图
              iteration = iteration + 1;
      end
   end
  Unext(Sx,Sz)=delta_t^2*5.76*f0^2*(1-16*(0.6*f0*time-1)^2)*exp(-8*(0.6*f0*time-1)^2);

  Uprev=Unow;  %波场更新
  Unow=Unext;
  nk=nk+1;
end

%绘图
%plot(Wave)
%surf(Unow)
surf(Fnow)

shading interp;
view(2);%view(90,90)
colormap(gray);

toc

得到三个结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

交错网格

网格划分

在这里插入图片描述

一阶速度应力格式

在这里插入图片描述
按照上面提到过的泰勒级数处理,得到
在这里插入图片描述

代码

% 声波二维_一阶速度-应力格式_交错网格
tic
clc
close all
clear all

Endtime=0.4;  %模拟时长
delta_t=0.0005;%以秒为单位
delta_x=0.008;%以千米为单位   空间步长
delta_z=0.008;
CNX=301; %x方向的网格数
CNZ=301; %
rho=1.2;%
v=2; %波速
Sx=(CNX+1)/2; %震源位置
Sz=(CNZ+1)/2;
f0=30;% 10~40HZ  震源频率

Unow=zeros(CNX,CNZ);
Unext=zeros(CNX,CNZ);
Vnow=zeros(CNX,CNZ);
Vnext=zeros(CNX,CNZ);
Pnow=zeros(CNX,CNZ);
Pnext=zeros(CNX,CNZ);


% 主程序
for time=0:delta_t:Endtime
    for i=2:CNX-1
        for j=2:CNZ-1
            M=(Pnow(i,j)-Pnow(i-1,j))/(rho*delta_x);
            N=(Pnow(i,j)-Pnow(i,j-1))/(rho*delta_z);
            Unext(i,j) = Unow(i,j) + delta_t*M;
            Vnext(i,j) = Vnow(i,j) + delta_t*N;
        end
    end
    
    for i=1:CNX-1
        for j=1:CNZ-1
            X = (Unext(i+1,j) - Unext(i,j))/delta_x;
            Y = (Vnext(i,j+1) - Vnext(i,j))/delta_z;
            Pnext(i,j)=Pnow(i,j) + rho*v*v*(X+Y)*delta_t;
        end
    end

  Pnext(Sx,Sz)=5.76*f0^2*(1-16*(0.6*f0*time-1)^2)*exp(-8*(0.6*f0*time-1)^2);
  
  %波场更新
  Unow=Unext;  %波场更新
  Vnow=Vnext; %波场更新
  Pnow=Pnext;
end
% max(max(Vnext))
%绘图
surf(Pnow)
%surf(Unow)%x方向速度分量
%surf(Vnow)%z方向速度分量
shading interp;

view(2);%view(90,90)
colormap(gray);
toc

结果:
在这里插入图片描述

弹性波

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值