24、MATLAB基础与应用:从棒球轨迹模拟到常用指令详解

MATLAB基础与应用:从棒球轨迹模拟到常用指令详解

1. 棒球轨迹模拟分析

1.1 无空气阻力情况

当设置空气阻力系数 c 为 0,且初始速度设为 [80, 80] 时,球会遵循常见的抛物线轨迹。球在落地前大约飞行 400 英尺,这在大多数棒球场中接近本垒打的距离。通过另外两个示波器,我们可以读取飞行时间和最终速度,球在空中停留约 5 秒,落地时的速度约为 115 英尺/秒。

1.2 考虑空气阻力(c = 0.0017)

当考虑空气阻力,且 c = 0.0017 时,轨迹发生了巨大变化。球仅飞行约 270 英尺,其最高点约为 80 英尺,大约 4.5 秒后落地,最终速度仅约为 80 英尺/秒,这对中外野手的接球手来说比无空气阻力的情况要温和得多。

1.3 不同空气阻力系数(c = 0.0014,丹佛)

c = 0.0014 (对应在丹佛打球)时,球飞行约 285 英尺,比在海平面打球远约 15 英尺。对于一些大力击球,这额外的 15 英尺可能决定是出局还是本垒打。飞行时间有非常小的增加,最终速度稍快,约为 83 英尺/秒。根据美国职业棒球大联盟的统计数据,在丹佛的击球率通常会更高。

下面是不同情况的对比表格:
| 空气阻力系数(c) | 飞行距离(英尺) | 飞行时间(秒) | 最终速度(英尺/秒) |
| — | — | — | — |
| 0 | 400 | 5 | 115 |
| 0.0017 | 270 | 4.5 | 80 |
| 0.0014 | 285 | 稍增加 | 83 |

1.4 模拟流程

graph LR
    A[设置初始条件] --> B[无空气阻力模拟]
    A --> C[考虑空气阻力模拟(c = 0.0017)]
    A --> D[考虑空气阻力模拟(c = 0.0014)]
    B --> E[记录飞行距离、时间和速度]
    C --> E
    D --> E
    E --> F[对比分析结果]

2. MATLAB常用对象概述

MATLAB 中的常用对象可分为六类:运算符、内置常量、内置函数、命令、图形命令和 MATLAB 编程结构。虽然 MATLAB 不区分命令和函数,但我们可以将 MATLAB 函数看作数学函数,它可以被求值或绘图;而命令则用于操作数据、表达式或启动某个过程。

2.1 MATLAB运算符

运算符 描述 示例
\ 左矩阵除法, X = A\B 是方程 A*X = B 的解 A = [1 0; 2 1]; B = [3; 5]; A\B
/ 普通标量除法或右矩阵除法,对于矩阵, A/B 本质上等同于 A*inv(B) -
* 标量或矩阵乘法 -
. 与算术运算符结合使用,强制对数组进行逐元素操作,也用于访问结构体数组的字段 a = [1 2 3]; b = [4 -6 8]; a.*b
.* 数组的逐元素乘法 -
^ 标量或矩阵幂运算 -
.^ 数组的逐元素幂运算 -
: 范围运算符,用于定义向量和矩阵 X = 0:0.1:30;
' 矩阵的复共轭转置,也用于界定字符串的开始和结束 -
; 抑制 MATLAB 命令的输出,可用于分隔命令行上的命令,也用于分隔矩阵或列向量的行 [1; 2; 3]
, 分隔矩阵行的元素或命令的参数,也可用于分隔命令行上的命令 -
.' 矩阵的转置 -
... 行继续运算符,不能在引号字符串内使用 1 + 3 + 5 + 7 + 9 + 11 ... + 13 + 15 + 17
! 从操作系统运行命令 !C:\Programs\program.bat
% 注释,MATLAB 将忽略同一行的其余部分 -
@ 创建函数句柄 fminbnd(@cos, 0, 2*pi)

2.2 内置常量

  • eps :大约是计算机浮点舍入误差的大小,在大多数计算机上约为 2 × 10−16
  • exp(1) e = 2.71828 ... ,注意 e 没有特殊含义。
  • i i = √−1 ,这个赋值可以被覆盖,例如在 for 循环中使用 i 作为索引时,可使用 j 作为虚数单位。
  • Inf ,也可以用小写 inf
  • NaN :非数字,用于不确定的表达式,如 0/0
  • pi π = 3.14159 ...

