Python微震波频散相速分析

news2024/10/11 21:24:14

🎯要点

  1. 在二维均匀介质均匀源中合成互相关函数以便构建波层析成像。
  2. 闭环系统中微积分计算情景:完美弹性体震波、随机外力对模式的能量分配。
  3. 开环系统中微积分计算情景:无数震源激发波方程、闭合曲线上的随机源、不相关平面波事件。
  4. 整理地震波场频谱数据,选择局部平稳状态数据,对数据归一化去噪平滑。
  5. 通过频率-时间分析等方法了解频散曲线。

📜地震波信号解析算法及深度学习

  • Python地震波逆问题解构算法复杂信号分析

  • Python空间地表联动贝叶斯地震风险计算模型

  • Python噪声敏感度和沉积区震动波

  • 互相关导图
    在这里插入图片描述

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python瑞利波

瑞利波是一种沿固体表面传播的表面声波。它们可以通过多种方式在材料中产生,例如通过局部冲击或压电传导,并且经常用于无损检测以检测缺陷。瑞利波是地震在地球上产生的地震波的一部分。当它们在层中传播时,它们被称为兰姆波、瑞利-兰姆波或广义瑞利波。

在由拉梅参数 λ \lambda λ μ \mu μ 描述的各向同性线性弹性材料中,瑞利波的速度由以下方程的解给出:
ζ 3 − 8 ζ 2 + 8 ζ ( 3 − 2 η ) − 16 ( 1 − η ) = 0 \zeta^3-8 \zeta^2+8 \zeta(3-2 \eta)-16(1-\eta)=0 ζ38ζ2+8ζ(32η)16(1η)=0
其中 ζ = ω 2 / k 2 β 2 , η = β 2 / α 2 , ρ α 2 = λ + 2 μ \zeta=\omega^2 / k^2 \beta^2, \eta=\beta^2 / \alpha^2, \rho \alpha^2=\lambda+2 \mu ζ=ω2/k2β2,η=β2/α2,ρα2=λ+2μ, 且 ρ β 2 = μ \rho \beta^2=\mu ρβ2=μ 。由于此方程没有固有尺度,因此产生瑞利波的边界值问题无弥散性。一个有趣的特殊情况是泊松固体,其 λ = μ \lambda=\mu λ=μ,因为这会产生一个与频率无关的相速度,等于 ω / k = β 0.8453 \omega / k=\beta \sqrt{0.8453} ω/k=β0.8453 。对于具有正泊松比 ( ν > 0.3 ) (\nu>0.3) (ν>0.3)的线弹性材料,瑞利波速可近似为 c R = c S 0.862 + 1.14 ν 1 + ν c_R=c_S \frac{0.862+1.14 \nu}{1+\nu} cR=cS1+ν0.862+1.14ν,其中 c S c_S cS是剪切波速度。

由于材料性质的变化,弹性常数通常会随深度而变化。这意味着瑞利波的速度实际上取决于波长(因此也取决于频率),这种现象称为频散。受频散影响的波具有不同的波列形状。如上所述,理想、均匀和平坦的弹性固体上的瑞利波没有频散。但是,如果固体或结构的密度或声速随深度而变化,瑞利波就会变得频散。一个例子是地球表面的瑞利波:频率较高的波比频率较低的波传播得更慢。这是因为较低频率的瑞利波具有相对较长的波长。长波长波的位移比短波长波更深地穿透地球。由于地球中的波速随着深度的增加而增加,较长波长(低频)波可以比较短波长(高频)波传播得更快。因此,瑞利波在远处地震记录站记录的地震图上经常显得分散。还可以观察薄膜或多层结构中的瑞利波弥散。

瑞利波椭相移Python片段

import pickle

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.ticker import FuncFormatter, MultipleLocator
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

from obspy import Stream, UTCDateTime
from obspy.signal.rotate import rotate2zne
from obspy.clients.filesystem.sds import Client as sdsClient
from scipy.signal import correlation_lags, correlate
from scipy.signal import hilbert

def corr_phaseshift(zaux, zaur, period, srate):
    corrs_ph = correlate(zaux, zaur)
    lags = correlation_lags(len(zaux), len(zaur))
    corrs_ph /= np.max(corrs_ph)

    maxshift = round(period*srate/2)
    minshift = -maxshift
    boolsh = np.logical_and(lags>=minshift, lags<=maxshift)
    newcorr = corrs_ph[boolsh]
    newlag = lags[boolsh]
  
    argmaxc = np.argmax(newcorr)
    best_lag = newlag[argmaxc]
    phase_shift = best_lag*360/(period*srate)       
    
    return phase_shift, best_lag

