新闻详情

新闻详情

首页 / 资讯中心 / 详情

MATLAB seawater工具包:从CTD数据到位温、密度与T-S图分析

发布时间:2026/9/20 18:47:54来源:尧图网络
MATLAB seawater工具包:从CTD数据到位温、密度与T-S图分析
简介Matlab seawater工具包是一套专为海洋科学计算设计的扩展库面向海洋科研人员、工程师及高校相关专业学生用于在Matlab环境中精确计算海水物理性质与进行海洋动力学模拟。包内含40个m文件整体压缩包约55KB涵盖密度、声速、比热容、焓值、盐度-电导率转换、浮力频率、压力转换等核心函数并附标准化与单位换算辅助工具便于直接调用与二次开发。工具基于Tom McDougall和John Taylor算法实现支持海水状态方程、潜热计算等底层物理过程能够大幅简化海洋建模与数据分析中的复杂数学处理。目前已有1615人学习下载适合需要处理海水实测数据、开展海洋声学或热力学研究、进行海洋环境数值模拟的中高级用户是海洋物理计算中实用且轻量的基础工具包。 第一次意识到seawater工具包的价值是在处理一组南海CTD剖面数据时。当时我要从原始的温盐深记录里算出位温和密度来做水团分析手写状态方程算出来的结果总是跟文献对不上后来才发现问题出在温度尺度和压力单位上。换成Matlab的seawater工具包之后折腾了两天的计算变成了十几行代码结果跟国际公开数据集完全一致。如果你也经常跟CTD、Argo浮标或海洋模式输出数据打交道这个工具包几乎可以算作海洋学数据处理的标配。1. 从CTD原始数据到科学变量seawater为什么是海洋数据处理的标配1.1 CTD到底测了什么电导率、温度、压力与盐度的换算关系很多人第一次接触CTDConductivity-Temperature-Depth温盐深仪时会误以为盐度是直接测出来的。实际上CTD最核心的原始输出是电导率、温度和压力其中电阻率传感器的电导率测量值需要经过换算才能得到实用盐度Practical Salinity。这个换算涉及PSS-78实用盐度标度包含复杂的多项式拟合手算不现实正是seawater这类工具包存在的理由。温度也不是我们平时说的水温那么简单。CTD探头测的是原位温度in-situ temperature但在物理海洋学分析中更多时候需要的是位温potential temperature即水团绝热移动到海面或某个参考压力后应该具有的温度。深海4000米处原位温度可能是2°C位温却可能接近-1°C两者差值随压力增大而增大这在深层水团分析中是不能忽略的。压力同样有讲究。CTD输出的压力单位是分巴dbar1 dbar约等于1米水深但严格来说这个换算依赖于纬度重力加速度差异。seawater中的sw_pres函数专门处理深度到压力的转换输入深度和纬度就能得到准确的分巴值省去了手工查表或者用近似公式的麻烦。1.2 seawater工具包的来龙去脉EOS-80标准与CSIRO的实现seawater工具包由澳大利亚联邦科学与工业研究组织CSIRO海洋研究室的Phil Morgan等人开发核心是实现了UNESCO 1980年海水状态方程简称EOS-80。这套方程是20世纪80年代以来物理海洋学计算密度、声速、比容等热力学性质的事实标准绝大多数海洋学教材和经典文献中的数据都基于它。工具包从2.0版本发展到现在的3.3.x系列全部是纯MATLAB m文件实现没有编译依赖没有工具箱依赖复制到本地就能用。3.x版本的一个重要更新是把温度基准从IPTS-68国际实用温标切换到了ITS-90国际温标这使得它和现代CTD传感器的输出标准保持一致。老版本2.0在Matlab R2016a之后的版本上会出现一些警告提示但核心计算函数仍然可以运行只是温度尺度需要手动修正。整套工具包的函数命名非常有规律全部以sw_开头后面跟着物理量的缩写比如sw_ptmp表示potential temperature位温sw_dens表示density密度sw_vel表示sound velocity声速。这种命名约定让使用者不需要记忆大量散乱的函数名看到函数名就能猜到用途。1.3 常用函数一览一张表看清sw_家族以下是我在实际数据处理中最常用到的函数它们覆盖了CTD数据后处理90%以上的需求。函数功能典型调用sw_ptmp位温计算sw_ptmp(S,T,P,PR)sw_dens原位密度sw_dens(S,T,P)sw_pden位势密度势密度sw_pden(S,T,P,PR)sw_dens0海表密度0 dbarsw_dens0(S,T)sw_vel声速sw_vel(S,T,P)sw_salt电导率换算盐度sw_salt(C,T,P)sw_cp比热容sw_cp(S,T,P)sw_alpha热膨胀系数sw_alpha(S,T,P)sw_beta盐收缩系数sw_beta(S,T,P)sw_pres深度换算压力sw_pres(DEPTH,LAT)sw_dpth压力换算深度sw_dpth(P,LAT)sw_f科里奥利参数sw_f(LAT)其中sw_salt是处理原始CTD数据的第一步因为它把电导率C单位S/m结合温度和压力换算成盐度。很多刚入门的同学不知道这一步直接用CTD导出数据里的盐度字段如果那个字段已经是仪器软件换算好的还好说如果只是原始电导率后面所有计算都会出问题。2. 安装与路径配置让老工具包在新版MATLAB里跑起来2.1 三步完成安装下载、解压、addpathseawater工具包的安装是我见过最省事的一个不需要install函数不需要编译不需要配置环境变量。下载方式主要有两个途径CSIRO官网的seawater主页以及GitHub上的seawater仓库。下载后得到一个zip压缩包解压出来是一个名为seawater的文件夹。打开MATLAB在主页选项卡里找到设置路径或Set Path点击添加并包含子文件夹选中刚才解压出来的seawater文件夹然后点击保存。如果想用命令行完成直接在命令窗口输入addpath(genpath(你的路径/seawater)); savepath;注意genpath会把子文件夹也加进去这个工具包内部有test等子目录加进去不影响使用。验证是否安装成功很简单which sw_ptmp如果返回了seawater文件夹下的路径说明安装成功。这个验证步骤我建议每次装完都做一次因为我自己遇到过解压路径带了空格导致路径识别失败的情况which命令能最快暴露问题。2.2 版本差异与温度尺度IPTS-68和ITS-90的坑seawater 3.x版本与2.x版本最核心的差异在于温度基准。EOS-80本身是基于IPTS-68温标建立的而现代CTD和温度传感器都使用ITS-90温标。如果输入的温度是ITS-90但工具包按IPTS-68计算产生的误差虽然极小海洋温度范围内约0.005°C但在计算密度、位温时会被放大尤其是在深层冷水区域。判断你手上的seawater是哪个版本可以在MATLAB里输入help sw_ptmp如果帮助文本明确写了Temperature in ITS-90就是3.x系列。如果是3.2之后的版本还支持在函数调用时通过第四个参数设置温标。我个人建议直接下载3.3版本因为现在绝大部分CTD数据已经是ITS-90了没必要为了兼容旧数据自找麻烦。如果你确实需要处理一批老文献或老航次数据而这些数据记录的是IPTS-68温度那就在输入seawater函数前先做一次转换ITS-90温度约等于IPTS-68温度乘以0.99997再减去0.00004这个近似在海洋温度范围内足够用了。但说实话现在遇到这种情况的概率很低更多时候是反过来的——新用户误以为seawater还在用旧温标结果多此一举。2.3 与gsw工具箱并存函数前缀不同互不干扰很多人在装了seawater之后又因为期刊要求而装了gsw工具箱TEOS-10标准的官方实现。这两个工具箱能不能共存答案是肯定的。gsw的所有函数都以gsw_开头与sw_开头的seawater函数完全不会重名两者可以安全地同时出现在MATLAB路径里。但我有一条经验要提醒同一个脚本里不要混用两个标准下的函数。比如你用sw_ptmp算出了位温然后把它传给gsw_rho去算密度这在概念上是不对的因为gsw是基于绝对盐度和保守温度的。跨标准混用会导致结果在近岸、河口等区域出现明显偏差。我的做法是要么全部用seawater处理到底要么全部用gsw处理到底只在最后输出图件时做交叉验证对比。3. 核心函数实战从CTD剖面到位温、密度与T-S图3.1 第一步从深度计算压力输入数据维度别搞错拿到一次CTD下放的数据后第一步通常是把深度换算成压力。这里要先弄清楚你的CTD数据里保存的是深度还是压力。大部分科研级CTD如Seabird SBE 911plus同时输出深度和压力两个通道但有些近岸小型仪器只给深度。如果只有深度用sw_pres换算depth (0:10:2000); % 深度单位米 lat 20; % 站位纬度单位度 p sw_pres(depth, lat); % 压力单位dbar输入维度的问题在这里就要注意depth是201×1的列向量lat是标量。在Matlab R2016b之后的版本里标量会自动扩展计算没问题。但如果你用的是旧版本或者lat本身是一个与depth等长的向量比如航次中纬度一直在变化就必须保证两者形状一致否则会报维度错误。3.2 第二步位温计算sw_ptmp参考压力是关键参数位温是水团分析里绕不开的量。它的物理含义很直观取一团水假设它被绝热地从深度P移动到参考压力PR在移动过程中没有与外界发生热量交换那么它在PR处应该具有的温度就是位温。绝热压缩和膨胀只会改变温度所以深海的冷而高压的水团被移到海面时会因为减压膨胀而进一步降温。sw_ptmp的函数签名是theta sw_ptmp(S, T, P, PR)其中S是盐度T是原位温度度ITS-90P是原位压力dbarPR是参考压力dbar。最常用的参考压力是0表示把水团绝热移动到海面得到的就是我们常说的potential temperature海表位温。如果你研究的是某个特定深度层的水团也可以把PR设为那个层的压力比如中层水分析常用1000 dbar。我见过不少同学把PR参数漏掉或者随意填一个数这样算出来的位温完全不可比。位温必须说明参考压力才有意义这是所有物理海洋学教材都会强调的。3.3 第三步密度、声速与T-S图密度计算有两种原位密度和位势密度。原位密度就是给定盐度、温度、压力状态下的实际密度用sw_dens算rho sw_dens(S, T, P); % 原位密度单位kg/m^3 sigma_t rho - 1000; % 密度异常sigma-t位势密度则是以某个参考压力为基准的密度它消除了压缩效应用于比较不同深度水团的轻重。常用的是参考0 dbar的位势密度异常也就是sigma-thetasigma_theta sw_pden(S, T, P, 0) - 1000;声速是声学海流计和声呐数据处理中的重要输入seawater里一行代码就能算c sw_vel(S, T, P); % 单位m/s密度和声速算出来后最常见的数据可视化就是T-S图。T-S图的核心价值在于可以把一个剖面的水团特征压缩到一张二维图上横轴是盐度纵轴是温度背景叠加等密度线。相同水团在T-S图上会聚成一团不同水团的混合过程则表现为一条直线或曲线。3.4 完整示例一个2000米CTD剖面的全流程我写了一个完整的处理脚本从模拟CTD剖面到最终出图你可以直接替换成自己的数据来跑% 模拟一次CTD剖面 % 深度序列0~2000米间隔10米 depth (0:10:2000); lat 20; % 北纬20度 % 由深度计算压力单位dbar p sw_pres(depth, lat); % 模拟温度剖面海表约28.5°C随深度递减 t 28.5 - 25 * (1 - exp(-depth/300)); % 模拟盐度剖面次表层盐度最大值深层均匀 s 34.6 0.5 * exp(-((depth - 200)/80).^2) 0.2 * depth/2000; % 计算位温 % 参考压力0 dbar即海表位温 theta sw_ptmp(s, t, p, 0); % 计算密度 % 原位密度与sigma-t rho sw_dens(s, t, p); sigma_t rho - 1000; % 位势密度异常参考0 dbar sigma_theta sw_pden(s, t, p, 0) - 1000; % 计算声速 c sw_vel(s, t, p); % 绘制T-S图叠加等密度线 figure(Color, w, Position, [100 100 750 500]); % 等密度线背景网格 s_grid linspace(34, 36, 80); t_grid linspace(0, 30, 80); [Sg, Tg] meshgrid(s_grid, t_grid); sigma_grid sw_dens0(Sg, Tg) - 1000; contour(Sg, Tg, sigma_grid, [21 22 23 24 25 26 27 28], k--, LineWidth, 0.6); hold on; % CTD剖面散点颜色表示深度 scatter(s, t, 18, depth, filled); colormap(jet); colorbar; xlabel(盐度 (PSS-78)); ylabel(温度 (°C)); axis([34 36 0 30]); title(T-S图散点颜色代表深度); grid on;运行之后你会看到一条从高温高盐端向低温方向延伸的曲线散点颜色从红色逐渐变为蓝色代表从表层到深层的过渡。这个图能直观看出次表层盐度最大值对应的温度范围以及深层水团是否接近线性混合这是做水团分析的基本功。4. 最容易踩的坑单位、参考压力与数据维度4.1 分巴与米什么时候能混用什么时候不能很多老海洋学家习惯说800米处的密度但代码里用的是800 dbar。这在大洋中上层问题不大因为1 dbar约等于1.0197米水柱误差不到2%。但在深海中这个误差会累积如果用米代替分巴直接把2000米写成2000 dbar密度计算在深层会有可见偏差对精密研究如地转流计算是不可接受的。正确的做法是从CTD压力通道直接读取压力如果只有深度通道务必用sw_pres换算。反过来也一样如果你需要把等密度面深度画出来先用sw_dpth把压力换回深度别自己除以1.02。4.2 盐度没有单位PSS-78实用盐度的语义问题PSS-78实用盐度在定义上是无量纲的因为它本质上是电导率比值的函数比值抵消了单位。但为了方便书写和交流文献里普遍写成PSUPractical Salinity Unit或者直接写Salinity并标注PSS-78。我在图件坐标轴上一般写盐度 (PSS-78)或者Salinity不写PSU因为严格来说PSS-78不是一个单位制。这个细节在投稿时会被审稿人注意。如果你在论文里写salinity in PSU有些较真的审稿人会要求改成PSS-78或直接删除单位。我自己就因为这个被改过一次后来养成了习惯图上标注PSS-78文中第一次出现时写清楚practical salinity (PSS-78)之后统一用S表示。4.3 位温参考压力是哪个说位温之前必须先说参考多少位温这个名词如果不带参考压力是没有明确指向的。默认情况下海表位温的参考压力是0 dbar这也是大多数文献里potential temperature的含义。但如果你研究的是深层水团有人会用1000 dbar或2000 dbar作为参考压力这样算出来的位温数值会有差异在对比文献时如果不注意参考压力很容易得出错误结论。同理位势密度有各种命名sigma-theta参考0 dbar、sigma-1参考1000 dbar、sigma-2参考2000 dbar、sigma-4参考4000 dbar。seawater的sw_pden通过PR参数区分PR0算出来的是sigma-thetaPR1000是sigma-1以此类推。引用别人数据时先看方法部分写的是哪个sigma。4.4 MATLAB旧版本与隐式扩展问题seawater函数支持标量、向量、矩阵输入但要求所有输入的维度可以广播。Matlab R2016b之前没有隐式扩展功能如果你传入的盐度是201×1向量、温度是1×201矩阵函数会报错。现在的新版本大多数情况能自动扩展但为了代码健壮性建议在调用前用size函数检查一下输入维度。还有一个容易被忽略的点sw_salt电导率换算盐度的输入电导率单位是S/m也就是西门子每米。有些CTD厂商导出的电导率单位是mS/cm毫西门子每厘米两者相差10倍如果不换算直接代入算出来的盐度会完全离谱。我每次处理新航次数据时都会先随机抽几个值手工核对一下盐度范围如果表层盐度算出35但实际应该在33左右第一反应就查单位换算。5. 要不要换TEOS-10两个标准的比较与我的建议5.1 EOS-80和TEOS-10到底差在哪这里不展开复杂的数学推导只说核心差异。TEOS-10是2010年国际海洋学组织推荐的新标准它用Gibbs函数热力学势代替了EOS-80的经验多项式拟合。两者对盐度的定义不同EOS-80用实用盐度SP基于电导率TEOS-10用绝对盐度SA考虑了海水化学成分的微小变化。温度方面TEOS-10引入了保守温度CT代替位温理论上在能量守恒上更自洽。差异有多大对外海开阔海域的大多数工况seawater和gsw工具箱计算出来的密度差在0.005到0.01 kg/m^3量级位温差在0.01°C以内。这个误差对大多数物理海洋学分析来说可以忽略。但在近岸淡水注入区、冰川融水影响区、海底热液口附近由于海水成分偏离标准海水SA与SP的差异会明显变大密度偏差可能达到0.1 kg/m^3以上这时候必须用TEOS-10。对比项seawater (EOS-80)gsw (TEOS-10)盐度定义实用盐度SP (PSS-78)绝对盐度SA温度变量位温theta保守温度CT理论基础经验多项式拟合Gibbs函数热力学势计算成本低较高依赖gsw工具箱近岸/河口适用性一般更好安装复杂度轻量纯m文件依赖gsw工具箱5.2 什么场景继续用seawater什么场景该换gsw我的经验是分三种情况。第一种日常快速处理和教学演示用seawater。它轻量、直观、函数命名好记学生们学起来没有负担。画T-S图、算个密度剖面sw_ptmp和sw_dens两行代码搞定效率很高。第二种正式发表论文且研究区域在开阔大洋seawater的结果完全够用。很多高档次海洋学期刊并没有强制要求TEOS-10只要你能在方法部分清楚说明自己用的状态方程版本审稿人一般不会纠结。但要注意图件和表格里标清楚计算方法避免被质疑。第三种研究区域有明显淡水影响、需要高精度能量收支分析、或者期刊明确要求TEOS-10标准这时候直接上gsw工具箱。gsw的官方文档写得非常详细每个函数都有理论背景和引用文献写方法部分很方便。5.3 实测对比同一组CTD数据在两个标准下的差异我曾经拿一组西北太平洋开阔海域的CTD数据分别用seawater和gsw算过密度剖面。在1000米以浅两者sigma-t差异基本在0.005以内2500米以深差异略微增大但也没超过0.01。这个量级对地转流计算的影响几乎可以忽略。但在一次处理长江口附近数据时近岸低盐站位表层密度的差异就明显了能达到0.08到0.1。原因很简单长江冲淡水改变了局地海水离子组成实用盐度SP无法反映这部分成分变化只有绝对盐度SA能通过经纬度和深度信息做修正。那次之后我养成了一个习惯先看站位离岸距离和水深再决定用哪个工具包。我现在的做法是日常快速分析和教学用seawater正式发表研究用gsw。如果你也经常跟CTD数据打交道建议两个都装上反正不冲突。最后提醒一句不管用哪个工具包拿到数据第一件事先确认单位和温度尺度别急着跑函数。这个教训是我用无数次返工换来的希望你能少走一次弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

