
简介这是一份面向电工学学习者的MATLAB M文件合集围绕电路分析、信号处理、滤波器设计、电力系统建模与控制器设计等典型问题展开适合正在学习电工学或MATLAB编程的本科生、研究生及工程技术人员参考。压缩包共8个文件含7个M脚本/函数文件和1个Simulink模型文件整体仅8KB体积小巧但知识点密集。目前已有142人学习使用。这些M文件分别对应独立的电工学求解场景例如基尔霍夫定律方程组求解、傅里叶变换与拉普拉斯变换实现、FIR/IIR滤波器设计、发电机变压器模型构建以及PID控制器参数优化等Simulink模型则可用于搭建设备交互界面方便输入参数并观察波形、频谱或相位结果。通过研读源码与模型读者既能巩固理论又能掌握将电工学公式转化为可运行MATLAB程序的思路提升解决实际电路与系统问题的能力。1. 文件名全是 Untitled正好是电工学作业的典型形态拿到MATLAB_m_file.rar解压之后映入眼帘的是八个 M 文件加一个.mdl模型文件名全部是 Untitled2 到 Untitled8。第一眼的观感确实像随手保存的草稿但这恰恰是很多电气、自动化专业学生交电工学作业时的真实状态在 MATLAB 里把电路方程和信号处理脚本跑通看到曲线合理就打包交付完全没有精力整理命名。这个资源包对两类人最有用一类是正在做电工学课程设计、实验报告或补交作业的学生需要一份能跑通、能修改的代码基线另一类是想把 MATLAB 从“点按钮”推向“批量计算”的工程师。我拆完这个包之后最大的感受是单个文件的价值有限真正值得提炼的是一条“电工学问题 → 矩阵求解 → 可视化验证”的标准链路下面按这条链路把脚本和 mdl 模型拆开来读。2. 拆包先建坐标系脚本、函数与 mdl 在电工学里的分工2.1 脚本和函数的边界决定代码能不能复用八个.m文件全部以 Untitled 命名基本可以断定它们大都是脚本文件而不是函数文件。脚本文件的特点是写在里面的所有变量都会留在 MATLAB 工作区里运行完R100、Vs12这些中间量都能直接在 Workspace 里看到适合在命令行交互阶段快速验证。缺点也很明显变量之间互相覆盖改一处参数就得整体重跑而且脚本之间没法像函数那样传参。函数文件以function [输出] 函数名(输入)开头输出变量只存在于函数内部不污染工作区。电工学问题里如果一批脚本要反复计算不同阻值、不同频率下的响应把核心方程封装成函数要比复制脚本改参数安全得多。常见做法是把脚本里G \ I这一段抽出来输入电阻数组和电源电压输出节点电压和支路电流这样后面的 Untitled5、Untitled6 就不需要再复制一份脚本。命名混乱的 Untitled 系列本质上就是缺乏函数抽象导致的副本堆积理解这一点读这个包的时候就不会被文件名绕晕。2.2 节点电压法是这批脚本最底层的矩阵骨架翻开任意一个交流或直流电路求解脚本大概率能看到同一个结构先定义元件参数再组装矩阵最后用反斜杠一次性求出未知量。拿一个三节点直流电路示例这段脚本的基本形态是% node_voltage_demo.m % 三节点电路节点3接地用于电工学直流分析 R1 100; % 单位欧姆节点1到电源正极 R2 220; % 节点1与节点2之间的电阻 R3 330; % 节点2到地的电阻 Vs 12; % 电压源幅值单位伏特 % 电导矩阵 G对角线是自电导非对角线是互电导 G [(1/R1 1/R2), -1/R2; -1/R2, (1/R2 1/R3)]; % 电流注入向量电压源经R1折算到节点1 I [Vs/R1; 0]; % 矩阵除法求解节点电压不要用 inv(G)*I V G \ I; fprintf(V1 %.3f V\n, V(1)); fprintf(V2 %.3f V\n, V(2)); fprintf(I_R3 %.3f A\n, V(2)/R3);电导矩阵对角线上的元素是连接到该节点的所有电导之和非对角线元素是两个节点之间的电导取负这是基尔霍夫电流定律的矩阵形态。电源向量由电压源除以串联电阻得到相当于把电压源做了诺顿等效。用G \ I而不是inv(G)*I是因为反斜杠运算走 LU 分解数值稳定性更好矩阵接近奇异时不会先求逆再乘误差被放大。这段代码最容易写错的是互电导的负号漏掉符号等于把两个节点的电流方向反了求解结果会出现负电压在电工学里通常意味着参考方向或者矩阵组装错误。2.3 Untitled2 到 Untitled8 与电工学知识点的映射关系没有原作者的注释每份文件对应的具体问题只能推测。但按电工学课程大纲从电路到信号、从直流到交流的顺序可以画一张阅读路线图文件名可能对应的电工学内容验证方法Untitled2.m简单分压电路或 KVL/KCL 验证节点电压代数和等于电源电压Untitled3.m戴维南等效或最大功率传输对比负载断开前后的开路电压Untitled4.mRLC 串联电路复数阻抗与谐振谐振频率处阻抗虚部接近 0Untitled5.m一阶 RC 电路暂态响应充电到 63.2% 的时间约等于 RCUntitled6.m正弦稳态相量法求各支路电流幅值与手算相量结果对比Untitled7.m傅里叶变换或频谱分析单频信号的频谱峰值在 f0 处Untitled8.m频率响应或波特图绘制截止频率处幅值下降 3dBuntitled.mdlSimulink 下的 RLC 或电机模型仿真波形与 3.2 节脚本重合这张表的用途不是考古而是给读者一个取舍顺序。拿到压缩包后不需要把八个文件全部读完按课程进度挑一两个验证即可。真正要掌握的是矩阵组装方法以及把电路参数换算成矩阵元素的通用套路。3. 从直流到交流稳态复数阻抗、数值积分与绘图验证3.1 相量法在 m 文件里的落点复数矩阵电工学课程从直流进入交流之后计算对象从实数电阻变成复数阻抗。MATLAB 处理复数不需要额外声明直接把数值写成1j参与运算就行。电感阻抗是1j*w*L电容阻抗是1/(1j*w*C)把这两个表达式替换直流电路里的电阻值节点电压法的求解流程完全不用改。这是 m 文件优于手算的地方电路拓扑不变变换到频域后矩阵的元素从实数变成复数反斜杠求解一次完成相量计算结果直接以复数形式返回。需要小心的是相量基准。220V 有效值写成220还是220*sqrt(2)整个矩阵里的所有电压、电流必须保持一致。习惯上统一使用有效值相量计算完成后如需看波形幅值再乘根号 2。混用峰值的典型症状是电压对、电流错因为电阻支路上峰值和有效值刚好差 根号2倍检查时不易发现。3.2 RLC 暂态过程的数值解法从解析解到 ode45Untitled5 这一类的脚本经常处理暂态过程尤其是 RLC 串联电路的零输入响应和零状态响应。教科书直接给二阶微分方程的解析解但参数一变就要重新算待定系数。更通用的做法是把二阶方程降阶成一阶微分方程组交给ode45求解。% rlc_transient_demo.m % 状态变量 y(1)电容电压 y(2)电感电流 % RLC 串联电路L*di/dt R*i v 0 R 10; % 电阻欧姆 L 0.1; % 电感亨利 C 1e-3; % 电容法拉 % 定义匿名函数形式的微分方程组 dydt (t, y) [ y(2)/C; (-y(1) - R*y(2))/L ]; % 初始条件电容初始电压5V电感初始电流0A y0 [5; 0]; % 求解 0 到 0.2 秒返回时间向量和状态值矩阵 [t, y] ode45(dydt, [0 0.2], y0); % 画电容电压和电感电流 plot(t, y(:,1), LineWidth, 1.5); grid on; xlabel(时间 (s)); ylabel(电容电压 (V));微分方程组的第一行是电容元件的电压-电流关系dv/dt i/C第二行来自基尔霍夫电压定律L*di/dt -v - R*i。ode45是 MATLAB 自带的变步长龙格库塔法求解器适合非刚性系统RLC 这类问题用它能得到足够精确的数值解。初始条件y0的物理含义是电容在开关动作时刻已经充到的电压以及电感的初始电流。跑完之后把数值解和解析解画在同一张图里比较如果暂态过程衰减到零的时间与τ L/R或RC量级不吻合不是微分方程写错就是初始条件给反了。3.3 把频域结果画成幅频特性曲线交流稳态的相量解是一堆复数直接看数字很难判断电路性质。常见做法是把角频率扫成数组对每个频率点重新组装矩阵求解最后把幅值和频率画成幅频曲线。这里有一个性能小技巧矩阵中只有部分元素随频率变化可以在循环外先组装与频率无关的电阻部分循环里只更新1j*w*L和1/(1j*w*C)再把两部分相加。用logspace生成对数频率轴能同时看清低频和高频段的整体特性。% freq_response_demo.m R 10; L 0.1; C 1e-3; f logspace(0, 4, 500); % 1Hz 到 10kHz对数均匀取 500 点 w 2*pi*f; Vout zeros(size(f)); for k 1:length(f) Z R 1j*w(k)*L 1/(1j*w(k)*C); Vout(k) abs(220 / Z * (1/(1j*w(k)*C))); end semilogx(f, Vout, LineWidth, 1.5); grid on; xlabel(频率 (Hz)); ylabel(输出电压幅值 (V));循环体内每次只改变阻抗表达式里与频率相关的两个复数项求解语句不变。logspace生成从 10 的 0 次方到 10 的 4 次方等比排列的频率点让曲线在谐振峰附近有足够分辨率。谐振频率附近幅值骤升而两侧快速下降这是 RLC 串联谐振的典型特征仿真结果里如果峰值频率与1/(2*pi*sqrt(L*C))的计算值不一致先查电容的单位是不是法拉这是初学者最容易弄错的地方。4. untitled.mdl 的 Simulink 仿真与 m 文件协同4.1 先还原模型里可能有什么模块.mdl是 Simulink 模型的文本格式文件直接用文本编辑器打开就能看到模块列表不需要等 MATLAB 加载。用文本方式查看模型的头部和模块注释能快速判断这个模型基于哪个工具箱搭建。电工学仿真里的 mdl 模型常见模块搭配有三种信号源加 Simscape 电气元件从 Simscape Electrical 工具箱拖入电阻、电感、电容和电源能搭建接近真实物理场景的电路但依赖工具箱本机缺少许可证会直接报错信号源加连续系统模块用传递函数、积分器、增益模块搭等效模型跨版本兼容性最好适合控制理论相关的演示信号源加 Interpreted MATLAB Function在模型里调用一个自定义函数适合把第 3 章写的 RLC 微分方程直接嵌入仿真load_system(untitled)能把模型加载进内存但不弹出窗口适合排查模型是否存在语法错误。加载成功后再调用open_system(untitled)打开图形界面这时候才能看到模块连线关系。没有开模块库就看不了连线第一步用load_system的返回值判断模型是否完整再决定是否打开窗口。4.2 用 set_param 和 sim 绕开 GUI 手动操作手动点击 Start 按钮只能得到一次仿真结果要批量扫描参数时效率太低。更常用的做法是在 m 文件里直接控制模型参数再调用sim命令% run_untitled_model.m model untitled; load_system(model); % 修改正弦波模块模块名必须与模型内实际名称完全一致 set_param([model /Sine Wave], Frequency, 50, Amplitude, 220); % 停止时间设置为0.1秒执行仿真 set_param(model, StopTime, 0.1); out sim(model, ReturnWorkspaceOutputs, on); % 读取仿真时间轴 t out.tout;set_param第一个参数是模块路径格式为模型名/模块名中间是斜杠模块名有空格时整个路径要加单引号。参数名和参数值成对出现比如正弦波信号源支持Frequency、Amplitude、Bias等参数具体名字可以在模型窗口双击模块看参数对话框。sim命令执行后返回的结构体out包含tout和所有输出通道的数据。如果模型里放了To Workspace模块输出字段名默认是该模块的变量名比如simout。4.3 仿真波形回传工作区后的二次分析和版本差异Simulink 返回的数据结构在不同 MATLAB 版本之间有过几次调整。这里给出兼容性较好的读取方式% 假设模型输出通道名是 simout try data out.simout.Data; % 大多数版本的结构 time out.simout.Time; catch data out.simout{1}.Values.Data; % 旧版本是 timeseries 对象 time out.simout{1}.Values.Time; end plot(time, data(:, 1), LineWidth, 1.5); grid on; xlabel(时间 (s)); ylabel(仿真输出);out.simout在某些版本里是结构体在另一些版本里是元胞数组。写try-catch比在代码里硬编码一种结构更稳妥。判断实际返回结构的最直接方式是命令窗口输入out回车看字段列表再决定用哪种方式。把仿真数据和 m 文件的理论曲线画在同一张图里如果曲线不重合优先检查模型里的元件参数是否与脚本一致其次检查单位最后再怀疑求解器的步长设置。默认求解器在VariableStepAuto下对大多数电工学模型够用但模型里含有强非线性开关电路时固定步长ode4往往更符合实际工况。5. 验证、重构与复用把作业变成自己的工具箱5.1 用功率守恒和时间常数验证每个脚本拿到资源包不要直接信运行结果。第一轮校验用两个成本最低的办法直流电路查功率守恒暂态电路查时间常数。功率校验的要点是把所有电阻的耗散功率求和与电源注入功率做对比代码很简单但能迅速暴露矩阵组装错误% verify_power.m P_R1 (V(1)^2) / R1; P_R3 (V(2)^2) / R3; P_total P_R1 P_R3; P_source Vs * (Vs - V(1)) / R1; if abs(P_total - P_source) / P_source 1e-6 disp(功率守恒通过); else disp(功率不平衡检查电导矩阵是否组装正确); end功率不守恒不一定就是矩阵错误也可能是电路里存在理想电感或电容以外的耗散元件被忽略。先检查变量是否用小写字母避免与 MATLAB 内置函数冲突再检查单位最后才怀疑求解过程。5.2 从 Untitled 到语义化命名的最小重构八个 Untitled 文件只用于交作业没问题想复用就要做一次轻量重构。建议把每个脚本的只读参数提取出来作为输入计算过程放进函数体输出指定为节点电压、支路电流或频率响应数组function [Vnode, Ibranch] solve_circuit(R_vec, Vs, f) % solve_circuit 解线性电阻或交流电路 % R_vec: 电阻数组Vs: 电源电压f: 频率(可选) % Vnode: 节点电压Ibranch: 支路电流函数文件里的变量默认不清除工作区调试时可以在函数内部设置断点也可以把函数体内容复制回脚本加断点运行。这种半小时内的重构能让下次课程设计直接调用函数而不是再翻八份 Untitled 找哪份能改。5.3 解压后第一个小时的固定动作解压MATLAB_m_file.rar之后先执行addpath把目录加入搜索路径再用which Untitled4.m确认路径生效。之后逐份运行脚本注意观察每个文件弹出的是图还是命令行输出同时盯住工作区里留下的变量。整个过程只做记录不修改全部跑通之后再开始重构。先把资源复现到能用再谈优化和整合这是处理任何 RAR 语言代码资源包的正确顺序也是把这个电工学包转化成个人工具箱的第一步。本文还有配套的精品资源点击获取