BACK_TO_BASE
关于课堂中matlab运用的学习笔记(week1)持续更新.ing
Engineering Notebook // Build Log
/
15:58:23
/
NOTEBOOK_ENTRY

关于课堂中matlab运用的学习笔记(week1)持续更新.ing

第一周:MATLAB基础 1.1 定义和计算简单数字 基本算术运算 常用数学函数 1.2 数组操作 创建数组 特殊矩阵 数组索引 1.3 关系和逻辑运算符 关系运算符 逻辑运算符 1.4 基本绘图 二维绘图 其他绘图类型 第二周:MATLAB进阶 2.1 高级数组计算和操作 数组运算 数组操作 统计函数 2.2 脚本和函数 创建脚本文件 .m 创建函数 多输入多输出函数 2.3 循环和结构 For循环 While循环 条件语句 数组预分…

Notebook Time
1 min
Image Frames
1
View Tracks
65
class
FIELD_GUIDE

FIELD GUIDE

Use the guide rail to jump between sections.

第一周:MATLAB基础

1.1 定义和计算简单数字

基本算术运算

% 基本运算符
a = 5;
b = 3;

加法 = a + b;      % 8
减法 = a - b;      % 2
乘法 = a * b;      % 15
除法 = a / b;      % 1.6667
幂运算 = a ^ 2;    % 25
取余 = mod(a, b);  % 2

常用数学函数

% 三角函数
sin_val = sin(pi/2);    % 1
cos_val = cos(pi);      % -1
tan_val = tan(pi/4);    % 1

% 指数和对数
exp_val = exp(1);       % 2.7183 (e)
log_val = log(10);      % 2.3026 (自然对数)
log10_val = log10(100); % 2 (常用对数)

% 其他常用函数
sqrt_val = sqrt(16);    % 4
abs_val = abs(-5);      % 5
round_val = round(3.7); % 4

1.2 数组操作

创建数组

% 行向量
row_vector = [1, 2, 3, 4, 5];
% 或者
row_vector = [1 2 3 4 5];

% 列向量
col_vector = [1; 2; 3; 4; 5];

% 使用冒号运算符
range1 = 1:10;           % [1, 2, 3, ..., 10]
range2 = 0:0.5:5;        % [0, 0.5, 1, 1.5, ..., 5]

% 使用linspace函数
lin_array = linspace(0, 10, 5);  % 从0到10生成5个等间距的点

% 创建矩阵
matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9];

特殊矩阵

% 零矩阵
zeros_matrix = zeros(3, 4);     % 3x4的零矩阵

% 单位矩阵
ones_matrix = ones(2, 3);       % 2x3的全1矩阵

% 单位矩阵
identity = eye(3);              % 3x3单位矩阵

% 随机矩阵
rand_matrix = rand(2, 3);       % 2x3的随机矩阵(0-1之间)
randn_matrix = randn(2, 3);     % 2x3的正态分布随机矩阵

数组索引

A = [1, 2, 3; 4, 5, 6; 7, 8, 9];

% 访问单个元素
element = A(2, 3);      % 6 (第2行,第3列)

% 访问整行或整列
row2 = A(2, :);         % [4, 5, 6]
col3 = A(:, 3);         % [3; 6; 9]

% 访问子矩阵
sub_matrix = A(1:2, 2:3);  % [2, 3; 5, 6]

1.3 关系和逻辑运算符

关系运算符

a = 5;
b = 3;

a > b     % true (1)
a < b     % false (0)
a >= 5    % true (1)
a <= 3    % false (0)
a == 5    % true (1)
a ~= b    % true (1) - 不等于

逻辑运算符

% 与 (AND)
result1 = (5 > 3) & (2 < 4);    % true

% 或 (OR)
result2 = (5 < 3) | (2 < 4);    % true

% 非 (NOT)
result3 = ~(5 > 3);              % false

% 数组上的逻辑运算
A = [1, 2, 3, 4, 5];
B = A > 3;                       % [0, 0, 0, 1, 1]

1.4 基本绘图

二维绘图

% 基本线图
x = 0:0.1:10;
y = sin(x);
plot(x, y);
title('正弦函数');
xlabel('x轴');
ylabel('y轴');
grid on;