大学物理波动章节考点精讲:课后习题与答案高效复习指南 2026/9/20 19:29:59

大学物理波动章节考点精讲:课后习题与答案高效复习指南

简介:这份PDF是大学物理(第四版)波动章节的课后习题与答案解析,面向正在学习波动理论的理工科本科生及备考期末的考生。内容以第十四章波动为核心,系统覆盖波动方程、振幅、波速、频率、波长、横波、相位差等基础概念&…

阅读更多 →
Hermes Agent 的 Profile 与 Cron 不走官方模型通道,改走 TaoToken 通道行不行 2026/9/20 19:29:59

Hermes Agent 的 Profile 与 Cron 不走官方模型通道,改走 TaoToken 通道行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
宝塔线指标公式详解:5分钟周期实战源码与参数调优 2026/9/20 19:29:59

宝塔线指标公式详解:5分钟周期实战源码与参数调优

简介:文华财经期货5分钟宝塔线指标公式源码以doc文档形式提供,主要面向期货交易者、文华财经软件用户以及希望学习指标编写的人。文档内含一套完整公式代码,聚焦5分钟周期下的宝塔线及相关多空信号,涵盖均线多空排列、量托价托、金…

阅读更多 →
Matlab实现Transformer-LSTM混合模型用于时间序列预测及GUI设计 2026/9/20 19:29:59

Matlab实现Transformer-LSTM混合模型用于时间序列预测及GUI设计

简介:Matlab实现Transformer-LSTM时间序列预测的完整项目实例,面向深度学习与时间序列预测方向的研究生、科研人员及数据分析从业者。包内为1个docx文档(约55KB),系统阐述了混合模型应对长短期依赖与非线性特征的思路&…

阅读更多 →
计算机网络实验报告写作指南:Wireshark抓包与Socket编程实战 2026/9/20 19:29:59

计算机网络实验报告写作指南:Wireshark抓包与Socket编程实战

简介:西北工业大学软件学院计算机网络实验报告,面向计算机网络课程学习者,系统呈现HTTP协议四大实验的完整分析与答题框架。报告以Wireshark抓包为主线,涵盖基础GET/响应交互、条件GET、长文档检索、HTML嵌入对象等场景&#xff0…

阅读更多 →
为什么 OpenClaw Gateway 一直离线?TaoToken 这样修模型通道 2026/9/20 19:26:59

为什么 OpenClaw Gateway 一直离线?TaoToken 这样修模型通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