
简介这份《Matlab试题及答案》PDF面向高校学生、软件实训课学习者以及需要巩固Matlab基础的初学者用于配合《Matlab软件实训》课程完成练习与自测。内容围绕数组运算与方程组求解、数值运算与条件判断、符号运算与定积分、二维曲线绘制以及Simulink建模仿真等典型任务展开每题都附有解题思路、完整命令和运行结果例如用左除运算符求解AxB、用max配合循环统计各科最高分与总分最高学生、用syms与int计算定积分、用linspace与plot绘制ysin(x)*cos(5x)曲线便于对照理解Matlab的矩阵输入、M文件编写和输出格式化方法。资源包共1个PDF文件大小约393KB结构紧凑、便于打印或随身查阅。目前已有103人学习适合作为课堂练习的参考答案与期末复习提纲也可帮助读者建立从基本命令到Simulink仿真的完整知识脉络。1. 课程设计CS作业与实训资料里藏着的四条 Matlab 入口课程设计CS类作业和实训资料在班级群、实验室之间互传时最常见的载体就是一份 PDF 加几个 .m 文件。《Matlab 软件实训》这份题目集就是典型样本四道主任务分别落在矩阵求解、成绩统计、符号积分与曲线绘制、Simulink 建模仿真上每题都附了原始命令和运行输出。把它当答案册翻掉很浪费它真正串起来的是 Matlab 的四条常用入口——数组怎么输入、内置函数怎么带参数、M 文件怎么组织输入输出、图形化建模怎么和命令行互相验证。适合刚装好环境不知从哪下手的人也适合几年没碰、需要快速找回\、max、syms、plot手感的人。2. 矩阵与列向量的输入语法以及左除右除的数学差异2.1 矩阵输入的语法细节与构造函数Matlab 里所有变量都以数组为基本单位手写输入只有两条规则同一行内元素用空格或逗号分隔换行用分号。题目里的 4×4 系数矩阵和 4×1 常数向量少写一个分号就会从解方程变成维度不匹配报错。原始答案分两行输入 A 和 B靠的是回车换行在脚本文件里跨行写矩阵时如果末尾漏掉分号Matlab 会当成两条语句处理A 直接变成 4×1 的列向量。% 4x4 系数矩阵行内用空格或逗号换行用分号 A [-3 5 0 8; 1 -8 2 -1; 0 -5 9 3; -7 0 -4 5]; % 列向量分号表示换行得到 4x1 B [0; 2; -1; 6]; % 用函数代替手输避免长矩阵敲错 E eye(3); % 3x3 单位阵 Z zeros(2,4); % 2x4 全零 R rand(3,3); % 均匀分布随机数 D diag([1 2 3]); % 对角矩阵对角线取自向量上面这段的关键在于 B 的形状写成[0 2 -1 6]会得到 1×4 行向量A\B立刻报维度不一致。拿到输入后先用size(A)、size(B)打印一眼比出了问题再回头找便宜得多。常用的构造函数语义重复度高但每个都有独立参数习惯下面这张表是实测里最容易混淆的几个。函数作用典型调用容易踩的点ones全 1 矩阵ones(2,3)只写 ones(3) 得到 3×3 方阵zeros全 0 矩阵zeros(2,4)同上单参数是方阵eye单位阵eye(4)eye(3,4) 生成矩形不是单位阵diag对角矩阵 / 取对角diag(v) / diag(A)同一函数双向语义看入参类型reshape重塑矩阵reshape(A,2,6)按列顺序读入不是按行rand / randn随机矩阵rand(3,3)randn 服从正态会出负数2.2 左除\和右除/解的不是同一个方程矩阵乘法不满足交换律A\B解的是A*X BB/A解的是X*A B两者只有在 A 对称且条件特殊时才偶然相等。原始题目未知量在等号左侧所以用左除如果题目改成X*A B却照抄A\B得到的解能通过语法检查但数值完全对不上原始约束属于最难查的一类错误。X A\B; % 解 A*X B本题的正确入口 res norm(A*X - B); % 残差1e-15 量级说明数值上成立 Xr B/A; % 解 X*A B 的入口本题不适用残差这一行值得养成习惯。norm(A*X-B)直接回答这个解到底代回去对不对比肉眼看 X 的几位小数可靠。当 A 不是方阵时左除的行为随形状改变需要提前判断属于哪一类问题。A 的形状方程类型A\B的行为m n 且满秩唯一解直接求解结果精确m n超定方程组返回最小二乘解通常无精确解m n欠定方程组返回基解最多 m 个非零元带警告秩小于 min(m,n)奇异可能报警告或给无穷范数解需换方法2.3 奇异、病态与分解求解的兜底写法系数矩阵行列式接近零时左除给出的结果对输入扰动极其敏感这时先看条件数再决定要不要换算法。cond(A)返回最大奇异值与最小奇异值之比10 的幂次越大越病态rank(A)小于矩阵阶数说明列向量线性相关。常见做法是先用pinv求伪逆拿最小二乘解再用 LU 或 QR 分解交叉验证两条路线结果一致才敢用。c cond(A); % 条件数判断病态程度 if rank(A) min(size(A)) Xp pinv(A)*B; % 奇异或超定时的最小二乘解 end [L,U] lu(A); Xl U\(L\B); % LU 分解先解 L*YB再解 U*XY [Q,R] qr(A); Xq R\(Q\B); % QR 分解Q 正交R 上三角LU 分解把一次求解拆成两个三角方程前代和回代都是 O(n²)比直接求逆快一个量级也因此成为重复求解同一系数矩阵、只换右端项时的标准做法。QR 分解的数值稳定性更好处理接近奇异的矩阵时优先选它。命令行验证时把三种结果相减范数在 1e-12 以下就说明彼此吻合如果差出好几个数量级问题多半出在矩阵本身而不是算法。注意lu默认返回的 L 与 U 满足A L*U但对一般矩阵会先做行置换直接用L\B而不接收置换矩阵 P在部分矩阵上会得到错误结果。稳妥写法是[L,U,P] lu(A)再解U\(L\(P*B))。3. 三门课成绩统计max、sum 与维度参数的用法3.1 原始 for 加 if 写法的执行路径答案里的成绩统计程序用了三层嵌套外层for i1:3循环里层if i1 / elseif i2 / else分支每个分支各调一次max。这段代码能跑通但三次判断纯属多余真正起作用的是[y1,t1]max(a,[],2)这一行。第二个参数[]是占位符表示不指定与谁比较第三个参数 2 表示沿第 2 维取最大对 1×5 的行向量来说就是取整体最大值并返回所在列下标也就是学生序号。a input(高数成绩); % 输入形如 [78 89 64 73 68] [y1,t1] max(a,[],2); % y1 为最高分t1 为所在列下标学生序号 b input(英语成绩); [y2,t2] max(b,[],2);max(a,[],2)里的[]不能省成max(a,2)那样表示与标量 2 逐元素比较取大结果完全变样。行向量上max(a)与max(a,[],2)等效但换成矩阵后语义立刻分叉所以写全维度参数更保险。3.2 用矩阵一次算完三门课把三行成绩拼成一个 3×5 矩阵行表示科目、列表示学生一次max加一次sum就能拿到全部答案。原来需要三次调用、三次分支的工作在矩阵形状对齐后压缩成两行这也是 Matlab 最核心的向量化思路先想清楚数据沿哪个维度排布再让函数沿该维度计算。S [78 89 64 73 68; 83 77 80 78 70; 82 91 78 82 68]; % 3 行 x 5 列行是科目列是学生 names [高数,外语,电路]; [sMax, sIdx] max(S, [], 2); % 沿行方向每门课的最高分及学生序号 total sum(S, 1); % 沿列方向每个学生的三科总分 [tMax, tIdx] max(total); % 总分最高分及学生序号维度参数决定结果形状混淆是统计类题目最常出的错。max(S,[],1)得到 1×5 行向量含义是每个学生三门课里的最高分max(S,[],2)得到 3×1 列向量含义是每门课全班最高分。题目要的是后者。sum同理sum(S,1)得到 1×5 的总分行向量正是后续求总分最高分需要的输入。调用聚合方向返回形状实际含义max(S,[],1)跨行求最大1×5每个学生的单科最高分max(S,[],2)跨列求最大3×1每门课的班级最高分sum(S,1)跨行求和1×5每个学生的三科总分sum(S,2)跨列求和3×1每门课的班级总分3.3 输出格式化与输入校验原始代码用disp拼接字符串写起来要反复调num2str数字一旦是小数还会带出一串不必要的位数。换成fprintf控制格式更省事%d输出整数、%s输出字符串、\n换行。for k 1:3 fprintf(%s最高分是 %d 号 %d 分\n, names(k), sIdx(k), sMax(k)); end fprintf(总分最高分是 %d 号 %d 分\n, tIdx, tMax);输入环节也值得加两道防线。input返回值可能是空、可能是长度不对的数组、也可能是超出 0~100 的异常值直接丢进max会一路错到输出端才暴露。assert(numel(a) 5, 本班应为 5 人输入长度为 %d, numel(a)); assert(isnumeric(a) all(a 0 a 100), 成绩应为 0~100 的数值);提示max在存在并列最高分时只返回第一个位置的下标。需要列出全部并列学生用find(a max(a))取所有下标。4. M 文件里的符号积分与二维绘图syms、int、linspace、plot4.1 函数文件与脚本文件的分界M 文件分两类脚本文件按顺序执行命令函数文件以function开头、有独立的输入输出。题目里的积分和绘图都要传入区间参数所以必须写成函数文件且文件名与函数名保持一致否则调用时报未定义函数。函数体内的变量作用域与命令窗口隔离这也是函数文件比脚本更适合作业提交格式的原因。function y J(a,b) syms x y int(sin(x), x, a, b); % 末尾没加分号函数体内会打印一次 end调用J(0,pi/2)之后命令窗口出现两行输出一行y 1、一行ans 1很多人以为算了两遍。第一行来自函数体内y int(...)缺分号第二行来自调用语句缺分号返回的 y 被赋给 ans 再打印一次。给两处都补上分号窗口就只剩一行干净的ans 1。4.2 int 求定积分的返回值形态int的第一个参数是被积表达式第二个是积分变量第三、四个是上下限省略上下限就是求不定积分。返回类型始终是符号对象直接拿去做数值比较或画图会报类型错误需要double转一次。syms x a b I1 int(sin(x), x, a, b); % 上下限是符号变量返回含 a、b 的表达式 I2 int(sin(x), x, 0, pi/2); % 上下限是数值直接得到符号常数 I3 double(I2); % 转双精度供后续数值运算 F int(exp(-x^2), x, 0, 1); % 无初等原函数返回未求值形式 F2 vpa(F, 8); % 高精度数值化 F3 integral((x) exp(-x.^2), 0, 1); % 直接数值积分兜底常用的积分函数对照如下符号求解和数值求解各顶一半场景选错路线容易卡在为什么算不出结果上。函数输入类型输出适用场景int符号表达式符号表达式有解析原函数的定积分、不定积分vpa符号表达式高精度符号数结果含长串根式或 π 时读起来省事integral函数句柄双精度数解析解不存在或表达式复杂trapz数值向量双精度数只有离散采样点没有解析式4.3 用 linspace 和点乘画出 sin(x)cos(5x)绘图题的输入其实不是 x而是自变量区间和采样点数。linspace(a,b,n)在 a 到 b 之间等间距取 n 个点端点必定取到冒号表达式a:step:b按步长推进末尾点可能落在区间外被丢掉。画高频的cos(5x)时采样点太少曲线上的波峰会被抹平默认 100 点看着像一条粗糙的折线。function y H(a,b,n) if nargin 3, n 500; end % 采样点可调默认 500 x linspace(a, b, n); y sin(x).*cos(5*x); % 必须用点乘逐元素相乘 plot(x, y, LineWidth, 1.2); grid on; xlabel(x); ylabel(y); y y; % 保留输出便于命令行取数据 end*是矩阵乘法.*是逐元素乘法。x 是 1×n 行向量sin(x)与cos(5*x)同为 1×n用.*得到同为 1×n 的乘积用*会因为内维不匹配直接报错若尺寸恰好相等还会算出错误的标量点积。原始答案定义了两个正弦余弦函数却没接收返回值命令窗口打出一大段Columns 1 through 9那是 100 个 y 值被当成结果显示调用时补一个分号即可。写法点数端点行为说明0:0.1:111末点可能取不到步长优先点数不确定linspace(0,1,11)11两端必取到点数优先步长自动算linspace(0,2*pi)100两端必取到不给 n 时固定 100 点0:0.001:2*pi6284末点可能取不到高频曲线用密采样注意区间端点用pi、2*pi这样的表达式写不要手写 6.28。三角函数周期与 π 绑定手写近似值在采样点稀少时会明显偏移波峰位置。5. Simulink 建模仿真与命令行结果互验5.1 模块选型与连线y sin(x)·cos(5x)的仿真模型只需要四个模块两个 Sine Wave 分别产生 1 rad/s 和 5 rad/s 的正弦波一个 Product 做逐元素相乘一个 Scope 观察输出。从 Sources 库拖出 Sine WaveMath Operations 库拖出 ProductSinks 库拖出 Scope把两个信号源同时接到 Product 的两个输入端Product 输出接 Scope连线时注意端口顺序不影响乘法结果。模块位置参数项建议值Sine WaveSourcesFrequency1单位 rad/sSine Wave1SourcesFrequency5单位 rad/sProductMath OperationsInputs2乘法模式ScopeSinks采样点数默认即可Sine Wave 的 Frequency 单位是 rad/s 而不是 Hz写 5 表示 5 rad/s换成 5 Hz 相当于 31.4 rad/sScope 上的波形会密到看不清。仿真时长在模型窗口工具栏直接写2*piSimulink 接受表达式不必换算成 6.283。5.2 求解器参数与命令行对照Configuration Parameters 里的 Solver 决定数值推进方式。变步长 ode45 是默认选项精度够用要跟命令行生成的曲线逐点比对换成定步长并设成 1e-3两条曲线的采样点位就能对齐。命令行侧的参考曲线用同一组参数生成再叠加到同一张图上。out sim(myModel, StopTime, 2*pi); % 命令行启动仿真 t 0:0.001:2*pi; ref sin(t).*cos(5*t); % 与模型同参数的参考曲线 plot(t, ref, LineWidth, 1.2); grid on;仿真跑完后Scope 曲线在[0, 2π]内的过零点数量、每个波峰的横坐标应当与ref完全重合。如果幅值对得上但相位偏了检查两个 Sine Wave 的 Phase 是否都保持在 0如果只在两端偏差明显把定步长再减半试一次。把StopTime参数从字符串改成数字 6.28 会带入 0.002 的区间偏差最后一个波峰恰好落在误差最敏感的位置这类对不齐大多不是求解器精度问题而是参数写法偷了懒。本文还有配套的精品资源点击获取