% 多条曲线
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
figure;
plot(x, y1, 'r-', x, y2, 'b--');
legend('sin(x)', 'cos(x)');

其他绘图类型

% 散点图
x = rand(1, 50);
y = rand(1, 50);
scatter(x, y);
title('散点图');

% 柱状图
data = [23, 45, 12, 67, 34];
bar(data);
title('柱状图');

% 直方图
data = randn(1000, 1);
histogram(data, 30);
title('直方图');

第二周:MATLAB进阶

2.1 高级数组计算和操作

数组运算

% 逐元素运算
A = [1, 2, 3];
B = [4, 5, 6];

% 逐元素乘法
C = A .* B;      % [4, 10, 18]

% 逐元素除法
D = A ./ B;      % [0.25, 0.4, 0.5]

% 逐元素幂运算
E = A .^ 2;      % [1, 4, 9]

% 矩阵乘法
M1 = [1, 2; 3, 4];
M2 = [5, 6; 7, 8];
M3 = M1 * M2;    % 矩阵乘法

数组操作

% 数组拼接
A = [1, 2, 3];
B = [4, 5, 6];
C = [A, B];          % 横向拼接: [1, 2, 3, 4, 5, 6]
D = [A; B];          % 纵向拼接: [1, 2, 3; 4, 5, 6]

% 数组重塑
E = reshape(1:12, 3, 4);  % 将1-12排列成3x4矩阵

% 数组转置
F = E';

% 查找元素
G = [1, 5, 3, 9, 2, 7];
indices = find(G > 4);    % [2, 4, 6]

统计函数

data = [1, 5, 3, 9, 2, 7];

mean_val = mean(data);    % 平均值
median_val = median(data); % 中位数
std_val = std(data);      % 标准差
max_val = max(data);      % 最大值
min_val = min(data);      % 最小值
sum_val = sum(data);      % 求和

2.2 脚本和函数

创建脚本文件 (.m)

% 文件名: my_script.m
% 这是一个简单的脚本示例

clc;              % 清除命令窗口
clear;            % 清除工作区变量
close all;        % 关闭所有图形窗口

x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
title('正弦波');
grid on;

创建函数

% 文件名: calculate_area.m
function area = calculate_area(radius)
    % 计算圆的面积
    % 输入: radius - 圆的半径
    % 输出: area - 圆的面积
    
    area = pi * radius^2;
end

% 调用函数
r = 5;
A = calculate_area(r);

多输入多输出函数

% 文件名: circle_properties.m
function [area, circumference] = circle_properties(radius)
    % 计算圆的面积和周长
    % 输入: radius - 圆的半径
    % 输出: area - 面积, circumference - 周长
    
    area = pi * radius^2;
    circumference = 2 * pi * radius;
end

% 调用
[A, C] = circle_properties(5);

2.3 循环和结构

For循环

% 基本for循环
for i = 1:10
    disp(i);
end

% 遍历数组
array = [2, 4, 6, 8, 10];
for element = array
    disp(element);
end

% 嵌套循环
for i = 1:3
    for j = 1:3
        fprintf('i=%d, j=%d\n', i, j);
    end
end

While循环

% 基本while循环
counter = 1;
while counter <= 10
    disp(counter);
    counter = counter + 1;
end

% 使用break跳出循环
n = 1;
while true
    if n > 5
        break;
    end
    disp(n);
    n = n + 1;
end

条件语句

% if-else语句
score = 85;

if score >= 90
    grade = 'A';
elseif score >= 80
    grade = 'B';
elseif score >= 70
    grade = 'C';
else
    grade = 'F';
end

% switch语句
day = 3;
switch day
    case 1
        day_name = '星期一';
    case 2
        day_name = '星期二';
    case 3
        day_name = '星期三';
    otherwise
        day_name = '未知';
end

数组预分配

% 不推荐(效率低)
tic;
for i = 1:10000
    slow_array(i) = i^2;
end
time_slow = toc;

% 推荐(预分配,效率高)
tic;
fast_array = zeros(1, 10000);
for i = 1:10000
    fast_array(i) = i^2;
end
time_fast = toc;

fprintf('未预分配时间: %.4f秒\n', time_slow);
fprintf('预分配时间: %.4f秒\n', time_fast);

