Python | 赤道频散关系图

写在前面

写开题报告, 想用个图发现截出来全是糊的。索性自己画了,主要实现的Matsuno(1966)的赤道波动频散关系图。但是,实在是没有审美,其他文献里都是黑色,这里非要用个紫色,因为紫色更有韵味。

之前想过把所有画过的图的代码都整理一遍,想想工作量还是懒了。索性,从现在开始,再画过的图都放到一个jupyter文件里好了。

浅水波频散关系图

效果就是下面这个样子,实现逻辑也很容易。得到四个浅水波解的频散关系公式,进行绘图就好。

相关关系式可以直接参考ncl中kf-filter函数的相关公式:

  • https://github.com/yyr/ncl/blob/master/ni/src/contrib/kf_filter.ncl

我这里使用了无量纲的频散形式,喂给gpt随便给他几个指令很快就实现了。

  • 唯一比较麻烦的是MRG波,从负波数到正波数都有,需要仔细注意一下。kelvin波最简单。
  1. 惯性重力波的频散关系

ω g ( k , n ) = k 2 + 2 n + 1 \omega_g(k, n) = \sqrt{k^2 + 2n + 1} ωg(k,n)=k2+2n+1

  1. Rossby波的频散关系

ω r ( k , n ) = − k k 2 + 2 n + 1 \omega_r(k, n) = -\frac{k}{k^2 + 2n + 1} ωr(k,n)=k2+2n+1k

  1. 混合Rossby-重力波的频散关系

ω M R G ( k ) = 1 2 ( k + k 2 + 4 ) \omega_{MRG}(k) = \frac{1}{2} \left(k + \sqrt{k^2 + 4}\right) ωMRG(k)=21(k+k2+4 )

python代码

# -*- coding: utf-8 -*-
"""
Created on %(date)s@author: %(username)s@email : xianpuji@hhu.edu.cn
"""import matplotlib.pyplot as plt
import numpy as np# ================================================================================================
# Author: %(Jianpu)s | Affiliation: Hohai
# email : xianpuji@hhu.edu.cn
# =================================================================================================
# 定义各类波的频散关系
def omega_gravity(k, n):return np.sqrt(k**2 + 2 * n + 1)def omega_rossby(k, n):return -k / (k**2 + 2 * n + 1)def omega_mixed_rossby_gravity(k):return 0.5 * (k + np.sqrt(k**2 + 4))def plot_kelvin(ax, k, color, lw):k_pos = k[k > 0]ax.plot(k_pos, k_pos, label='Kelvin波', color=color, linewidth=lw)def plot_mrg(ax, k, omega_func, color, lw):k_pos = k[k > 0]k_neg = k[k <= 0]ax.plot(k_neg, omega_func(k_neg), color=color, label='MRG波', linewidth=lw)ax.plot(k_pos, omega_func(k_pos), color=color, linewidth=lw)def plot_rossby(ax, k, omega_func, color, lw, n_max=4):k_neg = k[k < 0]for n in range(1, n_max+1):omega_r = omega_func(k_neg, n)ax.plot(k_neg, omega_r, color=color, linewidth=lw)def plot_gravity(ax, k, omega_func, color, lw, n_max=4):for n in range(1, n_max+1):omega_g = omega_func(k, n)ax.plot(k, omega_g, color=color, linewidth=lw)if n == 1:ax.plot([], [], color=color, label='惯性重力波')def style_axes(ax, color, lw):ax.axhline(0, color=color, linewidth=lw)ax.axvline(0, color=color, linewidth=lw)ax.set_xlabel(r'$k^*$', fontsize=14, color=color)ax.set_ylabel(r'$\omega^*$', fontsize=14, color=color)ax.set_xlim(-4.2, 4.2)ax.set_ylim(0, 4.5)for spine in ['top', 'right', 'left']:ax.spines[spine].set_visible(False)ax.spines['bottom'].set_linewidth(1.8)ax.spines['bottom'].set_color(color)ax.tick_params(axis='both', colors=color, width=0)for tick in ax.get_xticklabels() + ax.get_yticklabels():tick.set_color(color)ax.plot(1, 0, ">", transform=ax.get_yaxis_transform(), clip_on=False, color=color)ax.plot(0, 1, "^", transform=ax.get_xaxis_transform(), clip_on=False, color=color)def annotate(ax, color):ax.text(1.2, 0.7, 'Kelvin波 \n (n=-1)', fontsize=10, rotation=55, color=color)ax.text(-3.8, 0.35, 'Rossby波 \n (n=1,2,3,4)', fontsize=10, color=color)ax.text(-1, 0.9, 'MRG波 \n (n=0)', fontsize=10, rotation=25, color=color)ax.set_title('赤道浅水波频散关系图(Matsuno 1966)', fontsize=15, color=color)ax.set_title('东传惯性重力波', fontsize=10, loc='right', color=color)ax.set_title('西传惯性重力波', fontsize=10, loc='left', color=color)def plot_equatorial_waves(k, omega_mrg, omega_rossby, omega_gravity, main_color='k', linewidth=1.8):fig, ax = plt.subplots(figsize=(8, 6), dpi=200)# 绘制各类波动plot_kelvin(ax, k, main_color, linewidth)plot_mrg(ax, k, omega_mrg, main_color, linewidth)plot_rossby(ax, k, omega_rossby, main_color, linewidth)plot_gravity(ax, k, omega_gravity, main_color, linewidth)# 样式设置style_axes(ax, main_color, linewidth)annotate(ax, main_color)ax.grid(True, linestyle='--', alpha=0.4)plt.tight_layout()plt.show()fig.savefig('频散曲线理论关系图.png',dpi=600)plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #正常显示负号
# 示例 k 轴(你应该根据实际数据定义)
k = np.linspace(-4.2, 4.2, 500)
# 通用配色(深蓝紫色)
main_color = '#4B0082'
linewidth = 1.8plot_equatorial_waves(k=k,omega_mrg=omega_mixed_rossby_gravity,omega_rossby=omega_rossby,omega_gravity=omega_gravity,main_color=main_color,linewidth=1.8
)

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

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