def calc_vars(radial, vertical, period, ref_time):   
    odict = {'ph_shift': [], 'char_funs': [], 
             'times_cf': [], 'hvs': [], 'ccs': []}
    phs = np.arange(0, 182, 2)
    lags = np.unique((period*vertical.stats.sampling_rate*phs/360).astype(int))
    for lag in lags:
        ph = lag*360/(period*vertical.stats.sampling_rate)
        wwz = vertical.copy()
        wwr = radial.copy()
        wwz.data = wwz.data[lag:]
        if lag!=0:
            wwr.data = wwr.data[:-lag]
        time_arr = wwr.times() + (wwr.stats.starttime - ref_time)
        wlen = int(period)
        step = int(round(period/5, 0))
        if step<1:
            step = 1
        if wlen<1:
            wlen = 1
        t0win = []
        corrs = []
        aux_zr = Stream(traces=[wwz, wwr])
        for window in aux_zr.slide(window_length=wlen, step=step):
            auxz = window.select(component='Z')[0].data
            auxr = window.select(component='R')[0].data
            norm = (np.sum(auxz**2)*np.sum(auxr**2))**0.5
            fcc = obcorrelate(auxz, auxr, shift=0, demean=True, normalize=None)/norm
            shift, valuecc = xcorr_max(fcc)
            t0win.append(window[0].stats.starttime-ref_time)
            corrs.append(valuecc)
    
    return(odict)
    
def grid_data(inx, inzdata):
    common_x = inx[0]      
    length = common_x.size
    in_x = inx.copy()
    in_zdata = inzdata.copy()
    for it, etime in enumerate(in_x):
        thisl = len(etime)
        in_x[it] = np.concatenate([etime, np.nan*np.ones(length-thisl)])
        in_zdata[it] = np.concatenate([in_zdata[it], np.nan*np.ones(length-thisl)])
    
    return(in_x, in_zdata)

def shift_unc(xvals, yvals, zgrid, per, evname, thres=0.8, save=False):
    percs = [16, 50, 84]
    rd = 0.01    
    xt, yph = np.meshgrid(xvals, yvals)
    newxt, newyph = xt.flatten(), yph.flatten()
    points = np.vstack((newxt, newyph)).T
    
    fig, ax = plt.subplots()
    CS = ax.contour(xt, yph, zgrid, levels=[0.0, 0.4, 0.6, 0.8], 
                    colors='gray', alpha=0.7)
    maxval = np.nanmax(zgrid)  
    thres_unc = 0.95*maxval    
    CSun = ax.contour(xt, yph, zgrid, levels=[thres_unc], 
                      colors='black', alpha=0.8)    
    p_un = CSun.collections[0].get_paths()[-1]    
    bool_sel = p_un.contains_points(points, radius=rd)
    ph_min, ph_med, ph_max = np.percentile(newyph[bool_sel], percs)
    xt_min, xt_med, xt_max = np.percentile(newxt[bool_sel], percs)
    if maxval>=thres: 
        CSthres = ax.contour(xt, yph, zgrid, levels=[thres], 
                             colors='red', alpha=0.8, linestyles='dashed')
        for c, contour in enumerate(CSthres.collections[0].get_paths()):
            if any(contour.contains_points(p_un.vertices)) or\
                any(p_un.contains_points(contour.vertices)):
                break
        if thres_unc<thres: 
            new_bool = contour.contains_points(points, radius=rd)
            ph_min, ph_med, ph_max = np.percentile(newyph[new_bool], percs)
            xt_min, xt_med, xt_max = np.percentile(newxt[new_bool], percs)
        inph = np.logical_and(newyph<=ph_max, newyph>=ph_min)  
        incon = contour.contains_points(points, radius=rd)                
        selpoints = points[np.logical_and(inph, incon)]     
        minTmax = [ np.nanpercentile(selpoints[selpoints.T[1]==auxph].T[0], [0, 100]) 
                                        for auxph in np.unique(selpoints.T[1]) ]
        _, med_minT, _ = np.percentile(np.asarray(minTmax).T[0], percs)
        _, med_maxT, _ = np.percentile(np.asarray(minTmax).T[1], percs)
    else:
        print(f'Max value not exceeding the threshold [{maxval}/{thres}]')
        med_minT = np.nan
        med_maxT = np.nan

    unc_dict = dict(min_ph=ph_min, med_ph=ph_med, max_ph=ph_max, 
                    minT_thres=med_minT, maxT_thres=med_maxT, 
                    maxchf_mint=xt_min, maxchf_medt=xt_med, maxchf_maxt=xt_max)
    if save:
        ax.clabel(CS, CS.levels, inline=True, 
                  fmt=FuncFormatter(lambda y,_: '{:g}'.format(y)), fontsize=10)        
        ax.set_xlabel('Time [s]')
        ax.set_ylabel('Phase shift [$^o$]')
        dict_unc = dict(color='red', alpha=0.6, ls='--')        
        for phs in [ph_min, ph_med, ph_max]:
            ax.axhline(phs, **dict_unc)
        for xts in [med_minT, med_maxT, xt_min, xt_med, xt_max]:
            ax.axvline(xts, **dict_unc)
        ax.yaxis.set_major_locator(MultipleLocator(30))
        ax.yaxis.set_minor_locator(MultipleLocator(10))
        ax.grid(which='major', ls='--', alpha=0.5, color='gray')
        ax.text(0.01, 0.98, 'T$_0$ = ' + f'{per} s \n{evname}', ha='left', 
                va='top', fontweight='bold', fontsize=10, transform=ax.transAxes)
        ax.text(0.01, ph_med, '$\phi^*$ = ' + f'{ph_med:.1f}' + '$^o$', ha='right', 
                va='bottom', fontweight='bold', color='red',
                fontsize=10, transform=ax.get_yaxis_transform())
        fig.tight_layout()
        fig.savefig(f'{evname}_{per}s_chf.png', dpi=200)
    plt.close(fig)
    return(unc_dict)

        
