[matlab学习记录01] 由河道断面数据获得不同水位下自然河宽、河道断面面积、断面最大水深


前言

本文仅为学习matlab过程中的一些记录,奈何才疏学浅,如有错误希望各位大佬不吝赐教。

一、解决的问题

在研究河相关系公式需要率定河相关系系数时,需要先得到自然河宽B和平均水深H等基本参数,其中平均水深H又可以由河道断面面积A/自然河宽B得到,因此为了根据已有的河道各断面的地形数据获得不同水位下的自然河宽、断面面积及断面最大水深编写了以下的代码。

二、所需数据

输入的基础数据包括两个:
1、河道各个断面的地形数据。它反映了某一断面河床横断面形态,由一个个地形点构成,地形点包括两个维度的参数分别是到左岸的起点距和高程;
2、设计水位数据。它反映了每个断面所研究的若干个设计水位;

代码中的数据下载地址如下:
链接:https://pan.baidu.com/s/114scyBlUO-XzzPz2Pr6APQ
提取码:bum1

三、解决思路

1、河道的断面面积可以利用matlab的积分函数trapz()来计算。
2、问题的难点在于如何得到不同水位下某一断面的自然河面宽度,采用的思路是:取左岸低于水位的第一个地形点和右岸低于水位的第一个地形点,取两个地形点之间的起点距差值近似计算自然河面宽度B(见图)。
可以看出这是一种近似方法不是十分精确,但是考虑到地形点数据足够密集,河道宽度较大,因此结果的误差在可以接受的范围之内。

图1
3、断面最大水深则可以利用matlab中max()函数;

四、matlab代码

代码如下:

%2021/8/12
%1、数据导入
%2、求解各断面不同水位下自然河宽及断面面积
%3、数据导出
clc;clear

%% 数据导入
excel_path='D:\个人文件夹\matlab学习\test.xlsx';
M=xlsread(excel_path,1);   %导入地形数据
N=xlsread(excel_path,2);   %导入设计水位数据(表头不读入)
[MX,MY]=size(M);           %获得矩阵M的行列数,行数MX,列数MY
[NX,NY]=size(N);           %获得矩阵N的行列数,行数NX,列数NY

%% 求各断面在不同水位下自然河宽及断面面积
m=0.5*MY;                  %m为总的断面数
CS=[];                     %定义空矩阵以存储所有断面自然河宽B、断面面积A、断面最大水深Hm数据
LC=[];                     %定义空矩阵以存储航道里程数据
%各断面循环
for k=1:m
    x=2*k-1;
    lc=M(1,x);                 %获得各断面的航道里程
    LC=[LC;lc];                %存储所有断面的航道里程数据
    C=[];                      %定义空矩阵以存储某一断面B、A、Hm数据
    
    %各设计水位循环,求一个断面的B、A、Hm
    for j=1:NY
        h=N(k,j);              %各设计水位依次赋值给h,(第一行为表头)
        %寻找左岸水面与地形交点
        ls=[];                 %定义空矩阵以存储左岸水面与地形交点数据
        for i=2:MX             %自左到右地形点循环,从2开始是去除了表头
            z=M(i,x+1);        %各地形点高程依次赋值给z
            if (z-h)<=0        %以水位以下的第一个地形点作为水面与地形交点
                l=i;
                break
            end
        end
        ls=[ls l];             %存储左岸水面与地形交点数据
        %寻找右岸水面与地形交点
        rs=[];                 %定义空矩阵以存储右岸水面与地形交点数据
        for i=MX:-1:2          %自右到左地形点循环
            z=M(i,x+1);
            if (z-h)<=0
                r=i;
                break
            end
        end
        rs=[rs r];             %存储右岸水面与地形交点数据
        %获得水深数据
        H=[];                  %存储水深数据
        for i=l:r
            ho=h-M(i,x+1);     %求解水深,即为水位-地形高程
            if ho<0            %去除河道中凸出水面的浅滩等的影响
                ho=0;
            end
            H=[H,ho];          %存储水深数据,行向量形式
            hm=max(H);         %获取最大断面水深hm
        end
        b=M(r,x)-M(l,x);       %求解自然河宽,即为右岸交点-左岸交点
        X=M(l:r,x);            %X为起点距数据
        H=H';
        a=trapz(X,H);          %求解断面面积,采用梯形积分      
        c={b a hm ' '};        %整合自然河宽、断面面积及最大水深数据
        C=[C c];               %存储某一断面B、A、Hm数据
    end
    
    CS=[CS;C];                 %存储所有断面B、A、Hm数据
end

%% 数据导出
str={'航道里程','枯水B','枯水A','枯水Hm','备注','中水B','中水A','中水Hm','备注','洪水B','洪水A','洪水Hm','备注'}; %表头
CST=[str;[num2cell(LC),CS]];
xlswrite(excel_path,CST,3); 

  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用MATLAB进行浅水波传播模拟的示例程序: ```matlab % 湖泊参数 L = 500; % 湖泊的水平范围,单位:m H = 10; % 湖泊的水深,单位:m dx = 10; % 空间步长,单位:m % 时间参数 dt = 0.1; % 时间步长,单位:s t_end = 10; % 模拟的总时间,单位:s % 网格设置 nx = L/dx + 1; % x方向上的网格数 ny = L/dx + 1; % y方向上的网格数 % 初始条件 eta = zeros(nx, ny); % 水位变化项,初始时刻为0 eta(nx/2, ny/2) = 1; % 中心处水位为1m % 模拟循环 for t = 0:dt:t_end % 计算水平向速度分量和垂直向速度分量(假设为0) u = zeros(nx, ny); v = zeros(nx, ny); % 更新水位变化项 for i = 2:nx-1 for j = 2:ny-1 deta_dx = (eta(i+1, j) - eta(i-1, j))/(2*dx); deta_dy = (eta(i, j+1) - eta(i, j-1))/(2*dx); eta(i, j) = eta(i, j) - dt*(u(i, j)*deta_dx + v(i, j)*deta_dy); end end % 绘制当前时刻的水位图 x = 0:dx:L; y = 0:dx:L; [X, Y] = meshgrid(x, y); figure; surf(X, Y, eta'); title(['t = ', num2str(t)]); xlabel('x (m)'); ylabel('y (m)'); zlabel('Water Surface Elevation (m)'); axis([0 L 0 L -1 1]); % 设置坐标轴范围 view(2); % 设置视角为俯视图 colorbar; % 显示颜色条 end ``` 此程序使用有限差分法对浅水方程进行离散化,并使用前向差分法进行时间推进。程序中使用了一个简单的二维数组 `eta` 来表示湖泊中的水位变化项,每个元素对应一个网格点的水位高程。程序通过循环迭代计算每个时间步长内的水位变化,并在每个时间步长结束后绘制当前时刻的水位图。 请注意,这只是一个简单的示例程序,可能需要根据具体情况进行修改和优化,例如边界条件的处理、数值稳定性的考虑等。另外,程序中的绘图部分使用了MATLAB的内置函数 `surf`,你可能需要根据自己的需要进行调整和修改。 希望这能帮助到你开始进行浅水波传播模拟。如有任何问题,请随时向我提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值