相关文章

Nexus 私有仓库 + Nginx 反向代理部署文档

1. 使用 Podman 部署 Nexus 3 podman run --name nexus -d \-p 8081:8081 \-v /data:/nexus-data \-v /etc/localtime:/etc/localtime \-e TZ"Asia/Shanghai" \-e INSTALL4J_ADD_VM_PARAMS"-Xms10240m -Xmx10240m -XX:MaxDirectMemorySize4096m" \docker.…

一.Gitee基本操作

一.初始化 1.git init初始化仓库 git init 用于在当前目录下初始化一个本地 Git 仓库&#xff0c;让这个目录开始被 Git 跟踪和管理。 生成 .git 元数据目录&#xff0c;从而可以开始进行提交、回退、分支管理等操作。 2.git config user.name/user.email配置本地仓库 # 设置…

力扣210(拓扑排序)

210. 课程表 II - 力扣&#xff08;LeetCode&#xff09; 这是一道拓扑排序的模板题。简单来说&#xff0c;给出一个有向图&#xff0c;把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此&#xff0c;拓扑排序也是图论中判断有向无环图…

华为ensp实现跨vlan通信

要在网络拓扑中实现主机192.168.1.1、192.168.1.2和192.168.2.1之间的互相通信&#xff0c;需要正确配置交换机&#xff08;S5700&#xff09;和路由器&#xff08;AR3260&#xff09;&#xff0c;以确保不同网段之间的通信&#xff08;即VLAN间路由&#xff09;。 网络拓扑分析…

热部署与双亲委派

热部署初探与双亲委派机制 一、热部署初探 ​ 热部署就是在不重启服务的情况下&#xff0c;无需重新启动整个应用&#xff0c;就能对代码、配置等进行更新并使新的更改在服务中生效。以下代码可以打破双亲委派机制&#xff0c;利用类加载器的隔离实现热部署。可分为以下三步进…

AWS SNS:解锁高并发消息通知与系统集成的云端利器

导语 在分布式系统架构中&#xff0c;如何实现高效、可靠的消息通知与跨服务通信&#xff1f;AWS Simple Notification Service&#xff08;SNS&#xff09;作为全托管的发布/订阅&#xff08;Pub/Sub&#xff09;服务&#xff0c;正在成为企业构建弹性系统的核心组件。本文深度…

驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)

作者&#xff1a;嵌入式Jerry 视频教程请关注 B 站&#xff1a;“嵌入式Jerry” 一、背景与目标 在本篇中&#xff0c;我们围绕 TI 的 lm48100q 音频编解码器 展开&#xff0c;深入讲解其作为 I2C 外设如何集成至 Linux 内核音频子系统&#xff08;ASoC&#xff09;&#xff0…

idea写spark程序

步骤 1&#xff1a;创建 Maven 项目 打开 IntelliJ IDEA&#xff0c;选择 File > New > Project。选择 Maven&#xff0c;勾选 Create from archetype&#xff0c;选择 org.apache.maven.archetypes:maven-archetype-quickstart。填写 GroupId&#xff08;如 com.exampl…