2.4 高级绘图

子图

x = 0:0.1:2*pi;

figure;
% 2x2的子图布局
subplot(2, 2, 1);
plot(x, sin(x));
title('sin(x)');

subplot(2, 2, 2);
plot(x, cos(x));
title('cos(x)');

subplot(2, 2, 3);
plot(x, tan(x));
title('tan(x)');

subplot(2, 2, 4);
plot(x, exp(x));
title('exp(x)');

图形定制

x = 0:0.1:2*pi;
y = sin(x);

figure;
plot(x, y, 'LineWidth', 2, 'Color', [0.8, 0.2, 0.2]);
hold on;
plot(x, cos(x), '--', 'LineWidth', 2, 'Color', 'b');
hold off;

title('三角函数', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('x', 'FontSize', 12);
ylabel('y', 'FontSize', 12);
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;
xlim([0, 2*pi]);
ylim([-1.5, 1.5]);

3D绘图

% 3D线图
t = 0:0.1:10*pi;
x = sin(t);
y = cos(t);
z = t;
plot3(x, y, z);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3D螺旋线');
grid on;

% 3D表面图
[X, Y] = meshgrid(-5:0.5:5, -5:0.5:5);
Z = sin(sqrt(X.^2 + Y.^2));
figure;
surf(X, Y, Z);
colorbar;
title('3D表面图');
xlabel('X');
ylabel('Y');
zlabel('Z');

3.1 文件输入/输出 (I/O)

读取文本文件

% 读取整个文件
filename = 'data.txt';
fileID = fopen(filename, 'r');
data = fscanf(fileID, '%f');
fclose(fileID);

% 逐行读取
fileID = fopen(filename, 'r');
line_count = 1;
while ~feof(fileID)
    line = fgetl(fileID);
    fprintf('第%d行: %s\n', line_count, line);
    line_count = line_count + 1;
end
fclose(fileID);

写入文本文件

% 写入数据到文件
filename = 'output.txt';
fileID = fopen(filename, 'w');
fprintf(fileID, '标题: 实验数据\n');
fprintf(fileID, '时间\t温度\n');
for i = 1:10
    fprintf(fileID, '%d\t%.2f\n', i, 20 + rand()*10);
end
fclose(fileID);

读写CSV文件

% 写入CSV
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
csvwrite('data.csv', data);

% 读取CSV
data_read = csvread('data.csv');

% 使用表格(Table)处理CSV
T = table([1; 2; 3], [10; 20; 30], [100; 200; 300], ...
    'VariableNames', {'ID', '温度', '压力'});
writetable(T, 'table_data.csv');

% 读取表格
T_read = readtable('table_data.csv');

读写Excel文件

% 写入Excel
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
xlswrite('data.xlsx', data, 'Sheet1', 'A1');

% 读取Excel
data_read = xlsread('data.xlsx', 'Sheet1', 'A1:C3');

% 使用表格
writetable(T, 'table_data.xlsx', 'Sheet', 'Sheet1');
T_read = readtable('table_data.xlsx', 'Sheet', 'Sheet1');

保存和加载MAT文件

% 保存变量
x = 1:10;
y = sin(x);
save('mydata.mat', 'x', 'y');

% 加载变量
clear;
load('mydata.mat');

% 保存所有变量
save('workspace.mat');

3.2 常用数学技术

数值积分

% 使用trapz进行梯形积分
x = 0:0.01:pi;
y = sin(x);
area = trapz(x, y);

% 使用integral进行自适应积分
f = @(x) sin(x);
area2 = integral(f, 0, pi);

数值微分

% 使用diff计算差分
x = 0:0.1:2*pi;
y = sin(x);
dy = diff(y) ./ diff(x);  % 近似导数

% 使用gradient计算梯度
dy2 = gradient(y, x);

求解方程

% 求解线性方程组 Ax = b
A = [3, 2, -1; 2, -2, 4; -1, 0.5, -1];
b = [1; -2; 0];
x = A \ b;  % 或者 x = linsolve(A, b);

% 求解非线性方程
f = @(x) x^3 - 2*x - 5;
x0 = 2;  % 初始猜测
solution = fzero(f, x0);

曲线拟合

% 多项式拟合
x = 0:0.1:10;
y = 2*x + 3 + randn(size(x));  % 带噪声的线性数据

% 一次多项式拟合
p = polyfit(x, y, 1);
y_fit = polyval(p, x);

figure;
plot(x, y, 'o', x, y_fit, '-');
legend('原始数据', '拟合曲线');

% 使用fit工具箱
ft = fittype('a*x + b');
[fitted_curve, gof] = fit(x', y', ft);

插值

% 原始数据
x = 0:10;
y = sin(x);

% 插值
x_new = 0:0.1:10;
y_interp = interp1(x, y, x_new, 'spline');

figure;
plot(x, y, 'o', x_new, y_interp, '-');
legend('原始数据', '插值曲线');

3.3 Simulink基础

Simulink简介

Simulink是MATLAB的图形化编程环境,用于建模、仿真和分析动态系统。

% 打开Simulink
simulink

% 创建新模型
new_system('my_model');
open_system('my_model');

% 通过命令添加模块(示例)
add_block('simulink/Sources/Sine Wave', 'my_model/Sine');
add_block('simulink/Sinks/Scope', 'my_model/Scope');
add_line('my_model', 'Sine/1', 'Scope/1');

% 运行仿真
sim('my_model');

常用Simulink模块

  • Sources(信号源):Sine Wave, Step, Constant, From Workspace
  • Sinks(接收器):Scope, To Workspace, Display
  • Math Operations(数学运算):Sum, Gain, Product, Abs
  • Continuous(连续系统):Integrator, Derivative, Transfer Fcn
  • Discrete(离散系统):Discrete-Time Integrator, Unit Delay

Simulink最佳实践

  1. 使用有意义的模块名称
  2. 添加注释说明模型功能
  3. 使用子系统组织复杂模型
  4. 设置适当的仿真时间和求解器
  5. 保存信号到工作区进行后续分析

3.4 App Designer

App Designer简介

App Designer是MATLAB中用于创建专业交互式应用程序的开发环境。

创建简单应用

% 打开App Designer
appdesigner

% 或通过命令创建新应用
% 直接在App Designer界面中设计

App Designer组件

  • 输入组件:Button, Edit Field, Slider, Knob
  • 显示组件:Label, Text Area, Gauge, Lamp
  • 绘图组件:UIAxes(用于绘图)
  • 容器:Panel, Tab Group, Grid Layout

简单应用示例代码结构

classdef SimpleApp < matlab.apps.AppBase
    properties (Access = public)
        UIFigure  matlab.ui.Figure
        UIAxes    matlab.ui.control.UIAxes
        Button    matlab.ui.control.Button
        EditField matlab.ui.control.NumericEditField
    end
    
    methods (Access = private)
        % 按钮回调函数
        function ButtonPushed(app, event)
            x = 0:0.1:2*pi;
            y = sin(app.EditField.Value * x);
            plot(app.UIAxes, x, y);
        end
    end
    
    methods (Access = public)
        function app = SimpleApp
            % 创建和配置组件
            createComponents(app);
            registerApp(app, app.UIFigure);
        end
    end
end

第四周:Arduino与MATLAB集成

4.1 Arduino基础

Arduino简介

Arduino是一个开源电子平台,基于易用的硬件和软件。它可以读取传感器输入并控制执行器输出。

Arduino基本组件

  • 数字输入/输出引脚
  • 模拟输入引脚
  • PWM输出引脚
  • 电源引脚(5V, 3.3V, GND)

LED控制基础

// Arduino代码示例(在Arduino IDE中)
void setup() {
  pinMode(13, OUTPUT);  // 设置引脚13为输出
}

void loop() {
  digitalWrite(13, HIGH);  // LED亮
  delay(1000);             // 延时1秒
  digitalWrite(13, LOW);   // LED灭
  delay(1000);             // 延时1秒
}

4.2 使用MATLAB控制Arduino

安装MATLAB支持包

% 检查是否安装了Arduino支持包
% 在MATLAB主菜单: 主页 -> 添加功能 -> 搜索"Arduino"
% 安装 "MATLAB Support Package for Arduino Hardware"

连接Arduino

% 创建Arduino对象
a = arduino();  % 自动检测端口

% 或指定端口和板型
a = arduino('COM3', 'Uno');  % Windows
% a = arduino('/dev/ttyUSB0', 'Uno');  % Linux

% 查看可用引脚
a.AvailablePins

数字I/O操作

% LED闪烁示例
a = arduino();

% 设置引脚13为输出
for i = 1:10
    writeDigitalPin(a, 'D13', 1);  % 点亮LED
    pause(0.5);
    writeDigitalPin(a, 'D13', 0);  % 熄灭LED
    pause(0.5);
end

% 读取数字输入
button_state = readDigitalPin(a, 'D2');

模拟I/O操作

% 读取模拟输入(0-1范围)
a = arduino();
voltage = readVoltage(a, 'A0');

% 连续读取并绘图
figure;
for i = 1:100
    voltage = readVoltage(a, 'A0');
    fprintf('电压: %.2f V\n', voltage);
    plot(i, voltage, 'ro');
    hold on;
    pause(0.1);
end

% PWM输出(模拟输出)
writePWMDutyCycle(a, 'D9', 0.5);  % 50%占空比

伺服电机控制

% 控制伺服电机
a = arduino();
s = servo(a, 'D9');

% 设置角度
writePosition(s, 0);      % 0度
pause(1);
writePosition(s, 0.5);    % 90度
pause(1);
writePosition(s, 1);      % 180度

% 清除伺服对象
clear s;

4.3 Arduino传感器数据采集

温度传感器读取示例

a = arduino();

% 读取模拟温度传感器(如LM35)
% LM35输出:10mV/°C
voltage = readVoltage(a, 'A0');
temperature = voltage * 100;  % 转换为摄氏度
fprintf('温度: %.2f °C\n', temperature);

实时数据记录

a = arduino();

% 创建数据数组
num_samples = 100;
time_data = zeros(1, num_samples);
sensor_data = zeros(1, num_samples);

% 实时采集和绘图
figure;
h = animatedline;
ax = gca;
ax.YLim = [0 5];
xlabel('样本');
ylabel('电压 (V)');
title('实时传感器数据');

tic;
for i = 1:num_samples
    voltage = readVoltage(a, 'A0');
    time_data(i) = toc;
    sensor_data(i) = voltage;
    addpoints(h, i, voltage);
    drawnow;
    pause(0.05);
end

% 保存数据
save('sensor_data.mat', 'time_data', 'sensor_data');

4.4 LED焊接技巧

焊接安全

  • 确保工作区域通风良好
  • 使用防护眼镜
  • 小心烙铁温度(通常300-350°C)
  • 不要触摸烙铁尖端
  • 使用烙铁架

焊接步骤

  1. 准备工作

    • 清洁烙铁头
    • 准备焊锡丝
    • 固定元件
  2. 焊接过程

    • 加热焊盘和元件引脚(2-3秒)
    • 添加焊锡丝
    • 移开焊锡丝,然后移开烙铁
    • 冷却(不要吹气或移动)
  3. 检查焊点

    • 良好焊点:光滑、有光泽、锥形
    • 不良焊点:暗淡、多孔、球形

LED焊接注意事项

% LED特性
% - 极性:长脚为正极(阳极),短脚为负极(阴极)

% 电阻计算


附录

常用MATLAB快捷键

  • Ctrl + C: 中断运行
  • Ctrl + R: 注释选中行
  • Ctrl + T: 取消注释
  • F9: 运行选中代码
  • F5: 运行整个脚本
  • clc: 清除命令窗口
  • clear: 清除工作区
  • close all: 关闭所有图形窗口

调试技巧

% 设置断点:在代码行前点击或使用dbstop
dbstop in myfunction at 10

% 调试命令
% dbstep - 单步执行
% dbcont - 继续执行
% dbquit - 退出调试
% dbstack - 显示调用栈

% 显示变量
whos  % 显示所有变量详细信息

% 代码性能分析
tic;
% 你的代码
elapsed_time = toc;

% 使用profiler
profile on
% 你的代码
profile viewer

常见错误处理

% try-catch语句
try
    result = 10 / 0;
catch ME
    fprintf('错误: %s\n', ME.message);
end

% 输入验证
function result = safe_divide(a, b)
    if b == 0
        error('除数不能为零');
    end
    result = a / b;
end