2.3 内置函数

以下是一些常见的内置函数:
- abs |x|
- acos arccos x
- asin arcsin x
- atan arctan x ,如果需要点 (x, y) 的角坐标 θ ,请使用 atan2
- bessel :贝塞尔函数, besselj(n, x) bessely(n, x) n 阶贝塞尔方程的线性无关解
- conj :给出复数的复共轭,例如 conj(1 - 5*i)
- cos cos x
- cosh cosh x
- cot cot x
- erf :误差函数 erf(x) = (2/√π) ∫₀ˣ e⁻ᵗ² dt
- exp
- expm :矩阵指数
- gamma :伽马函数 Γ(x) = ∫₀^∞ e⁻ᵗtˣ⁻¹dt (当 Re x > 0 时),对于非负整数 k Γ(k + 1) = k! 有时很有用
- imag imag(z) ,复数的虚部
- log :自然对数 ln x = logₑ x
- real real(z) ,复数的实部
- sec sec x
- sech sech x
- sign :根据参数为负、零或正返回 -1 0 1
- sin sin x
- sinh sinh x
- sqrt √x
- tan tan x
- tanh tanh x

2.4 MATLAB命令

MATLAB 命令用于操作数据和执行各种任务,以下是一些常见命令及其示例:
- addpath :将指定目录添加到 MATLAB 的文件搜索路径,例如 addpath C:\my--mfiles
- ans :一个变量,保存最近未赋值输出的值
- cd :将指定目录设置为当前(工作)目录,例如 cd C:\mydocs\mfiles
- char :将符号表达式转换为字符串,用于定义内联函数,例如:

syms x y
f = inline(char(sin(x)*sin(y)))
  • clear :清除变量和函数的值和定义,如果指定一个或多个变量,则仅清除这些变量,例如 clear clear f g
  • collect :收集指定符号变量的幂的系数,例如:
syms x y
collect(x^2 - 2*x^2 + 3*x + x*y, x)
  • compose :函数组合,例如:
syms x y; f = exp(x); g = sin(y); h = compose(f, g)
  • ctranspose :矩阵的共轭转置,通常使用 ' 运算符调用,对于实矩阵等同于 transpose ,例如:
A = [1 3 i]
A'
  • D :用于 dsolve 中表示微分,例如 dsolve('x*Dy + y = sin(x)', 'x')
  • delete :删除文件,例如 delete <filename>
  • det :矩阵的行列式,例如 det([1 3; 4 5])
  • diag :创建具有指定对角向量的方阵,或提取方阵的对角线元素,例如:
V = [2 3 4 5]; diag(V)
X = [2 3; 4 5]; diag(X)
  • diary :将 MATLAB 会话的记录写入文件,例如 diary <filename> diary off
  • diff :符号微分运算符(也是差分运算符),例如:
syms x; diff(x^3)
diff('x*y^2', 'y')
  • dir :列出当前工作目录中的文件,类似于 ls
  • disp :显示输出而不先给出其名称,例如:
x = 5.6; disp(x)
syms x; disp(x^2)
disp('This will print without quotes.')
  • double :为数值或符号量提供双精度值,应用于字符串时,返回字符串中字符的 ASCII 码向量,例如:
z = sym('pi'); double(z)
double('think')
  • dsolve :符号常微分方程求解器,默认独立变量是 t ,但可以在最后一个参数中指定不同的变量,例如:
dsolve('D2y - x*y = 0', 'x')
dsolve('Dy + y^2 = 0', 'y(0) = 1', 'x')
[x, y] = dsolve('Dx = 2x + y', 'Dy = - x')
  • echo :打开或关闭脚本 M 文件中命令的回显
  • edit :在编辑器/调试器中打开指定的 M 文件,例如 edit mymfile
  • eig :计算方阵的特征值和特征向量,例如:
eig([2, 3; 4, 5])
[e, v] = eig([1, 0, 0; 1, 1, 1; 1, 2, 4])
  • end :向量的最后一个元素,也是一个编程命令,例如 v(end) v(3:end)
  • eval :用于将字符串作为 MATLAB 表达式求值,在 M 文件中很有用,例如 eval('cos(x)')
  • expand :展开代数表达式,例如:
syms x y; expand((x - y)^2)
  • eye :创建指定大小的单位矩阵,例如 eye(5)
  • factor :分解多项式,例如:
syms x y; factor(x^4 - y^4)
  • feval :计算由字符串指定的函数,在函数 M 文件中很有用,例如 feval('exp', 1)
  • find :查找向量或矩阵中非零元素的索引,例如 X = [2 0 5]; find(X)
  • fminbnd :在区间上找到函数的最小(近似)值,例如:
fminbnd('x^4 - x^2 + 1', 0, 1)
f = inline('x^3 - 7*x^2 - 5*x + 2', 'x'); fminbnd(f, 4, 6)
  • format :指定数值变量的输出格式,例如 format long
  • fzero :尝试在给定起始点附近或指定区间上找到指定函数的零点,例如:
fzero(inline('cos(x) - x'), 1)
fzero(@cos, [-pi 0])
  • guide :打开 GUI 设计环境,例如 guide mygui
  • help :请求 MATLAB 命令的文档,例如 help factor
  • inline :从字符串表达式构造 MATLAB 内联函数,例如:
f = inline('x^5 - x'); f(3)
sol = dsolve('Dy = x^2 + y', 'y(0) = 2', 'x');
fsol = inline(vectorize(sol), 'x')
  • int :积分运算符,用于定积分和不定积分,例如:
int('1/(1 + x^2)', 'x')
syms x; int(exp(-x), x, 0, Inf)
  • inv :方阵的逆,例如 inv([1 2; 3 5])
  • jacobian :计算雅可比矩阵,对于标量函数,计算符号梯度,例如:
syms x y; f = x^2*y^3; jacobian(f)
  • length :返回向量或字符串的元素个数,例如 length('abcde')
  • limit :求双侧极限,如果存在的话,使用 'right' 'left' 求单侧极限,例如:
syms x; limit(sin(x)/x, x, 0)
syms x; limit(1/x, x, Inf, 'left')
  • linspace :生成线性间隔的点的向量,例如 linspace(0, 2*pi, 30)
  • load :从磁盘文件加载工作区变量,例如 load filename
  • lookfor :在 MATLAB 路径中找到的所有 M 文件的第一行中搜索指定字符串,例如 lookfor ode
  • ls :列出当前工作目录中的文件,类似于 dir
  • maple :通过字符串访问 Maple 内核,通常以 maple('function', 'arg') 的形式使用,学生版不可用,例如 maple('help', 'csgn')
  • max :计算向量元素的算术最大值,例如 X = [3 5 1 -6 23 -56 100]; max(X)
  • mean :计算向量元素的算术平均值,例如:
X = [3 5 1 -6 23 -56 100]; mean(X)
syms x y z; X = [x y z]; mean(X)
  • median :计算向量元素的算术中位数,例如 X = [3 5 1 -6 23 -56 100]; median(X)
  • min :计算向量元素的算术最小值,例如 X = [3 5 1 -6 23 -56 100]; min(X)
  • more :打开或关闭 MATLAB 输出的逐页滚动,使用空格键前进到下一页,回车键逐行前进,Q 键中止输出,例如 more on more off
  • notebook :打开 M 书(仅适用于 Windows),例如 notebook problem1.doc notebook -setup
  • num2str :将数字转换为字符串,在编程中很有用,例如 constant = ['a' num2str(1)]
  • ode45 :一阶常微分方程的数值求解器,例如:
f = inline('t^2 + y', 't', 'y')
[x, y] = ode45(f, [0 10], 1);
plot(x, y)
  • ones :创建全为 1 的矩阵,例如 ones(3) ones(3, 1)
  • open :打开文件,具体方式取决于文件名扩展名,例如 open myfigure.fig
  • path :不带参数时,显示搜索路径;带参数时,设置搜索路径,例如 path path(...)
  • pretty :以更易读的格式显示符号表达式,例如:
syms x y; expr = x/(x - 3)/(x + 2/y)
pretty(expr)
  • prod :计算向量元素的乘积,例如 X = [3 5 1 -6 23 -56 100]; prod(X)
  • pwd :显示当前(工作)目录的名称
  • quadl :数值积分命令,在 MATLAB 5.3 或更早版本中使用 quad8 ,例如:
format long; quadl('sin(exp(x))', 0, 1)
g = inline('sin(exp(x))'); quad8(g, 0, 1)
  • quit :终止 MATLAB 会话
  • rand :随机数生成器,生成 0 到 1 之间的随机数
  • rank :矩阵的秩,例如 A = [2 3 5; 4 6 8]; rank(A)
  • roots :找到多项式的根,多项式的系数由向量参数的元素给出,例如 roots([1 2 2])
  • round :将数字四舍五入到最接近的整数
  • save :将工作区变量保存到指定文件,例如 save filename
  • sim :运行 SIMULINK 模型,例如 sim('model')
  • simple :尝试使用多种方法简化表达式,例如:
syms x y;[expression, how] = simple(sin(x)*cos(y) + cos(x)*sin(y))
  • simplify :尝试符号简化表达式,例如:
syms x; simplify(1/(1 + x)^2 - 1/(1 - x)^2)
  • simulink :打开 SIMULINK 库
  • size :返回矩阵的行数和列数,例如:
A = [1 3 2; 4 1 5]
[r, c] = size(A)
  • solve :求解方程或方程组,如果省略方程的右侧,则默认为 0 ,例如:
solve('2*x^2 - 3*x + 6')
[x, y] = solve('x + 3*y = 4', '-x - 5*y = 3', 'x', 'y')
  • sound :通过计算机扬声器播放向量,例如 sound(sin(0:0.1*pi:1000*pi))
  • strcat :连接两个或多个字符串,例如 strcat('This ', 'is ', 'a ', 'long ', 'string.')
  • str2num :将字符串转换为数字,在编程中很有用,例如:
constant = 'a7'
index = str2num(constant(2))
  • subs :替换表达式的部分内容,例如:
subs('x^3 - 4*x + 1', 'x', 2)
subs('sin(x)^2 + cos(x)', 'sin(x)', 'z')
  • sum :对向量求和,或对矩阵的列求和,例如 k = 1:10; sum(k)
  • sym :创建符号变量或数字,例如 sym pi x = sym('x') constant = sym('1/2')
  • syms :创建符号变量的快捷方式, syms x 等同于 x = sym('x') ,例如 syms x y z
  • symsum :对向量进行符号求和,可能有无限多个元素,例如:
syms x k n; symsum(x^k, k, 0, n)
syms n; symsum(n^(-2), n, 1, Inf)
  • taylor :给出指定阶数(默认是 5)在指定点(默认是 0)的泰勒多项式逼近,例如:
syms x; taylor(cos(x), 8, 0)
taylor(exp(1/x), 10, Inf)
  • transpose :矩阵的转置(与 ctranspose 比较),将列向量转换为行向量,反之亦然,通常使用 .' 运算符调用,例如:
A = [1 3 4]
A.'
  • type :显示指定文件的内容,例如 type myfile.m
  • vectorize :向量化符号表达式,用于定义内联函数,例如 f = inline(vectorize('x^2 - 1/x'))
  • vpa :使用可变精度算术将表达式求值到指定的精度,例如 vpa('1/3', 20)
  • whos :列出工作区中所有变量的当前信息
  • zeros :创建全为 0 的矩阵,例如 zeros(10) zeros(3, 1)

3. MATLAB 图形命令详解

MATLAB 的图形命令可以帮助我们直观地展示数据和函数,下面详细介绍一些常见的图形命令。

3.1 图形命令列表