def shift_waves(auxz, auxr, blag, time_ref):
    if blag>=0:
        newz = auxz.data[blag:]
        if blag==0:         
            newr = auxr.data
            arr_time = auxr.times() + (auxr.stats.starttime - time_ref)
        else:
            newr = auxr.data[:-blag]
            arr_time = auxr.times()[:-blag] + (auxr.stats.starttime - time_ref)
    else:
        newz = auxz.data[:blag]
        newr = auxr.data[-blag:]
        arr_time = auxz.times()[:blag] + (auxz.stats.starttime - time_ref)
    unsh_zz = auxz.copy()
    auxz.data = newz
    auxr.data = newr
    
    return unsh_zz, arr_time

👉参阅、更新:计算思维 | 亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙NEXT开发-面试题库(最新)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

LUCEDA IPKISS Tutorial 77:在版图一定范围内填充dummy

案例分享&#xff1a;在给定的Shape内填充dummy 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3 from shapely.geometry import Polygon, MultiPolygon import numpy as np import matplotlib.pyplot as pltclass CellFilledWithCon…

【AI换脸】Rope一键整合包,实现视频多人实时换脸

随着人工智能技术的发展&#xff0c;人们越来越注重人机交互的趣味性和实用性。AI换脸技术正是在这种背景下兴起的一种创新应用。Rope换脸工具以其易用性和卓越的效果&#xff0c;成为了众多用户和专业人士青睐的对象。 Rope是什么&#xff1f; Rope是一款开源的deepfake软件&…

Redis 的安装与部署(图文)

前言 Redis 暂不支持Windows 系统&#xff0c;官网上只能下载Linux 环境的安装包。但是启用WSL2 就可以在Windows 上运行Linux 二进制文件。[要使此方法工作&#xff0c;需要运行Windows 10 2004版及更高版本或Windows 11]。本文在CentOS Linux 系统上安装最新版Redis&#xf…

健身房预约小程序开发,高效管理健身场馆!

随着社会生活的提高&#xff0c;健身成为了人们在日常生活中的必要选择&#xff0c;而健身房也随之成为了大众经常光顾的地方。健身房预约管理系统是一个便捷预约健身的平台&#xff0c;可以让大众灵活预约&#xff0c;提高健身的便捷性和服务体验。同时&#xff0c;健身场馆也…

JAVA 并发八股

线程与进程区别 进程是正在运行的程序的实例&#xff0c;进程中包含了线程&#xff0c;每个线程执行不同的任务 不同进程使用不同的内存空间&#xff0c;在当前进程下所有线程可以共享内存空间 线程更轻量&#xff0c;线程上下文切换成本一般上要比进程上下文切换低&#xff0…

vueJS中wowjs、animate、swiper的使用

原文关注公众号 本文演示利用swiper纵向全屏滚动 npm 安装 wow.js&#xff0c;安装 wow.js后animate.css会自动安装&#xff1b; npm install wowjs --save-dev npm 安装 animate.css animate.css文档&#xff1a;http://5kzx.cn/doc.html npm install animate.css --save …

