MATLAB编程:循环、条件语句与应用实例
立即解锁
发布时间: 2025-09-06 01:45:15 阅读量: 6 订阅数: 8 AIGC 


MATLAB数学建模入门
### MATLAB编程:循环、条件语句与应用实例
#### 1. 递归序列与嵌套for循环
在MATLAB中,我们可以使用for循环来生成递归定义序列的值。例如,考虑序列 $x_{n + 1} = r \cdot x_n + 1$,其中 $x_0 = 3$,$n = 1, 2, \cdots, 20$,$r$ 取值为 $0.6, 0.7, 0.8, 0.9$。以下是实现该序列并绘制图形的代码:
```matlab
x = zeros(4, 21);
x(:, 1) = 3;
r = [0.6 0.7 0.8 0.9];
for i = 1:4
for j = 1:20
x(i, j + 1) = r(i) * x(i, j) + 1;
end
end
figure
hold on
plot(0:20, x(1, :), 0:20, x(2, :), 0:20, x(3, :), 0:20, x(4, :))
xlabel('n')
ylabel('x n')
legend('r=0.6', 'r=0.7', 'r=0.8', 'r=0.9')
hold off
```
从图形中可以看出,改变参数 $r$ 会使 $x_{20}$ 的值在大约 $2.5$ 到 $9$ 之间变化。使用 `x(:, end)` 命令可以查看最后一列的精确值,范围从 $2.5$ 到 $9.1490$。
#### 2. While循环
for循环适用于已知迭代次数的情况,但当迭代次数未知时,我们可以使用while循环。while循环会不断执行特定代码段,直到某个条件满足为止。其一般形式如下:
```matlab
while
logical expression
statements
...
end
```
逻辑表达式是一个布尔值(真或假),只要逻辑表达式为真,循环内的语句就会执行。如果逻辑表达式为假,MATLAB会跳过循环内的语句,继续执行 `end` 语句之后的代码。
例如,计算 $\sum_{n = 1}^{100} \frac{1}{n^2}$ 可以使用for循环和while循环实现:
```matlab
% for循环
s = 0;
for i = 1:100
s = s + 1/i^2;
end
s
% while循环
s = 0;
i = 1;
while i <= 100
s = s + 1/i^2;
i = i + 1;
end
s
```
while循环还可以用于在满足收敛条件时停止程序。例如,累加项直到第 $i$ 项小于某个容差(这里是 $10^{-3}$):
```matlab
s = 0;
tol = 1e-3;
i = 1;
while 1/i^2 > tol
s = s + 1/i^2;
i = i + 1;
end
i
s
```
我们还可以对代码进行向量化,存储每次迭代的部分和:
```matlab
partialSum = 0;
tol = 1e-3;
i = 1;
while 1/i^2 > tol
partialSum(i + 1) = partialSum(i) + 1/i^2;
i = i + 1;
end
partialSum'
```
运行代码后,我们可以找到任意 $N$(从 $1$ 到 $100$)对应的 $\sum_{n = 1}^{N} \frac{1}{n^2}$ 的值。例如,`partialSum(50)` 应该返回 $\sum_{n = 1}^{50} \frac{1}{n^2}$ 的值。
#### 3. 停止MATLAB脚本
当MATLAB完成脚本运行时,命令窗口的下一行会显示 `>>`。如果等待时间过长,可以在命令窗口中点击并使用 “Ctrl + C” 停止脚本运行。如果程序似乎无法结束,可能是陷入了无限循环,这在初学者使用while循环时很常见。例如:
```matlab
x = 2;
while x == 2
y = x + 1;
end
```
在这个例子中,只要 $x$ 等于 $2$,while循环就会一直执行。但循环内的语句只修改了 $y$,而没有改变 $x$,因此 $x$ 始终为 $2$,循环会一直运行下去(直到程序崩溃)。
#### 4. 代码注释
随着代码变得越来越复杂,注释变得越来越重要。即使是简单的代码,注释也有助于回忆程序的意图,特别是在编写脚本文件一段时间后再查看时。例如,实现除法算法的MATLAB脚本:
```matlab
% This script computes the quotient and remainder when a is divided by d.
% The quotient (q) and remainder (r) are output
a = 20; % a is the initial number
d = 6; % d is the divisor
r = a; % initilize r to a
q = 0; % the quotient q is the number of times that d is subtracted from r
while r >= d % loop until r is less than d
r = r - d; % subtract d from r
q = q + 1; % add 1 to q
end
q % output q
r % output r
```
代码开头的注释描述了代码的功能和输出值。在第3行和第4行,注释解释了变量 $r$ 和 $a$ 的作用。使用注释至少描述初始化变量的目的是个好习惯,也可以用注释解释任何代码行。
#### 5. 条件语句
条件语句(if - then语句)用于仅在满足某个条件时运行代码段。在MATLAB中,基本的if - then语句形式如下:
```matlab
if
logical expression
statements
...
end
```
只有当逻辑表达式为真时,语句集才会执行。
如果希望在逻辑表达式为假时执行不同的操作,可以使用if - else语句:
```matlab
if
logical expression
statements A
else
statements B
end
```
如果逻辑表达式为真,则执行语句集A;如果逻辑表达式为假,则执行语句集B。例如:
```matlab
if 2 == 3
disp('the statement is true')
else
disp('the statement is false')
end
```
运行上述代码会显示 `the statement is false`,因为 $2$ 不等于 $3$。
当有多个可能性时,可以使用多重if - else语句:
```matlab
if
logical expression 1
statements A
elseif
logical expression 2
statements B
elseif
logical expression 3
statements C
else
statements D
end
```
在这个例子中,如果逻辑表达式1为真,则执行语句集A;否则,如果逻辑表达式2为真,则执行语句集B;如果逻辑表达式1和2都为假,且逻辑表达式3为真,则执行语句集C;如果所有逻辑表达式都为假,则执行语句集D。注意,只有一组语句A、B、C或D会被执行,最后一个else语句不是必需的。
还可以使用 `break` 或 `return` 命令在不满足条件时退出条件语句、for循环或while循环。例如,检查1到10的数字是否能被2、3或5整除:
```matlab
n = 10;
for i = 1:n
if rem(i, 2) == 0
disp([num2str(i), ' is divisible by 2'])
elseif rem(i, 3) == 0
disp([num2str(i), ' is divisible by 3'])
elseif rem(i, 5) == 0
disp([num2str(i), ' is divisible by 5'])
else
break
end
end
```
#### 6. Switch语句
当有许多条件需要判断,并且希望代码更易读时,可以使用switch语句。其形式如下:
```matlab
switch
variable
case
case A
statements A
case
case B
statements B
case
{case C1, case C2, ...}
statements C
otherwise
statements D
end
```
任何case都可以包含变量的多个值。如果没有case表达式与变量的值匹配,控制将传递给 `otherwise` 情况(如果存在)。
#### 7. MATLAB命令总结
| MATLAB命令 | 功能 |
| --- | --- |
| `x = some number` | 将一个数字赋值给变量 $x$ |
| `x = start:increment:end` | 将一个数字向量赋值给变量 $x$,第一个值为 `start`,后续值通过 `increment` 递增,数组在达到 `end` 值时结束 |
| `A = [1 2 3; 4 5 6; 7 8 9]` | 将矩阵 $\begin{bmatrix}1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9\end{bmatrix}$ 赋值给变量 $A$ |
| `R = [1 2 3]` | 将行向量 $[1 2 3]$ 赋值给变量 $R$ |
| `C = [1; 4; 7]` | 将列向量 $\begin{bmatrix}1 \\ 4 \\ 7\end{bmatrix}$ 赋值给变量 $C$ |
| `A(n, m)` | 输出矩阵 $A$ 的第 $n$ 行第 $m$ 列元素 |
| `A(n, :)` | 输出矩阵 $A$ 的第 $n$ 行 |
| `A(:, m)` | 输出矩阵 $A$ 的第 $m$ 列 |
| `size(A)` | 输出矩阵 $A$ 的大小,形式为 `[列数 行数]` |
| `A'` | 计算矩阵 $A$ 的转置 |
| `x * y` | 计算 $x$ 和 $y$ 的乘积 |
| `x .* y` | 计算 $x$ 和 $y$ 的元素级乘积 |
| `sqrt(x)` | 计算 $\sqrt{x}$ |
| `x^n` | 计算 $x^n$ |
| `log(x), log10(x)` | 分别计算 $\ln x$ 和 $\log_{10} x$ |
| `abs(x)` | 计算 $|x|$ |
| `exp(x)` | 计算 $e^x$ |
| `sin(x), cos(x), tan(x)` | 计算 $\sin(x)$、$\cos(x)$ 和 $\tan(x)$ |
| `asin(x), acos(x), atan(x)` | 计算 $\arcsin(x)$、$\arccos(x)$ 和 $\arctan(x)$ |
| `floor(x)` | 计算不大于 $x$ 的最大整数 |
| `ceil(x)` | 计算不小于 $x$ 的最小整数 |
| `round(x)` | 将 $x$ 四舍五入到最接近的整数 |
| `vpa(fraction)` | 将分数转换为十进制近似值 |
| `rref(A)` | 将矩阵 $A$ 化为行最简阶梯形(执行高斯消元法) |
| `inv(A)` | 计算矩阵 $A$ 的逆 |
| `figure(n)` | 打开第 $n$ 个图形窗口(用于处理多个图形) |
| `hold on` | 执行该行后,后续的绘图命令将添加到当前图形中(而不是从头创建新图形) |
| `;` | 在行末添加分号以抑制输出到命令行(用于加快代码运行速度) |
| `ezplot('cos(x)')` | 使用默认窗口绘制 $\cos(x)$ |
| `ezplot('cos(x)', [xmin, xmax])` | 在区间 $x_{min} \leq x \leq x_{max}$ 上绘制 $\cos(x)$ |
| `ezplot('cos(x)', [xmin, xmax, ymin, ymax])` | 在区间 $x_{min} \leq x \leq x_{max}$,$y_{min} \leq y \leq y_{max}$ 上绘制 $\cos(x)$ |
| `plot(x, y)` | 绘制向量 $y$ 相对于 $x$ 的图形 |
| `x < y` | 测试逻辑表达式 $x < y$(为真返回 $1$,为假返回 $0$) |
| `x <= y` | 测试逻辑表达式 $x \leq y$(为真返回 $1$,为假返回 $0$) |
| `x == y` | 测试逻辑表达式 $x = y$(为真返回 $1$,为假返回 $0$) |
| `x ~= y` | 测试逻辑表达式 $x \neq y$(为真返回 $1$,为假返回 $0$) |
| `format long` | 以15位小数显示数字 |
| `format short` | 以4位小数显示数字 |
#### 8. 练习
以下是一些MATLAB编程练习,帮助巩固所学知识:
1. 使用 `linspace` 生成一个包含120个等间距数字的行向量,范围在 $(2, 5)$ 内。
2. 使用 `linspace` 生成一个范围在 $[-1, 3]$ 内,间距为 $0.1$ 的行向量,然后使用 `a:inc:b` 命令重复该过程。
3. 使用 `plot` 绘制函数 $f(x) = 3\cos(2x + 3)e^{-5x}$ 在区间 $[0, 3]$ 内的图形,包括 $x$ 轴,并标记坐标轴。
4. 重复问题3,但使用 `ezplot` 代替 `plot`。
5. 假设一个物体受到 $100$ 牛顿的力,并位移了 $3$ 米。使用MATLAB计算当力和位移向量之间的夹角 $\theta = [0, 15, 30, 45, 60, 75]$ 度时,物体所做的功 $W = Fd\cos\theta$,并使用选择的绘图符号绘制功与角度的关系图。
6. 自由悬挂在两根电线杆之间的电力线呈悬链线形状。假设顶点处 $x = 0$,电力线的曲线方程为 $f(x) = 2(e^{x/4} + e^{-x/4})$。使用 `plot` 或 `ezplot` 在区间 $[-4, 4]$ 内绘制该曲线。
7. 假设觅食者在给定区域的资源获取率由函数 $g(t) = \frac{\ln(t + 0.5)}{t}$ 给出,其中 $t$ 是在该区域觅食的时间。在MATLAB中绘制 $g(t)$ 并估计使 $g(t)$ 最大化的 $t$ 值,这对觅食者意味着什么?
8. 设 $f(x) = 3e^{-0.1x^2}$,$g(x) = -2\cos(x/2)$。使用 `plot` 在同一坐标轴上绘制函数 $f(x)$ 和 $g(x)$,$x$ 取值范围为 $0 \leq x \leq 6$,并完成以下操作:
- 标记坐标轴为 $x$ 和 $y$。
- 设置 $y$ 值范围为 $-3 \leq y \leq 4$。
- 使 $f(x)$ 和 $g(x)$ 为不同颜色。
- 包括黑色的 $x$ 轴。
- 包含图例以指示每个函数。
9. 重复问题8,但使用 `ezplot` 代替 `plot`。
10. 使用 `plot` 绘制分段定义函数 $f(x) = \begin{cases}2x + 1, & 0 \leq x < 1 \\ 3/x, & 1 \leq x \leq 4\end{cases}$ 在区间 $0 \leq x \leq 4$ 内的图形。
11. 使用 `plot` 绘制分段定义函数 $f(x) = \begin{cases}-x/2, & -1 \leq x < 0 \\ e^{3x}, & 0 \leq x \leq 1\end{cases}$ 在区间 $-1 \leq x \leq 1$ 内的图形,使用开放和封闭圆圈在图形上指示函数。
12. 编写一个MATLAB文件,使用 $\sum_{i = 1}^{n} x^2\Delta x$ (其中 $\Delta x = \frac{1}{n}$)近似计算积分 $\int_{0}^{1} x^2dx$,比较 $n = 10$、$n = 100$ 和 $n = 1000$ 时的误差。
13. 编写一个MATLAB文件,计算 $\sum_{n = 1}^{10} (\frac{1}{n} - \frac{1}{n + 1})$。
14. 编写一个MATLAB文件,使用while循环计算任意非负整数 $n$ 的阶乘 $n!$。
15. 欧几里得算法用于求 $a$ 和 $b$ 的最大公约数。将以下伪代码转换为MATLAB代码,该代码接受参数 $A$ 和 $B$ 并输出它们的最大公约数:
```matlab
a := A
b := B
r := B
while b ~= 0
r := a mod b
a := b
b := r
end while
gcd := a
output gcd
```
16. 编写一个MATLAB文件,找出前 $n$ 个斐波那契数。
17. 编写一个程序,输出给定正整数的所有约数。
18. 使用嵌套for循环编写一个程序,求两个矩阵 $A$ 和 $B$ 的和。在相加之前,使用条件语句确保矩阵的维度兼容,如果不兼容则返回错误信息。
19. 不使用 `isprime()` 函数,编写一个MATLAB文件,判断一个数字 $x$ 是否为质数。通过将 $x$ 除以小于 $\sqrt{x}$ 的所有整数并检查余数来实现,代码应在命令窗口输出该数字是否为质数的文本信息。
20. 回忆微积分II中,调和级数 $\sum_{n = 1}^{\infty} \frac{1}{n}$ 发散到无穷大。编写MATLAB代码计算 $N = 10$、$N = 100$、$N = 1000$ 和 $N = 10000$ 时的 $\sum_{n = 1}^{N} \frac{1}{n}$,确定 $N$ 必须多大才能满足 $\sum_{n = 1}^{N} \frac{1}{n} \geq 15$。
21. 已知 $\sum_{n = 1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}$。编写MATLAB代码计算 $N = 10$、$N = 100$、$N = 1000$ 和 $N = 10000$ 时的 $\sum_{n = 1}^{N} \frac{1}{n^2}$,将每个结果与 $\frac{\pi^2}{6}$ 进行比较,确定 $N$ 必须多大才能使误差满足 $\left|\sum_{n = 1}^{N} \frac{1}{n^2} - \sum_{n = 1}^{\infty} \frac{1}{n^2}\right| < 10^{-6}$。
22. 假设序列 $\{a_i\}_{i = 1}^{\infty}$ 定义如下:$a_1 = 1$,$a_2 = 3$,$a_k = a_{k - 2} + 2a_{k - 1}$($k \geq 3$)。编写一个MATLAB文件生成该序列,并找出 $a_{20}$。
23. 考虑火箭的速度由以下分段函数给出:
$v(t) = \begin{cases}11t^2 - 5t, & 0 \leq t \leq 10 \\ 1100 - 5t, & 10 < t \leq 20 \\ 50t + 2(t - 20)^2, & 20 < t \leq 30 \\ 1520e^{-0.2(t - 30)}, & t > 30 \\ 0, & \text{otherwise}\end{cases}$
开发一个使用条件语句的m文件,计算 $v$ 作为 $t$ 的函数,并生成 $v$ 与 $t$ 在区间 $[-5, 50]$ 内的关系图。
24. 考虑递归定义的序列 $x_0 = 3$,$x_{n + 1} = \sqrt{1 + x_n}$。编写一个for循环计算 $n = 1, 2, \cdots, 30$ 时的 $x_n$。在脚本开头输入 `format long` 以增加显示的小数位数。
- 写出前三个步骤计算的精确数字,然后给出 $x_{30}$。该序列是否似乎收敛到一个数字,如果是,是哪个数字?
- 手动计算 $x = \sqrt{1 + x}$ 的解,并与 (a) 中的答案进行比较。
- 修改MATLAB代码,生成序列 $x_n$ 的值,直到 “误差” $|x_n - \varphi|$ 小于 $10^{-4}$,其中 $\varphi$ 是 (b) 中找到的答案。
25. 编写一个MATLAB文件,计算前1000个质数之间的间隔大小。例如,前几个质数是 $2, 3, 5, 7, 11$,因此前几个间隔是 $1, 2, 2, 4$。然后使用 `hist()` 生成这些1000个数字的直方图,并对分布形状进行评论。
26. 在研究火箭推进时,需要考虑火箭燃烧燃料时整体质量的变化。由于动量守恒,整体动量保持不变,这意味着火箭的加速度不是恒定的。
- 设初始动量 $p_i = mv$,其中 $m$ 是火箭和燃料的总质量,$v$ 是火箭的速度。假设发动机以恒定速率燃烧,在小时间间隔 $dt$ 内,质量减少 $dm_g$,速度为 $-u$(负号表示与火箭运动方向相反)。废气相对于地球的速度为 $v - u$。设 $dv$ 是时间间隔 $dt$ 内的速度变化。最终动量 $p_f = p_{rocket} + p_{gas} = (m - dm_g)(v + dv) + dm_g(v - u)$。
- 令 $p_f = p_i$,证明 $m \cdot dv = dm_g \cdot dv + dm_g \cdot u$。
- 证明 $dv = \frac{dm_g u}{m - dm_g}$。
- 假设航天器在无重力空间中沿直线运动。推进器开启,燃料以 $2.0 \times 10^2$ kg/s 的速率喷射,速度(相对于火箭)为 $2.5 \times 10^2$ m/s。航天器和未燃烧燃料的初始质量为 $2.0 \times 10^4$ kg,推进器开启30秒。求推力(喷射燃料对火箭施加的力)和加速度 $a(t)$,编写MATLAB代码估计30秒内的速度,使用 $\Delta t = 1$。
- 在 $m \cdot dv = dm_g \cdot dv + dm_g \cdot u$ 中,由于 $dm_g \cdot dv$ 是两个小量的乘积,可以忽略不计。证明这导致 $dv = u \frac{dm}{m}$。
- 对 $dv = u \frac{dm}{m}$ 在一段时间内进行积分:$\int_{t_0}^{t_f} dv = -u \int_{t_0}^{t_f} \frac{1}{m} dm$,得到 $dv = u \ln(\frac{m_i}{m})$。这是火箭方程,由苏联物理学家康斯坦丁·齐奥尔科夫斯基于1897年首次提出。使用火箭方程解决 (c) 中的问题,并与 (d) 中的答案进行比较。
通过这些练习,可以进一步掌握MATLAB的编程技巧,提高解决实际问题的能力。不断实践和探索,你将在MATLAB编程领域取得更大的进步。
### MATLAB编程:循环、条件语句与应用实例
#### 9. 部分练习的详细解答与分析
##### 9.1 积分近似计算(练习12)
编写一个MATLAB文件,使用 $\sum_{i = 1}^{n} x^2\Delta x$ (其中 $\Delta x = \frac{1}{n}$)近似计算积分 $\int_{0}^{1} x^2dx$,比较 $n = 10$、$n = 100$ 和 $n = 1000$ 时的误差。
```matlab
% 精确值
exact_value = 1/3;
% n = 10
n1 = 10;
dx1 = 1/n1;
x1 = 0:dx1:1;
sum1 = sum(x1(1:end - 1).^2) * dx1;
error1 = abs(sum1 - exact_value);
% n = 100
n2 = 100;
dx2 = 1/n2;
x2 = 0:dx2:1;
sum2 = sum(x2(1:end - 1).^2) * dx2;
error2 = abs(sum2 - exact_value);
% n = 1000
n3 = 1000;
dx3 = 1/n3;
x3 = 0:dx3:1;
sum3 = sum(x3(1:end - 1).^2) * dx3;
error3 = abs(sum3 - exact_value);
fprintf('n = 10时,近似值: %.6f,误差: %.6f\n', sum1, error1);
fprintf('n = 100时,近似值: %.6f,误差: %.6f\n', sum2, error2);
fprintf('n = 1000时,近似值: %.6f,误差: %.6f\n', sum3, error3);
```
从代码中可以看出,随着 $n$ 的增大,$\Delta x$ 变小,近似值越来越接近精确值,误差也越来越小。这体现了数值积分中,细分区间可以提高近似精度的原理。
##### 9.2 调和级数计算(练习20)
回忆微积分II中,调和级数 $\sum_{n = 1}^{\infty} \frac{1}{n}$ 发散到无穷大。编写MATLAB代码计算 $N = 10$、$N = 100$、$N = 1000$ 和 $N = 10000$ 时的 $\sum_{n = 1}^{N} \frac{1}{n}$,确定 $N$ 必须多大才能满足 $\sum_{n = 1}^{N} \frac{1}{n} \geq 15$。
```matlab
% 计算不同N时的调和级数和
N_values = [10, 100, 1000, 10000];
for i = 1:length(N_values)
N = N_values(i);
sum_harmonic = sum(1./(1:N));
fprintf('N = %d时,调和级数和: %.6f\n', N, sum_harmonic);
end
% 确定满足和大于等于15的N
N = 1;
sum_harmonic = 0;
while sum_harmonic < 15
sum_harmonic = sum_harmonic + 1/N;
N = N + 1;
end
fprintf('满足调和级数和大于等于15的最小N: %d\n', N - 1);
```
通过代码可以直观地看到调和级数的和随着 $N$ 的增大而增大,并且可以找到满足条件的最小 $N$。这也验证了调和级数的发散性质。
#### 10. 火箭推进问题的详细分析(练习26)
##### 10.1 动量守恒推导
已知初始动量 $p_i = mv$,最终动量 $p_f = (m - dm_g)(v + dv) + dm_g(v - u)$。令 $p_f = p_i$,则:
\[
\begin{align*}
mv&=(m - dm_g)(v + dv) + dm_g(v - u)\\
mv&=mv + m\cdot dv - dm_g\cdot v - dm_g\cdot dv + dm_g\cdot v - dm_g\cdot u\\
m\cdot dv&=dm_g\cdot dv + dm_g\cdot u
\end{align*}
\]
##### 10.2 加速度推导
由 $m\cdot dv = dm_g\cdot dv + dm_g\cdot u$,因为 $dm_g\cdot dv$ 相对较小可忽略,得到 $m\cdot dv = dm_g\cdot u$,则 $dv = \frac{dm_g u}{m}$。又因为 $dm_g$ 是质量的减少量,设质量变化率为 $\frac{dm}{dt}$,在小时间间隔 $dt$ 内,$dm_g = -\frac{dm}{dt}dt$,所以 $dv = \frac{-\frac{dm}{dt}dt\cdot u}{m}$,加速度 $a=\frac{dv}{dt}=-\frac{u}{m}\frac{dm}{dt}$。
##### 10.3 MATLAB代码实现
```matlab
% 初始参数
m0 = 2.0e4; % 初始质量
u = 2.5e2; % 燃料喷射速度
dmdt = -2.0e2; % 质量变化率
dt = 1; % 时间间隔
t_total = 30; % 总时间
% 初始化变量
t = 0:dt:t_total;
m = m0 + dmdt * t;
v = zeros(size(t));
% 数值计算速度
for i = 2:length(t)
dv = (dmdt * dt * u) / m(i - 1);
v(i) = v(i - 1) + dv;
end
% 计算推力
thrust = abs(dmdt * u);
% 绘制速度-时间图
figure;
plot(t, v);
xlabel('时间 (s)');
ylabel('速度 (m/s)');
title('火箭速度随时间变化');
fprintf('推力: %.2f N\n', thrust);
```
##### 10.4 火箭方程求解
对 $dv = u \frac{dm}{m}$ 积分得到 $v - v_0 = u \ln(\frac{m_0}{m})$,在本题中 $v_0 = 0$,则 $v = u \ln(\frac{m_0}{m})$。
```matlab
% 火箭方程计算速度
v_rocket_eq = u * log(m0./m);
% 比较两种方法的结果
figure;
plot(t, v, 'b', t, v_rocket_eq, 'r--');
xlabel('时间 (s)');
ylabel('速度 (m/s)');
title('数值计算与火箭方程计算速度比较');
legend('数值计算', '火箭方程计算');
```
通过代码可以看到,数值计算和火箭方程计算的速度结果基本一致。这说明在忽略 $dm_g\cdot dv$ 的情况下,火箭方程可以很好地描述火箭的速度变化。
#### 11. 流程图总结
```mermaid
graph TD;
A[开始] --> B[选择编程任务];
B --> C{是否为循环问题};
C -- 是 --> D[选择for或while循环];
D --> E[编写循环代码];
E --> F[检查循环条件和终止条件];
F --> G[运行代码并调试];
C -- 否 --> H{是否为条件判断问题};
H -- 是 --> I[选择if-else或switch语句];
I --> J[编写条件判断代码];
J --> K[检查逻辑表达式];
K --> G;
H -- 否 --> L[根据任务选择合适的MATLAB命令];
L --> M[编写代码];
M --> G;
G --> N[分析结果并优化代码];
N --> O[完成任务];
```
#### 12. 总结
本文详细介绍了MATLAB中的循环语句(for循环和while循环)、条件语句(if - then、if - else、多重if - else和switch语句),并通过大量的代码示例和练习展示了它们的应用。同时,对一些复杂的实际问题,如数值积分、调和级数计算和火箭推进问题进行了深入分析和代码实现。通过这些内容,读者可以更深入地理解MATLAB编程的基本原理和技巧,提高解决实际问题的能力。在实际编程中,要根据具体问题选择合适的循环和条件语句,同时注意代码的注释和调试,以确保代码的正确性和可读性。不断练习和实践,才能在MATLAB编程领域取得更大的进步。
总之,MATLAB是一个功能强大的编程工具,掌握其基本的编程语句和应用方法,可以为科学研究、工程计算等领域提供有力的支持。希望本文的内容能对读者有所帮助,激发大家进一步探索MATLAB编程的兴趣。
0
0
复制全文
相关推荐