命令 描述 示例
area 生成 x 轴和曲线之间区域的阴影图 X = 0:0.1:4*pi; Y = sin(X); area(X, Y)
axes 创建一个空的图形窗口 -
axis 设置坐标轴的缩放和外观 axis([xmin xmax ymin ymax]) :设置坐标轴范围; axis tight :将坐标轴限制设置为数据的全范围; axis equal :使水平和垂直刻度相等; axis square :使坐标轴框为正方形; axis off :隐藏坐标轴和刻度标记
bar 绘制条形图 bar([2, 7, 1.5, 6])
cla 清除坐标轴 -
close 关闭当前图形窗口; close all 关闭所有图形窗口 -
colormap 设置当前图形的颜色映射;可通过 help graph3d 查看颜色映射示例 X = 0:0.1:4*pi; Y = sin(X); colormap cool
comet 显示动画参数化绘图 t = 0:0.1:4*pi; comet(t.*cos(t), t.*sin(t))
contour 绘制二元函数的等高线图,通常与 meshgrid 一起使用 [X, Y] = meshgrid(-3:0.1:3, -3:0.1:3); contour(X, Y, X.^2 - Y.^2)
contourf 填充等高线图,常与 colormap 一起使用 [X,Y] = meshgrid(-2:0.1:2, -2:0.1:2); contourf(X, Y, X.^2 - Y.^3); colormap autumn
ezcontour 轻松绘制等高线或水平曲线 ezcontour('x^2 - y^2') syms x y; ezcontour(x - y^2)
ezmesh 轻松绘制曲面的网格视图 ezmesh('x^2 + y^2') syms x y; ezmesh(x*y)
ezplot 轻松绘制符号表达式的图形 ezplot('exp(-x^2)', [-5, 5]) syms x; ezplot(sin(x))
ezplot3 轻松绘制三维参数曲线 ezplot3('cos(t)', 'sin(t)', 't') syms t; ezplot3(1 - cos(t), t - sin(t), t, [0 4*pi])
ezsurf 轻松绘制曲面的标准阴影视图 ezsurf('(x^2 + y^2)*exp(-(x^2 + y^2))') syms x y; ezsurf(sin(x*y), [-pi pi -pi pi])
figure 创建一个新的图形窗口 -
fill 创建填充多边形,也可参考 patch fill([0 1 1 0], [0 0 1 1], 'b'); axis equal tight

3.2 图形绘制流程

graph LR
    A[定义数据] --> B[选择图形类型]
    B --> C[设置图形属性]
    C --> D[绘制图形]
    D --> E[显示图形]

4. MATLAB 使用示例总结

4.1 综合示例:求解并绘制微分方程

以下是一个综合使用 MATLAB 命令求解并绘制微分方程的示例:

% 定义微分方程
f = inline('t^2 + y', 't', 'y');

% 求解微分方程
[x, y] = ode45(f, [0 10], 1);

% 绘制解的图形
plot(x, y);
xlabel('t');
ylabel('y');
title('Solution of the differential equation');

4.2 操作步骤总结

  • 定义微分方程 :使用 inline 函数定义微分方程。
  • 求解微分方程 :使用 ode45 函数求解微分方程,指定时间范围和初始条件。
  • 绘制图形 :使用 plot 函数绘制解的图形,并使用 xlabel ylabel title 函数添加坐标轴标签和标题。

4.3 MATLAB 常用对象总结

类别 示例对象
运算符 \ , / , * , . , .* , ^ , .^ , : , ' , ; , , , .' , ... , ! , % , @
内置常量 eps , exp(1) , i , Inf , NaN , pi
内置函数 abs , acos , asin , atan , bessel , conj , cos , cosh , cot , erf , exp , expm , gamma , imag , log , real , sec , sech , sign , sin , sinh , sqrt , tan , tanh
命令 addpath , ans , cd , char , clear , collect , compose , ctranspose , D , delete , det , diag , diary , diff , dir , disp , double , dsolve , echo , edit , eig , end , eval , expand , eye , factor , feval , find , fminbnd , format , fzero , guide , help , inline , int , inv , jacobian , length , limit , linspace , load , lookfor , ls , maple , max , mean , median , min , more , notebook , num2str , ode45 , ones , open , path , pretty , prod , pwd , quadl , quit , rand , rank , roots , round , save , sim , simple , simplify , simulink , size , solve , sound , strcat , str2num , subs , sum , sym , syms , symsum , taylor , transpose , type , vectorize , vpa , whos , zeros
图形命令 area , axes , axis , bar , cla , close , colormap , comet , contour , contourf , ezcontour , ezmesh , ezplot , ezplot3 , ezsurf , figure , fill

通过以上介绍,我们对 MATLAB 的常用对象、命令和图形绘制有了更深入的了解。在实际应用中,我们可以根据具体需求选择合适的对象和命令来完成各种任务。同时,多进行实践和尝试,不断探索 MATLAB 的强大功能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值