尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MATLAB一维河道水动力模型实战:圣维南方程与Preissmann格式实现

MATLAB一维河道水动力模型实战:圣维南方程与Preissmann格式实现 简介本资源是一套面向水文学、水利工程专业师生及科研工程师的Matlab一维水动力建模工具聚焦矩形河道中流速与水深的动态模拟适用于洪水演进分析、渠道设计校核及河流管理等实际场景。压缩包共4个文件323KB含2个Excel数据表用于输入边界条件、糙率参数及初始工况和2个核心M文件主计算程序与测试脚本完整实现基于圣维南方程组的有限差分求解流程涵盖连续性方程与动量方程耦合、非恒定流边界处理及结果可视化功能。已有1603人学习下载代码结构清晰、模块分工明确附带可直接运行的示例配置便于用户快速上手调试、理解数值离散逻辑并支持根据实际河道参数进行二次开发与验证。 去年年底接了一个河道防洪影响评价的项目要计算一条山区河流在50年一遇洪水下的沿程水位和流量过程。项目本身不复杂但方案改了又改从初设到施工图每个阶段都要重新出水面线HEC-RAS虽然点几下就能出结果可大量重复计算、批量调参、结果打包成了最磨人的事。后来我干脆用MATLAB自己搭了一维河道水动力模型把整个流程固化下来估算一个方案从改数据到出图只要十几分钟彻底解脱了。写这篇东西主要是想把这套模型的思路、公式、代码框架和踩过的坑完整复盘一遍。内容面向有水利或数值计算基础、但没系统写过水动力代码的朋友。一维河道模型常用在洪灾风险图、涉河工程影响分析、调度方案比选、感潮河段潮位传播等场景虽然理论上说圣维南方程组大学都学过但从公式到一套能出结果的代码中间隔着不少细节。我把自己实际项目里的做法讲清楚包括方程离散、矩阵组装、边界条件处理、糙率率定、常见问题排查希望你能少走一些弯路。1. 项目背景与模型选型思考1.1 什么场景下你需要自己写一维河道水动力模型市面上现成的水动力软件很多HEC-RAS、MIKE 11、SOBEK、InfoWorks ICM都用得挺多。如果你只需要算一次水面线我完全不建议自己写代码直接HEC-RAS或者MIKE 11界面点一点资料整理一下就能出成果。我自己用HEC-RAS用了好几年直到遇到三个痛点才决定转手写代码。第一个痛点是批量计算。比如防洪影响评价常要比较不同洪水频率、不同工程方案、不同调度方式算几十个甚至上百个组合。用HEC-RAS也不是不能做但每次都要改边界条件、跑模型、导出结果脚本化很别扭。MATLAB里可以循环跑结果直接存成结构体后面画图、统计最大值都非常顺。第二个痛点是和地形、糙率等数据的衔接。项目里断面地形常是Excel表格有些是测绘的DWG提取出来的HEC-RAS需要转换成它的GIS格式中间容易出问题。自己写代码断面数据就按自己的数据结构来读Excel、读CSV都方便处理起来灵活很多。第三个痛点是流程图表现。领导常要“沿程水位包络线”“某断面水位过程线”“洪水演进动画”这种图。MATLAB画图是真方便一行plot就行还能批量生成、自动排版HEC-RAS的图导出反而麻烦。另外还有一个场景必须自己写代码模型耦合。比如要做一维河网和二维洪泛区耦合或者和水质模型、泥沙模型耦合HEC-RAS的内部功能扩展性不够自己写代码能控制一切细节。1.2 为什么选MATLAB而不是python或Fortran我听到最多的问题就是“都什么年代了还用MATLAB”。这个得看项目环境。我做这个项目时团队里其他人都在用MATLAB做数据处理和作图模型代码要交给别人维护选它能降低协作成本。MATLAB的矩阵运算和稀疏矩阵求解实在方便一个反斜杠就把线性方程组解了这在Fortran里要自己调LAPACK在Python里也要写不少模板。不过说实话如果项目需要高性能计算、跑几万步大模型Fortran或C更好。MATLAB的优势是开发周期短、调试验证快、画图方便劣势是循环慢。但一维河道模型断面数一般几百个时间步长几秒到几十秒模拟一场洪水也就几千步MATLAB完全扛得住。我后面会讲怎么用稀疏矩阵和向量化避免慢循环。选型时还有一个考虑可以让学生和同事快速上手。我带的几个实习生对HEC-RAS操作不熟但对MATLAB很熟让他们看这个代码两三天就能自己改糙率、改边界出结果也快。对团队来说代码能看懂、能改、能评审比黑盒软件更稳。1.3 模型整体结构和数据流整套模型我拆成三个模块预处理、求解、后处理。预处理负责读断面地形、插值断面间距、生成计算网格、给初始水位和流量求解模块是核心用Preissmann隐式格式解一维圣维南方程组每个时间步组装一个稀疏线性方程组调用MATLAB的稀疏lu分解或反斜杠求解后处理主要画图、统计最高水位、导出CSV。这里最关键的一点是“断面数据”和“计算网格”是两回事。实测断面间距往往不均匀有的地方密、有的地方稀但数值格式需要稳定的空间步长。我一般把实测断面按测点编号保留计算网格再单独设置可以是等间距也可以是非等间距但在Preissmann格式下仍然合法。模型代码里的x、h、Q都是按计算网格节点存的断面属性如河宽、高程通过插值映射到网格节点上。数据流上我建议用统一的结构体比如模型参数放一个struct断面数据放一个struct计算结果放一个struct。这样后面做灵敏度分析和方案比较只需要复制一份结构体改参数代码逻辑完全不用动。2. 控制方程与数值格式圣维南方程组怎么落到代码里2.1 圣维南方程组写代码前必须吃透的物理意义一维河道水动力模型的理论基础是圣维南方程组。它由连续方程和动量方程组成描述非恒定渐变流在河道中的传播。方程的推导假设是水流在一维河道中流动横断面上的水位和流量可以代表整个断面的平均状态压力沿水深按静水压力分布河床坡降较小水流是渐变流流速方向沿河道主槽方向。连续方程表达的是质量守恒河段内水量的变化等于进出水量的差。如果有旁侧入流比如支流汇入或区间产流还要加源项。动量方程表达的是牛顿第二定律在水流上的体现各项分别代表当地惯性、对流惯性、压力梯度、重力沿河底的分量、床面摩阻的平衡。我在这类项目里用的动量方程是∂Q/∂t ∂(Q²/A)/∂x gA ∂h/∂x gA(S₀ - S_f)其中Q是流量A是过水面积h是水深g是重力加速度S₀是河床底坡S_f是摩阻坡降。摩阻项用曼宁公式计算S_f n²Q|Q| / (A²R^(4/3))这里的n就是曼宁糙率系数R是水力半径。对宽浅河道R近似等于水深h矩形或者梯形断面也可以直接用公式计算。注意流量用了Q|Q|而不是Q²这是为了让摩阻的方向和流向一致在模拟洪水涨落、倒水、感潮河段往复流时非常重要不然方向会算错。2.2 Preissmann四点隐式格式的离散过程一维圣维南方程组是双曲型偏微分方程组显式格式有时间步长稳定限制库朗数一大就发散。工程上最常用的是Preissmann四点隐式格式也叫加权四点隐式格式。它的好处是无条件稳定线性意义上允许用较大的时间步长而且空间网格不要求等距实测断面可以直接用。Preissmann格式的核心是对每一对相邻节点i和i1之间的单元建立方程。函数值在单元两端点取平均时间导数用两个时刻的差分空间导数用θ加权θ一般取0.6到1.0之间。θ1是纯隐式最稳定但数值耗散偏大θ0.5是Crank-Nicolson型精度高但容易振荡工程上我常用0.7稳定性和精度比较平衡。离散后每个单元得到两个代数方程对应连续方程和动量方程。未知量是相邻两个断面上的水深增量和流量增量一共4个。所有单元加起来形成2(N-1)个方程边界条件再补2个方程刚好封闭N个断面的2N个未知量。这套线性方程组的系数矩阵是窄带状稀疏矩阵。变量顺序我按断面依次排列每个断面有水深和流量两个未知量h₁, Q₁, h₂, Q₂, ..., hₙ, Qₙ。这样每个内部单元只影响相邻两个断面的4个变量矩阵带宽很小稀疏求解非常快。2.3 系数矩阵的组装策略组装系数矩阵是这个模型最容易写错的地方。我一开始是把每个单元的系数算出来后逐个填进一个大矩阵循环里用矩阵索引赋值调试起来特别痛苦。后来改成“先建稀疏矩阵再一次性填充”的方式代码简洁速度也快。具体来说我用MATLAB的sparse函数预分配matrix size和下标数组先声明A spalloc(2N, 2N, 10*N)然后循环每个单元把连续方程和动量方程的系数填入对应行。MATLAB的线性方程组求解对稀疏矩阵自动使用稀疏LU分解几百个断面、几千个时间步的计算规模一次求解就是毫秒级。组装时最重要的是搞清楚“哪些系数进矩阵、哪些进右端项”。Preissmann格式的离散方程整理成增量形式后未知量是每个断面水深和流量的增量Δh和ΔQ而n时刻的已知值全部移到右端。也就是说矩阵里放的是待求增量的线性系数右端项放的是当前时刻残差和边界条件带来的已知量。3. MATLAB代码实现从断面数据到水位流量场3.1 网格与断面数据准备代码的第一件事是准备计算网格。我习惯用一个结构体grid里面存断面位置x、河底高程zb、河宽B和糙率n。实际项目中河道断面通常是天然断面不是简单的矩形所以我写了几个辅助函数处理断面数据。断面数据预处理的两个常见坑一个是断面距离和桩号的方向。河道上游往下游x应该单调递增但测绘给的断面里程有时会乱序读入后要先排序。另一个是干断面或者滩地河底高程在某些位置特别低水面还没漫滩时水深为零计算时要加一个最小水深阈值。矩形断面虽然简化但用来验证算法完全够。我先写了一个矩形断面的版本跑通之后再扩展成真实断面。矩形断面的代码里只需要B和zb两个参数水面宽度恒定过水面积AB*h湿周PB2h水力半径RA/P。天然断面则要根据水位插值求面积、湿周、水面宽逻辑上复杂一些但框架不变。3.2 核心求解代码框架这里给出一个教学用的核心框架。代码简化成矩形断面、无旁侧入流、恒定底坡重点展示Preissmann格式的组装和求解过程。真实项目中断面形状替换成插值函数即可。% 一维河道水动力模型 - Preissmann隐式格式矩形断面简化版 clear; clc; % ------- 1. 计算参数 ------- L 10000; % 河道长度,m N 101; % 断面数 dx L/(N-1); x 0:dx:L; B 30; % 河宽,m S0 0.001; % 底坡 n 0.035; % 曼宁糙率 dt 60; % 时间步长,s T 6*3600; % 总模拟时长 nt round(T/dt); theta 0.7; % Preissmann加权系数 g 9.81; % ------- 2. 初始条件均匀流 ------- h0 (n * 100 * dx^0 / (sqrt(S0)))^0.6; % 可替换为曼宁公式反推 h0 (n*100/sqrt(S0))^0.6; % 曼宁均匀流水深 h h0 * ones(N,1); Q 100 * ones(N,1); % ------- 3. 时间循环 ------- for k 1:nt % 未知量按 [dh1, dQ1, dh2, dQ2, ...] 排列 A spalloc(2*N, 2*N, 10*N); rhs zeros(2*N, 1); % 半隐式离散系数 for i 2:N % 节点编号左 i-1右 i hL h(i-1); hR h(i); QL Q(i-1); QR Q(i); % ----- 连续性方程 ----- rowC i-1; % B/(2dt) * dhL B/(2dt) * dhR - theta/dx*dQL theta/dx*dQR A(rowC, 2*(i-1)-1) B/(2*dt); A(rowC, 2*(i-1)) -theta/dx; A(rowC, 2*i-1) B/(2*dt); A(rowC, 2*i) theta/dx; rhs(rowC) -(QR - QL)/dx; % 实际完整形式还要考虑theta组合 % ----- 动量方程 ----- rowM N-1 (i-1); AL B*hL; AR B*hR; Aavg 0.5*(ALAR); uL QL/AL; uR QR/AR; % 对流项导数 dFQ_L 2*uL; dFh_L -uL^2/hL; dFQ_R 2*uR; dFh_R -uR^2/hR; % 摩阻项宽浅河道 R≈h SfL n^2*QL^2/(B^2*hL^(10/3)); SfR n^2*QR^2/(B^2*hR^(10/3)); dSfQ_L 2*SfL/QL; dSfh_L -(10/3)*SfL/hL; dSfQ_R 2*SfR/QR; dSfh_R -(10/3)*SfR/hR; % 惯性项 A(rowM, 2*(i-1)) 1/(2*dt); A(rowM, 2*i) 1/(2*dt); % 对流项线性化 A(rowM, 2*(i-1)-1) A(rowM, 2*(i-1)-1) - theta/dx*dFh_L; A(rowM, 2*(i-1)) A(rowM, 2*(i-1)) - theta/dx*dFQ_L; A(rowM, 2*i-1) A(rowM, 2*i-1) theta/dx*dFh_R; A(rowM, 2*i) A(rowM, 2*i) theta/dx*dFQ_R; rhs(rowM) rhs(rowM) - (uR^2 - uL^2)/dx; % 对流项已知部分 % 压力项 A(rowM, 2*(i-1)-1) A(rowM, 2*(i-1)-1) - g*Aavg*theta/dx; A(rowM, 2*i-1) A(rowM, 2*i-1) g*Aavg*theta/dx; rhs(rowM) rhs(rowM) - g*Aavg*(hR-hL)/dx; % 重力项与摩阻项 A(rowM, 2*(i-1)-1) A(rowM, 2*(i-1)-1) g*B*S0/2; A(rowM, 2*i-1) A(rowM, 2*i-1) g*B*S0/2; A(rowM, 2*(i-1)) A(rowM, 2*(i-1)) - g*Aavg*dSfQ_L/2; A(rowM, 2*i) A(rowM, 2*i) - g*Aavg*dSfQ_R/2; A(rowM, 2*(i-1)-1) A(rowM, 2*(i-1)-1) - g*Aavg*dSfh_L/2; A(rowM, 2*i-1) A(rowM, 2*i-1) - g*Aavg*dSfh_R/2; rhs(rowM) rhs(rowM) g*Aavg*(S0 - 0.5*(SfLSfR)); end % ----- 边界条件上游流量下游水位 ----- Q_up 200; % 上游边界流量 H_down 3.0; % 下游边界水深 rowB1 2*N-1; A(rowB1, 2) 1; % dQ1 Q_up - Q(1) rhs(rowB1) Q_up - Q(1); rowB2 2*N; A(rowB2, 2*N-1) 1; % dhN H_down - h(N) rhs(rowB2) H_down - h(N); % ----- 求解增量 ----- du A \ rhs; dh du(1:2:2*N-1); dQ du(2:2:2*N); h h dh; Q Q dQ; % 简单保护最小水深 h(h 0.05) 0.05; end % ------- 4. 输出结果 ------- plot(x, h, b-, LineWidth, 1.5); xlabel(距上游距离 (m)); ylabel(水深 (m)); title(模拟结束时刻沿程水深);这段代码是我为了讲清楚原理写的简化版系数组装做了不少近似比如对流项已知部分只写了前面一部分、压力项没有把theta加权完整展开所以不建议直接拿来跑项目。正确做法是找标准教材把每一项的增量形式完整推一遍逐一核对系数。我后来实际用的代码差不多是这个框架的三倍长主要就是每个项的系数都严格展开了。一个更稳的验证思路是先拿矩形棱柱河道、恒定流条件来测。给定恒定上游流量和下游水位模拟足够长时间后全河段应该收敛到同一个均匀流水深和曼宁公式解析解对比。如果这个都差得远说明离散系数有错别急着上真实河道。3.3 边界条件与初始条件的代码实现边界条件在一维水动力模型里是灵魂很多人模型发散的根源就是边界条件处理不对。常见的边界条件有三类上游流量过程线、下游水位过程线、下游水位流量关系。我上面代码里是上游定流量、下游定水位的简单情况。上游流量边界在Preissmann格式里实现很直接第一个断面的流量增量等于边界流量和当前流量的差即ΔQ₁ Q_up(tΔt) - Q₁ⁿ。如果给的是流量过程线数组用interp1取对应时刻的值就行。要注意过程线的时间起点如果从0时刻开始第一个时间步就要对上。下游水位边界同理Δhₙ H_down(tΔt) - hₙⁿ。如果下游是水位流量关系比如堰流公式或者实测的Z-Q曲线需要把流量和水位的关系线性化放进边界方程里。这时候边界方程就不再是简单的单位赋值而是一个含有两个未知量的线性方程。初始条件我强烈建议用“恒定流预热”而不是直接冷启动。最简单的做法是先跑一段较长时间的定流量连续模拟让模型达到准平衡再开始正式计算。如果直接给一个粗糙的初始水位场前几步的数值振荡会非常剧烈搞不好直接发散。我用过的方案是先给全河段一个均匀水深上游边界用恒定设计流量下游边界用恒定水位跑5000个时间步把最后的状态作为正式模拟的初始场。4. 参数率定、潮汐边界与结果后处理4.1 糙率率定用实测水位反推糙率曼宁糙率n是水动力模型里最不确定的参数它综合反映了河床阻力、岸坡植被、弯道损耗、断面形状变化等效应。拿到一个新项目第一件事不是急着模拟而是找历史洪水或实测水文资料来率定糙率。率定的核心思路很简单调n使计算水位和实测水位的误差最小。可以用试错法也可以写个最小二乘自动优化。我常用MATLAB的fminsearch目标函数是多个断面实测水位和计算水位的均方根误差。目标函数里每评估一次就要完整跑一遍模型虽然计算量大但断面不多时完全可接受。还有一个坑糙率不是单一值往往沿程分段。山区河道糙率小一些滩地糙率大城区段可能还要考虑高水位漫滩后的糙率变化。我一般把河道按桩号分成几段每段一个糙率一起放进优化变量里。优化出来的糙率如果偏离参考范围特别多先检查是不是断面地形或者边界条件有误不要一味相信数值优化结果。率定完成后还要做验证用另一场洪水资料检验模型如果验证期误差也在可接受范围模型才能用于方案分析。这种“先率定后验证”的流程是项目评审的基本要求缺了它报告很难通过。4.2 感潮河段的下游边界分潮叠加如果你做的是感潮河段下游边界不能简单地给常数水位要给潮位过程线。最常见的方法是用多个天文分潮叠加M2、S2、K1、O1这几个主要分潮足够描述大多数河口的潮位变化。公式是Z(t) Z₀ Σ fᵢ Aᵢ cos(σᵢ t φᵢ)其中Aᵢ是分潮振幅σᵢ是分潮角速率φᵢ是迟角Z₀是平均海平面。这些参数可以从潮汐表或者历史验潮站数据用调和分析得到不需要自己从头算很多沿海港口都有现成的调和常数。在MATLAB里实现分潮边界非常直接写一个函数输入时间t返回该时刻的下游水位。我把分潮参数存在一个表格里循环累加。注意的是潮位边界的基准面要和河道内地形高程基准面统一不然下游水位和上游地形衔接不上会算出一堆奇怪的结果。感潮河段还有一个特点是水流会往复Q可能变负。这时候摩阻项里的Q|Q|就派上用场了。如果代码里用了Q²而不是Q|Q|涨潮倒流时摩阻方向就会反水位和流速都会算错。这个细节我在评审别人代码时多次看到真的很容易漏。4.3 结果后处理过程线、包络线、等值面模型算完只是第一步怎么把结果变成报告里能用的图才是日常大头。我常用的后处理包括三种图沿程水面线、断面水位过程线、洪水演进等值面图。沿程水面线是最常见的成果x轴是桩号y轴是水位或水深。一般会画多个方案或者多个时刻的对比线加粗标出设计洪水位线标出桥梁、堤防等工程位置。画的时候注意把河底高程也画出来不然读图的人看不出水深。水位过程线用来展示某个断面的水位随时间变化适合对比工程前后的淹没风险变化。多个断面放一张图时用subplot或叠加绘图标注清晰一点。过程线的明显问题是初始段可能有预热调整痕迹正式报告中建议截掉预热段。洪水演进等值面图可以用来展示全河段水位随时间的演变x轴是断面距离y轴是时间颜色表示水位。实现方式是meshgrid把x和t构造成网格水位存成矩阵用pcolor或contourf画。这里MATLAB的meshgrid很顺手但要注意矩阵的行列顺序我犯过把x和y调换导致图片转置的错后来直接查size再画省了很多事。5. 常见问题与排查技巧实录5.1 高频发散和负水深怎么破模型最让人崩溃的就是辛辛苦苦调好参数一跑就发散。发散的典型表现是某个断面水位或流量出现NaN或者正负剧烈交替而且往往发生在模型刚启动的几十步之内。第一个排查点时间步长太大。虽然Preissmann格式是无条件稳定的线性分析结论非线性项、边界条件复杂化之后还是会因为精度问题出现振荡。经验上控制库朗数在20以内比较安全如果发现高频振荡先把dt减小到原来的四分之一试试。我曾经遇到过dt120s时模型振荡改成60s就安静了。第二个排查点初始条件与边界条件不匹配。比如上游给大流量下游给的初始水位却是均匀流的小水深会导致初始时刻水面坡降剧烈调整。解决方法是先预热或者用恒定流解作为初始条件。第三个排查点干湿处理。天然河道在低流量时部分断面可能露出水面水深接近零会让面积和流速计算出问题。我设置了最小水深0.05m低于这个值强制回弹但这种方法也会引入水量守恒误差。更严谨的做法是干湿判别水深低于阈值时该断面的流量置零只保留连续方程的水位变化。5.2 时间步长和空间步长的选择经验空间步长和时间步长是模型设置中最需要综合考虑的参数。空间步长不是越细越好一方面实测断面间距本身就限制了有效分辨率另一方面步长过细会导致时间步长也必须缩小计算量急剧上升。一般山区河道断面间距10到50米平原河道50到200米根据地形变化程度定。时间步长的选择需要考虑水流传播特性。一维河道问题中扰动传播速度近似为u±√(gA/B)水深越大波速越快。浅水长波在短时间内影响范围大步长太大会漏掉波峰。我常用的经验公式是dt小于等于dx除以波速的20倍左右确保库朗数在合适范围。一个靠谱的方法是用“敏感性分析”来确定步长布置一个基准工况分别用基准步长的一半和两倍跑一次对比关键断面水位过程线的差异。差异小于1cm说明步长设置足够精细否则就要加密。这个方法虽然多花几次计算但比拍脑袋可靠得多。5.3 MATLAB求解慢的加速思路很多初学者把矩阵当成普通矩阵来组装用了大量循环和动态增长跑几千步要花很久。我建议三个优化点。第一用spalloc预先分配稀疏矩阵不要用zeros创建满阵再往里赋值满阵的存储和求解释放都很慢。第二把内层循环尽量向量化比如多个断面的水力参数可以用数组运算一次算完而不是每个断面单独算。第三如果某个区域糙率、断面属性不变系数矩阵的结构基本不变可以提前做好符号分解再反复求解MATLAB的decomposition或者lu函数可以使用分解对象重复求解能省不少时间。使用parfor要注意一点MATLAB的parfor是按逻辑处理器分worker的不是按物理内核。如果机器是超线程开太多worker反而会拖慢。我一般用feature(numcores)查物理内核数再根据内存情况设置并行池大小。parallel processing适合同时跑多个方案的情况每个方案内部时间循环还是串行。还有一个容易忽略的提速点结果的存储。如果在时间循环里每个步都存h和Q的全场数据内存和硬盘压力都大。我通常只存储每个断面的最大值、指定断面的过程线以及每隔若干步的整场快照。模拟结束后如果发现需要更多输出再局部重新跑一次。最后再分享一点实际操作体会模型从零到能用我踩过最深的一个坑就是“看起来收敛但不正确”。代码能跑、水位不溢出、流量守恒也差不多但结果就是和实测对不上。后来发现是糙率沿程分段没有优化好以及断面数据里有个别断面的河底高程单位错了。数值模型这个东西所有输入数据的可靠性决定了输出结果的上限代码本身只是把误差透明地暴露出来。所以我特别建议大家维护一个独立的断面数据检查函数读入数据后自动检查断面间距是否异常、河底高程是否倒挂、是否出现负面积如果有问题就报错。听起来很基础但在项目紧、数据杂的时候这套检查能帮你省下至少一整天。另外一个小技巧是给模型加“调试模式”在代码里放一个flag开启后每个时间步打印最大水位变化、最大流量变化、残差范数。定位发散问题时不用把matlab的警告关掉直接看哪一步开始出现NaN再回溯那一步的输入数据往往能很快锁定问题。这套一维河道模型我后来又扩展了梯形断面、复式断面、多支流汇入还加了水质模块的浓度平流项底层都是同一个Preissmann框架。你现在如果从矩形断面验证版开始一步步往上加复杂度会比直接啃复杂代码顺利得多。本文还有配套的精品资源点击获取
返回列表