一.河道水流量的估算问题
根据实际测量,得到河流某处宽600m,其横截面不同位置某一时刻的水深如下表所示。
① 若此刻水流的流速为0.6m/s,试估计该河流此刻的流量。(考虑使用polyfit,polyval,poly2sym,int函数)
② 已知x方向[50,60]区间为坡式护岸的下部护脚部分,根据相关堤防设计规范,抛石护岸护脚坡度应缓于1:1.5(正切值),请估计水流冲刷是否已破坏该区域的护脚。 (考虑使用polyfit,polyval,poly2sym,diff,all函数)
思路:流量 Q 的定义就是单位时间内通过某个横截面的流体体积。
具体来说,流量 Q 的公式是:
Q=A×v
其中:
- Q 是流量,通常以立方米每秒(m^3/s)为单位。
- A 是横截面积,以平方米(m^2)为单位。
- v 是流速,以米每秒(m/s)为单位。
所以赶紧拟合出曲线然后积分求出横截面的面积,就可以求出流量,然后第二问的坡度也与曲线的斜率有关
二.函数储备
1.polyfit函数
polyfit
函数是一个非常有用的工具,用于多项式曲线拟合。它的主要目的是找到一组多项式系数,这组系数能够最好地拟合一组给定的数据点。
polyfit
函数的基本用法
polyfit
函数的基本语法如下:
p = polyfit(x, y, n);
其中:
x
和y
是数据点的坐标。这些点可以是实验数据或任何其他观测值。n
是多项式的阶数。例如,如果你想要一个二次多项式拟合,就使用n = 2
。p
是返回的多项式系数,从最高次项到常数项排列。
应用示例
假设你有一组数据点,你想用一个二次多项式(ax2+bx+c)来拟合这些数据。你可以这样使用 polyfit
:
x = [1, 2, 3, 4, 5]; % x 坐标
y = [5, 7, 6, 5, 10]; % y 坐标
p = polyfit(x, y, 2); % 二次多项式拟合
这里,p
将是一个包含三个系数(a,b,c)的向量,这些系数定义了最佳拟合曲线。
2.polyval函数
在 MATLAB 中用于计算多项式的值
-
函数用途:
polyval
函数用于计算给定多项式在一个或多个点上的值。它是多项式运算中的一个基础工具。 -
输入参数:
- 第一个参数是一个向量,表示多项式的系数。这个系数向量是按照从最高次幂到常数项的顺序排列的。例如,对于多项式 3x2+2x+1,系数向量将是
[3, 2, 1]
。 - 第二个参数是一个点或一组点,在这些点上你希望计算多项式的值。
- 第一个参数是一个向量,表示多项式的系数。这个系数向量是按照从最高次幂到常数项的顺序排列的。例如,对于多项式 3x2+2x+1,系数向量将是
-
用法示例:
p = [3 2 1]; % 定义多项式 3x^2 + 2x + 1
x = 0:0.1:10; % 定义一系列的点
y = polyval(p, x); % 计算这些点上的多项式值
3.poly2sym函数
在MATLAB中,poly2sym函数用于将多项式转换为符号表达式。
以下是使用poly2sym函数的示例:
假设您有一个多项式 P(x) = 3x^2 + 2x + 1,您可以按照以下步骤使用poly2sym函数将其转换为符号表达式:
1.定义多项式的系数向量:
coefficients = [3, 2, 1];
2.使用poly2sym函数将多项式转换为符号表达式:
syms x;
polynomial = poly2sym(coefficients, x);
现在,变量polynomial
包含了符号表达式3x^2 + 2x + 1。
您还可以使用poly2sym函数创建更复杂的多项式。例如,如果您有多个变量的多项式,您可以按照以下步骤执行:
1.定义多项式的系数矩阵:
coefficients = [1, 2, 3; 4, 5, 6];
2.使用poly2sym函数将多项式转换为符号表达式:
syms x y;
polynomial = poly2sym(coefficients, [x, y]);
现在,变量polynomial
包含了符号表达式1x^2 + 2x + 3y^2 + 4y + 5。
请注意,poly2sym函数返回的结果是一个符号表达式,您可以在MATLAB中对其进行进一步的操作,例如求导、积分等。
4.int函数
int
函数用于执行符号积分,即对符号表达式进行积分计算。(计算得到的也是一个符号表达式)
基本用法
int
函数的基本语法是:
I = int(expr, var, a, b);
其中:
expr
是要积分的符号表达式。var
是积分变量。a
和b
是积分的下限和上限。
如果不指定积分限,则执行不定积分。
示例
-
不定积分:
syms x;
f = x^2 + 3*x + 2;
I = int(f, x);
这将计算
x^2 + 3*x + 2
关于 x 的不定积分。 -
定积分:
syms x;
f = x^2 + 3*x + 2;
I = int(f, x, 0, 1);
这将计算
x^2 + 3*x + 2
从x=0 到 x=1 的定积分。
三.符号表达式转换为数值的方法
-
double
函数:- 使用
double
函数可以将符号表达式转换为双精度浮点数。 - 这是最常用的转换方法,适用于大多数情况,特别是当你需要标准浮点数表示时。
- 示例:
numericValue = double(symExpr);
- 使用
-
vpa
函数(Variable Precision Arithmetic):- 使用
vpa
函数可以将符号表达式转换为指定精度的数值。 - 这个方法特别适用于需要非标准精度的情况,比如需要非常精确的数值结果。
- 示例:
highPrecisionValue = vpa(symExpr, digits);
其中digits
指定了所需的小数位数。
- 使用
-
eval
函数:- 虽然不推荐使用(尤其是在安全性和代码可读性方面),但
eval
函数可以用来执行符号表达式并返回其数值结果。 - 这种方法可能对于某些特定的计算和格式化输出有用。
- 示例:
numericValue = eval(symExpr);
- 虽然不推荐使用(尤其是在安全性和代码可读性方面),但
-
subs
函数结合数值:- 如果符号表达式中包含变量,可以使用
subs
函数替换这些变量为特定的数值,然后使用double
或vpa
获取数值结果。 - 这种方法在进行特定点的函数评估时很有用。
- 示例:
numericValue = double(subs(symExpr, variable, value));
- 如果符号表达式中包含变量,可以使用
在选择适合的方法时,应考虑转换的精度需求、符号表达式的复杂性以及计算的性能要求。通常,double
和 vpa
是最常用和最直接的方法。
三.解题
注意:eval
函数用于执行存储在字符串或字符数组中的 MATLAB 表达式。
% x=[0,50,100,150,200,250,300,350,400,450,500,550,600];
%数据定义
x=0:50:600;
h=-[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.5,5.2,4.9,4.8,4.7];%多项式拟合:
p=polyfit(x,h,3)%绘图验证:
figure
plot(x,h,'*',x,polyval(p,x))%题目 1:河道流量估算
%符号表达式转换 将多项式系数转换为符号表达式。
syms x1;
f=poly2sym(p,x1);%积分计算
area=-int(f,x1,0,600);
flow=area*0.6;
double(flow)%题目 2:坡式护岸护脚部分的评估
%求导数 实质上是求斜率
d=diff(f,x1);
%评估坡度: 在 50 到 60 米范围内评估坡度是否符合规范(即是否小于 1:1.5 的正切值)。
x1=50:0.1:60;
d=double(d);
all(d<1/1.5)
在高度这边我添加了一个负号是因为这样拟合的曲线的趋势就和该横截面各个位置的分布趋势相同,河道的表面就像起始的0m,然后其他的高度就顺理成章的变成负数,整个拟合的曲线就近似于横截面的走势,评估坡度的时候就直接求导获取曲线斜率,更加一目了然
第二问结果:水流冲刷没有已破坏该区域的护脚