正演的大致流程
首先有一个观测数据,假设一个速度模型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}
v21∂t2∂2U=∂x2∂2U+∂y2∂2U
其中
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(x−h)=∂x∂f(x)h−21∂x2∂2f(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)=∂x∂f(x)h+21∂x2∂2f(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(x−h)+2f(x)=∂x2∂2f(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;
%U的X方向****************************
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);
%U的X方向二阶偏导数的傅里叶逆变换表达式
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
% **************U的Z方向****************************
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
结果: