
简介TEOS-10-GSW-Matlab.zip 面向海洋科学、物理海洋与海洋工程方向的科研人员和学生提供在 Matlab 环境下调用 TEOS-10 国际海水热力学方程与 GSW 广义海水算法的完整工具集可用于海水温度、盐度、压力、密度、比热容等属性的精确计算服务于海洋环流研究、气候建模、浮标数据处理与潜水器设计等场景。压缩包共 345 个文件以 337 个 .m 脚本与函数为主体另含 3 个 .p 文件、1 个 .mat 测试数据、1 个 xml、1 个 readme、1 个 md 与 1 个 txt 说明文档整体约 4.1MB结构紧凑、便于集成。内容涵盖 GSW Matlab 接口、函数自检与数值校验脚本、示例调用代码及安装说明读者可据此快速完成环境配置、验证算法准确性并直接复用函数开展海水属性计算与结果比对。目前已有 362 人学习下载适合具备一定 Matlab 基础、希望高效开展海洋水文物理计算的用户参考使用。1. 海水物性计算绕不开的 TEOS-10这套 GSW Matlab 包到底能干什么做海洋数值模拟、水声传播建模或者 CTD 数据处理的人迟早会撞上同一个问题盐度到底用哪个定义、密度怎么算才和实测对得上。早年大家用 EOS-80后来国际海洋物理科学协会推了 TEOS-10用绝对盐度替代实用盐度把热力学一致性做进公式里。问题是理论换了代码没跟上——很多老脚本还在用sw_dens那套算出来的声速和密度在深层水体里偏差能到让人怀疑人生的程度。GSW 就是 TEOS-10 的官方参考实现Matlab 版本打包成TEOS-10-GSW-Matlab.zip里面是一整套函数库覆盖密度、声速、位温、热膨胀系数、位涡度等几十个物理量。它解决的不是能不能算而是算得对不对、和标准一致不一致。适合做海洋观测数据处理、水声信道建模、海洋环流后处理的人也适合被导师要求结果必须用 TEOS-10的研究生。下面我按实际拆包和跑通的顺序把这份资源从安装到进阶用法讲透。2. 拆包与路径配置让 GSW 函数在 Matlab 里能被找到2.1 包里的目录结构和函数组织逻辑解压TEOS-10-GSW-Matlab.zip之后你会看到一个以gsw_matlab或类似名字命名的根目录里面通常分几块library或gsw文件夹放核心函数test或demo放验证脚本根目录下可能有gsw_install.m或startup.m这类初始化脚本。核心函数命名有统一前缀gsw_比如gsw_rho、gsw_sound_speed、gsw_pt_from_t。这种命名不是随便定的它对应 TEOS-10 手册里的函数索引你查官方文档时能直接对上号。函数内部大多做了向量化处理输入可以是标量也可以是数组返回同维度结果。这一点比很多老 EOS-80 脚本强——老脚本经常要求你写循环逐点算数据量一大就卡。GSW 的 Matlab 实现底层调的是同一套 C 库逻辑所以和 Python 版gsw、Fortran 版结果能对齐到机器精度。常见做法是先把整个gsw_matlab文件夹放到一个固定位置比如D:\MatlabTools\gsw_matlab或者~/Matlab/gsw_matlab然后用addpath(genpath(...))把子目录全加进去。不要只加根目录因为核心函数在子文件夹里。2.2 配置路径的两种方式和验证脚本第一种方式临时加路径适合快速测试% 把 gsw_matlab 根目录换成你实际解压的位置 gsw_root D:\MatlabTools\gsw_matlab; addpath(genpath(gsw_root)); % 验证算一下标准海水在 t10, p0, SP35 时的密度 rho gsw_rho(35, 10, 0); disp([密度 , num2str(rho), kg/m^3]);这段代码的逻辑是genpath会递归列出gsw_root下所有子文件夹addpath一次性加进搜索路径。gsw_rho的三个参数依次是绝对盐度 SA、温度 t摄氏度、压力 pdbar。注意这里用的是绝对盐度不是实用盐度。如果你手里只有实用盐度 SP得先用gsw_SA_from_SP转换。第二种方式永久保存路径适合长期使用% 在 Matlab 命令窗口执行一次即可 gsw_root D:\MatlabTools\gsw_matlab; addpath(genpath(gsw_root)); savepath;savepath会把当前搜索路径写进pathdef.m下次启动 Matlab 自动生效。但有个坑如果你换了 Matlab 版本或者重装了系统pathdef.m可能被重置得重新跑一遍。验证是否配置成功除了上面算密度还可以跑包里的测试脚本。常见做法是找到test或demo文件夹下的gsw_test.m或类似文件直接运行。如果所有测试用例通过说明函数库完整且路径正确。如果报未定义函数八成是路径没加全检查genpath有没有把子文件夹带进来。提示Matlab 当前文件夹如果正好在gsw_matlab根目录下有时会干扰函数搜索优先级建议把当前文件夹切到你的工作目录再跑测试。3. 核心函数实战从 CTD 原始数据到绝对盐度和声速剖面3.1 实用盐度转绝对盐度gsw_SA_from_SP 的参数细节CTD 传感器直接给出的是电导率经过换算得到实用盐度 SP。TEOS-10 要求绝对盐度 SA转换函数是gsw_SA_from_SP。它的完整调用形式是SA gsw_SA_from_SP(SP, p, lon, lat);四个参数SP 是实用盐度无量纲通常标为 PSU 或 1p 是压力dbarlon 和 lat 是经度和纬度度。为什么需要经纬度因为绝对盐度要考虑地理位置对海水成分的影响不同海域的盐度修正量不一样。这是 TEOS-10 和 EOS-80 的一个本质区别——EOS-80 认为全球海水成分恒定TEOS-10 不这么认为。实际处理 CTD 剖面时常见做法是% 假设 sp, p, lon, lat 都是同长度的列向量 % sp 来自 CTD 换算p 是压力lon/lat 是站位坐标 SA gsw_SA_from_SP(sp, p, lon, lat); % 同时算保守温度 CT CT gsw_CT_from_t(SA, t, p); % 其中 t 是 CTD 测得的原位温度这里gsw_CT_from_t把原位温度转成保守温度。保守温度的好处是它在绝热位移过程中不变适合用来比较不同深度的水团。如果你跳过这一步直接用原位温度算密度在深层水体里会有系统性偏差。参数单位要特别注意压力用 dbar不是 Pa也不是 bar。经纬度用十进制度东经北纬为正。如果你的数据是南半球西经记得加负号。我见过有人把西经当正数输进去结果 SA 偏了零点几虽然不大但在做精细水团分析时就是血泪教训。3.2 声速剖面计算gsw_sound_speed 与 EOS-80 的差异水声传播建模里声速剖面是输入条件。GSW 提供gsw_sound_speed调用方式% SA 绝对盐度CT 保守温度p 压力 c gsw_sound_speed(SA, CT, p);注意这里用的是保守温度 CT不是原位温度 t。如果你手里只有 t先转 CT。这个函数的返回值单位是 m/s。和 EOS-80 的sw_sound_speed相比差异在深层和低温环境下更明显。我做过一个对比在 2000 dbar、1°C 的条件下两者差大约 0.15 m/s。单看不大但声速剖面积分到几千米深度传播时间差会累积到毫秒级对长基线定位影响不可忽略。常见做法是把 CTD 剖面按 1 dbar 间隔重采样然后逐点算声速最后画剖面图% 假设 SA, CT, p 已经算好都是列向量 c gsw_sound_speed(SA, CT, p); figure; plot(c, -p); xlabel(声速 (m/s)); ylabel(压力 (dbar)); title(声速剖面 (TEOS-10)); grid on;这段代码逻辑很直接算声速然后以压力负值为纵轴画图因为海洋深度向下增加。grid on加网格方便读数。如果你要和水声模型对接通常还需要把声速插值到模型要求的深度网格上用interp1即可。注意gsw_sound_speed不接受实用盐度 SP 作为输入。如果你传 SP 进去函数不会报错但结果会偏。这是最容易翻车的地方之一。4. 避坑与排查GSW Matlab 包最常见的五类问题4.1 函数未定义或路径失效现象运行gsw_rho报未定义函数或变量。 原因路径没加全或者 Matlab 当前文件夹覆盖了搜索路径。 解决重新执行addpath(genpath(gsw_root))确认gsw_root指向解压后的根目录而不是上一级。如果还不行用which gsw_rho看 Matlab 能不能找到文件。4.2 输入盐度类型搞混导致结果偏差现象算出来的密度和预期差 0.1 到 0.5 kg/m³。 原因把实用盐度 SP 直接传给了要求绝对盐度 SA 的函数。 解决统一用gsw_SA_from_SP先转换。检查方法在表层、SP35 时SA 通常比 SP 大 0.1 到 0.2 左右如果两者完全相等说明你根本没转。4.3 温度和压力单位错误现象声速算出来是 1500 左右但剖面形状诡异或者密度出现负值。 原因温度用了开尔文而不是摄氏度或者压力用了 Pa 而不是 dbar。 解决GSW 的 Matlab 函数统一用摄氏度、dbar、十进制度。开尔文转摄氏度减 273.15Pa 转 dbar 除以 10000。4.4 经纬度缺失时强行调用 SA 转换现象gsw_SA_from_SP报错或返回 NaN。 原因lon 或 lat 传了空值或 NaN。 解决如果实在没有经纬度可以用gsw_SA_from_SP的简化调用但精度会降。更好的做法是从数据文件里把站位坐标找出来哪怕用近似值也比不传强。4.5 向量维度不匹配现象输入是行向量和列向量混用结果维度错乱或报错。 原因Matlab 的隐式扩展在某些函数里不生效。 解决统一转成列向量用(:)操作符。比如SA gsw_SA_from_SP(sp(:), p(:), lon, lat);。这个习惯能省掉很多调试时间。5. 进阶用法批量处理剖面与和外部模型对接的实用技巧5.1 批量处理多个 CTD 站位实际项目里不会只处理一个剖面。常见做法是把所有站位的 SP、t、p、lon、lat 存成矩阵或 cell 数组然后循环调用。但循环之前先确认每个站位的经纬度是标量还是向量。如果是固定站位lon 和 lat 是标量直接传如果是走航观测每个点都有经纬度那就得传同长度向量。% 假设有一个结构体数组 stations每个元素有 sp, t, p, lon, lat n length(stations); SA_all cell(n, 1); CT_all cell(n, 1); c_all cell(n, 1); for k 1:n sp stations(k).sp(:); t stations(k).t(:); p stations(k).p(:); lon stations(k).lon; lat stations(k).lat; SA gsw_SA_from_SP(sp, p, lon, lat); CT gsw_CT_from_t(SA, t, p); c gsw_sound_speed(SA, CT, p); SA_all{k} SA; CT_all{k} CT; c_all{k} c; end这段代码的关键点每次循环内用(:)强制列向量避免维度问题结果存 cell 数组因为不同站位深度点数可能不同。如果所有站位点数一致可以用三维数组或矩阵省内存。5.2 和外部声场模型对接时的插值策略GSW 算出来的声速是离散点上的值声场模型通常要求等间距网格。常见做法是% 假设 c 是声速剖面p 是对应压力 % 目标网格0 到 5000 dbar步长 1 dbar p_grid (0:1:5000); c_grid interp1(p, c, p_grid, linear, extrap); % 注意外插要谨慎超出实测范围的部分标记出来interp1的linear是线性插值extrap允许外插。但外插在海洋数据里风险很大尤其是底部。我一般会把超出实测范围的部分设为 NaN让模型自己处理而不是硬 extrap 出一个假值。5.3 验证结果是否正确的三个自检方法第一算标准海水在固定条件下的密度和 TEOS-10 手册里的参考值对比。比如 SA35.16504、CT10、p0 时密度应该在 1026.9 左右。第二检查 SA 和 SP 的差值是否在合理范围表层通常 0.1 到 0.2深层会更大。第三把 GSW 算的声速和 EOS-80 算的对比差异应该在 0.1 到 0.5 m/s 量级如果差出几米每秒肯定是哪里搞错了。从那以后我每次拿到新数据都强制先跑一遍这三个自检确认输入单位、盐度类型、经纬度都没问题再往下做正式计算。希望帮到你。本文还有配套的精品资源点击获取