【C语言练习】032. 编写带参数的函数

032. 编写带参数的函数 032. 编写带参数的函数1. 定义带参数的函数示例1:定义一个带参数的函数输出结果2. 传递多个参数示例2:定义一个带多个参数的函数输出结果3. 传递数组作为参数示例3:定义一个带数组参数的函数输出结果4. 传递结构体作为参数示例4:定义一个带结构体参数…

Java虚拟机的基本结构

jvm它包含以下部分 第一个&#xff1a;类加载系统 类加载子系统&#xff0c;负责类的加载。类加载器有三种类型&#xff1a;引导类加载器、扩展类加载器、应用程序类加载器。 第二个&#xff1a;运行时数据区 包含了程序计数器、Java虚拟机栈、本地方法栈、堆 、方法区。 程…

uniapp引入七鱼客服微信小程序SDK

小程序引入七鱼sdk 1.微信公众平台引入2.代码引入3.在pagesQiyu.vue初始化企业appKey4.跳转打开七鱼客服 1.微信公众平台引入 账号设置->第三方设置->添加插件->搜索 QIYUSDK ->添加 2.代码引入 在分包中引入插件 "subPackages": [{"root":…

手撕算法(定制整理版2)

最长无重复子字符串 class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if not s:return 0max_len 0tp []for a in s:while a in tp:del tp[0]tp.append(a)if len(tp) > max_len:max_len len(…

数字IC后端培训教程之数字后端项目典型案例分析

今天给大家分享下最近小编帮助学员解决的几个经典数字IC后端项目问题。希望能够对大家的学习和工作有所帮助。 数字IC后端项目典型问题之后端实战项目问题记录&#xff08;2025.04.24&#xff09; 数字IC后端设计实现培训教程&#xff08;整理版&#xff09; Q1: 老师好&…

window 显示驱动开发-将虚拟地址映射到内存段(二)

在将虚拟地址映射到段的一部分之前&#xff0c;视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数&#xff0c;以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈&#xff0c;也不能更改分配…

Termius ssh连接服务器 vim打开的文件无法复制问题

你的问题是&#xff1a; • 在 Termius (macOS) SSH 连接到 VMware Ubuntu&#xff0c;使用 vim 打开 .cpp 文件时&#xff0c;可以复制文本&#xff1b; • 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 时&#xff0c;复制操作无效。 ⸻ &#x1f3af; 初步分析 复制…

杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】

基于SSMJSP鲜花商城系统 随着电子商务的快速发展&#xff0c;鲜花在线销售已成为一种重要的消费模式。本文设计并实现了一个基于JSP技术的鲜花销售管理系统&#xff0c;采用B/S架构&#xff0c;使用SSM框架进行开发&#xff0c;并结合Maven进行项目依赖管理。系统分为前台用户模…

集成学习——Bagging,Boosting

一.什么是集成学习 集成学习的基本思想是通过结合多个基学习器的预测结果&#xff0c;来提高模型的泛化能力和稳定性。这些基学习器可以是相同类型的算法&#xff0c;也可以是不同类型的算法。 当基学习器之间具有一定的差异性时&#xff0c;它们在面对不同的样本子集或特征子…

【笔试训练】给一个数组构建二叉树|从前序遍历与中序遍历构建二叉树|二叉树中的最大路径和

文章目录 1.给一个数组构建二叉树2.从前序遍历和中序遍历构建二叉树3.二叉树中的最大路径和 1.给一个数组构建二叉树 思路&#xff1a;就是借助一个队列实现层序遍历的思想。 先将root节点入队列&#xff0c;构造左右节点后&#xff0c;root取出来时&#xff0c;将其左右孩子都…

Swift实战:如何优雅地从二叉搜索树中挑出最接近的K个值

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结未来展望 摘要 在日常开发中&#xff0c;我们经常会遇到“在一堆数据中找出最接近某个值”的需求。尤其在搜索引擎、推荐系统或者地理坐标匹配中&#xff0c;这种“最近匹配”的问题非常常见。Le…

Linux512 ssh免密登录 ssh配置回顾

下载MX 官网 参考 OK 登个tom试试 然后再计划登个RealServer 计划再用仅主机网卡试试 连不上 看来要通过JumpServer再联 通过网卡访问 被踢掉了 成功通过跳板机JumpServer登入到RealServer 方法一免密登录 现计划尝试方法二 只有1个tom 我连了两个tom 看来是根据IP划…