各向同性介质二维声波波动方程有限差分法数值模拟(波场模拟动图)

本文介绍了一个使用C/C++和MATLAB实现的声波二阶位移方程的非交错网格波场模拟程序,通过有限差分法计算波的传播,并展示了在特定区域设置振动源的示例和二维波场的快照动态展示。
摘要由CSDN通过智能技术生成

这是一个补充代码,是声波二阶位移方程的有限差分法波场模拟程序,没有交错网格。

弹性波一阶速度应力-应力方程及其交错网格波场模拟见我前面的帖子。C/C++,MATLAB代码的帖子都可以找到。

clc;
clear;
Nx=401; Nz=401; Nt=650;%设置采样点数,采样时间点数
h=5;    %x方向和z方向的步长
dt=0.001;   %时间步长
c=zeros(Nx,Nz);
A=zeros(Nx,Nz);
for i=1:Nx
    for j=1:Nz
        c(i,j)=2000;    %波传播速度为3km/s
        if(j>240)
            c(i,j)=3500;
        end
        f=30;           %震源主频
        t0=1.2/f;
        A(i,j)=(dt*c(i,j))^2/h^2;
%         A(i,j)=1;
    end
end

u=zeros(Nx,Nz,Nt);
for k=2:Nt-1
    for i=3:Nx-2
        for j=3:Nz-2
            if i==200 & j==200 & k<100
                u(i,j,k+1)=exp(-(pi*f*(k*dt-t0)).^2).*(1-2.*(pi*f*(k*dt-t0)).^2);
                %在(100km,100km)处设置一个振动源
            else u(i,j,k+1)=A(i,j)*(u(i+1,j,k)+u(i-1,j,k)+u(i,j+1,k)+u(i,j-1,k)-4*u(i,j,k))-u(i,j,k-1)+2*u(i,j,k);
            end
            u(3,j,k+1)=u(4,j,k+1);
        end
    end
end


filename='二维波场快照.gif';
figure('units','normalized','position',[0,0,0.5,0.75])%设置成图框的大小
for k=1:4:Nt
    aa=u(:,:,k);
    aa=aa';
    pcolor(aa);
    shading interp;
    colormap('gray');
    caxis([-.01 .01]);
    axis equal;
    axis([1,Nx,1,Nz]);
    set(gca,'Ydir','reverse');
    xlabel('x'); ylabel('z');
    title('二维声波传播快照');
    % if(k==201) keyboard; end
    f=getframe(gcf); % 捕获画面
    imind=frame2im(f);
    [imind,cm] = rgb2ind(imind,256);
    if k==1
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.05); %采用延迟时间为0.05秒写入给定的文件
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1); %采用延迟时间为0.1秒写入给定的文件
    end
end

来个双层速度的波场快照:

声明:

该代码非本人原创,本人学习之余略有改动。原文请参考二维声波传播方程的有限差分模拟_交错网格法二维声波方程有限差分正演模拟代码-CSDN博客

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维各向异性弹性波(Anisotropic Elastic Waves)的模拟可以使用MATLAB中的偏微分方程求解器进行数值模拟。下面是一个简单的MATLAB代码示例,用于模拟二维各向异性弹性波的传播: ```matlab % 定义模型参数 vp = 2000; % P波速度 vs = 1000; % S波速度 epsilon = 0.2; % 纵向各向同性系数 delta = 0.1; % 横向各向异性系数 theta = pi/6; % 横向各向异性系数的旋转角度 % 定义模拟区域 nx = 100; % x方向网格数 ny = 100; % y方向网格数 dx = 10; % x方向网格间距 dy = 10; % y方向网格间距 dt = 0.001; % 时间步长 nt = 1000; % 总时间步数 % 初始化波场 u = zeros(nx, ny); % 波位移 vx = zeros(nx, ny); % x方向速度 vy = zeros(nx, ny); % y方向速度 % 定义有限差分系数 c1 = dt/dx; c2 = dt/dy; c3 = vp^2*dt^2; c4 = vs^2*dt^2; % 定义各向异性系数矩阵 C11 = (1+2*epsilon)/(2*(1-epsilon)*vp^2); C12 = delta/(2*(1-epsilon)*vp^2); C22 = 1/(2*vs^2); % 定义旋转矩阵 R = [cos(theta)^2 sin(theta)^2 2*sin(theta)*cos(theta); sin(theta)^2 cos(theta)^2 -2*sin(theta)*cos(theta); -sin(theta)*cos(theta) sin(theta)*cos(theta) cos(theta)^2-sin(theta)^2]; % 循环模拟波场传播过程 for n = 1:nt % 计算速度场 vx(2:nx-1,2:ny-1) = vx(2:nx-1,2:ny-1) + c1*c3*(u(3:nx,2:ny-1)-u(1:nx-2,2:ny-1)) ... + c2*c4*(R(1,1)*(u(2:nx-1,3:ny)-u(2:nx-1,1:ny-2)) ... + R(1,2)*(u(3:nx,3:ny)-u(1:nx-2,1:ny-2)) ... + R(1,3)*(u(3:nx,2:ny-1)-u(1:nx-2,2:ny-1))); vy(2:nx-1,2:ny-1) = vy(2:nx-1,2:ny-1) + c1*c4*(R(2,1)*(u(2:nx-1,3:ny)-u(2:nx-1,1:ny-2)) ... + R(2,2)*(u(3:nx,3:ny)-u(1:nx-2,1:ny-2)) ... + R(2,3)*(u(3:nx,2:ny-1)-u(1:nx-2,2:ny-1))) ... + c2*c3*(u(2:nx-1,3:ny)-u(2:nx-1,1:ny-2)); % 计算波位移 u(2:nx-1,2:ny-1) = u(2:nx-1,2:ny-1) + c1*vx(2:nx-1,2:ny-1) + c2*vy(2:nx-1,2:ny-1); % 绘制波场快照 imagesc(u); colorbar; drawnow; end ``` 上述代码中,我们首先定义了模型参数,包括P波速度vp、S波速度vs、纵向各向同性系数epsilon、横向各向异性系数delta以及横向各向异性系数的旋转角度theta。然后,我们定义了模拟区域的网格数、网格间距、时间步长和总时间步数。接着,我们初始化了波场,包括波位移u、x方向速度vx和y方向速度vy。然后,我们定义了有限差分系数和各向异性系数矩阵,并计算了旋转矩阵。最后,我们循环模拟波场传播过程,依次计算速度场和波位移,并绘制波场快照。 需要注意的是,上述代码仅仅是一个简单的示例,实际应用时需要根据具体问题进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值