Python和MATLAB及C++和Fortran胶体粒子数学材料学显微镜学微观流变学及光学计算

&#x1f3af;要点 二维成像拥挤胶体粒子检测算法粒子的局部结构和动力学分析椭圆粒子成链动态过程定量分析算法小颗粒的光散射和吸收活跃物质模拟群体行为提取粒子轨迹粘弹性&#xff0c;计算剪切模量计算悬浮液球形粒子多体流体动力学概率规划全息图跟踪和表征粒子位置、大小…

创建docker虚拟镜像,创建启动服务脚本

进入系统命令服务目录 编辑服务 [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/…

Gradle 插件获取所有依赖项,类似 androidDependencies?

诉求 在打包过程中我想知道某个模块的信息&#xff0c;比如&#xff1a; 模块androidx.work:work-runtime是否被依赖&#xff1f;模块androidx.work:work-runtime的版本号是多少&#xff1f; 我们利用 Android studio 已有的任务androidDependencies&#xff0c;双击执行很容…

PyQt5写好的py文件生成可执行的exe文件【Nuitka】

文章目录 1.Nuitka引入2.Nuitka与Pyinstaller对比Nuitka安装 3.Nuitka指令4.参数以及作用5.多文件格式封装完成后可删除文件6.运行问题问题1问题2 1.Nuitka引入 看过我上一篇PyQt5写好的py文件生成可执行的exe文件【Pyinstaller】的应该了解到用PyQt5写的界面程序可以通过Pyins…

安卓冻屏bug案例作业分享-千里马学员wms+input实战作业

背景&#xff1a; 近期有学员反馈在aosp14高版本上有了一个新窗口TaskBar&#xff0c;这个但是有需求就是对这个TaskBar进行隐藏&#xff0c;所以有一个需要对这个TaskBar进行进行隐藏需求 隐藏TaskBar需求做了之后发现有如下bug&#xff1a; 问题复现步骤&#xff1a; 因…

新款示波器RTE1104罗德与施瓦茨RS RTE1102原装二手

罗德与施瓦茨R&S RTE1104触摸屏RTE1102新款示波器 R&S-RTE1000 示波器系列&#xff1a; RTE1022标配&#xff1a;200MHz带宽&#xff0c;2通道&#xff0c;5GSa/s采样率&#xff0c;200M存储深度&#xff0c;16个数字通道&#xff08;选配&#xff09; RTE1032标配&a…

HCIP--以太网交换安全(二)端口安全

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后&#xff0c;这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/…

asp.net core Partial 分部视图、视图组件(core mvc 才支持)、视图、Razor组件 、razor pages

分部视图 》》》传参 》》两个东西换个名称&#xff0c;PartialView()>渲染视图>不带Layout 部分视图与普通视图没太大区别&#xff0c;它可以将重复使用的HTML内容结合起来&#xff0c;可以单独使用。 一般命名是在名称前面加下划线&#xff0c;放在/Views/Shared 目…

【cocos creator】输入框滑动条联动小组建

滑动条滑动输入框内容会改变 输入框输入&#xff0c;滑动条位置改变 const { ccclass, property } cc._decorator;ccclass() export default class SliderEnter extends cc.Component {property({ type: cc.Float, displayName: "最大值", tooltip: "" }…

基于Web的停车场管理系统(论文+源码)_kaic

摘要 我国经济的发展愈发迅速&#xff0c;车辆也随之增加的难以想象&#xff0c;因此车位的治理也越来越繁杂&#xff0c;为了方便停车位相关信息的管理&#xff0c;设计开发一个合理的停车位管理系统尤为重要。因而&#xff0c;具有信息方便读取和操作简便的停车位管理系统的设…

Java基础-知识点

文章目录 数据类型包装类型缓存池 String概述不可变的含义不可变的好处String、StringBuffer、StringBuilderString.intern() 运算参数传递float与double隐式类型转换switch 继承访问权限抽象类与接口super重写与重载**1. 重写(Override)****2. 重载(Overload)** Object类的通用…

H3C GRE over IPsec VPN 实验

H3C GRE over IPsec VPN 实验 实验拓扑 ​​ 实验需求 某企业北京总部、上海分支、武汉分支分别通过 R1,R3,R4 接入互联网,配置默认路由连通公网按照图示配置 IP 地址,R1,R3,R4 分别配置 Loopback0 口匹配感兴趣流,Loopback1 口模拟业务网段北京总部拥有固定公网地址…