暑期实训
训练目的
- 熟悉Matlab工具软件的开发环境
- 掌握Matlab的一些常用命令
- 掌握Matlab/Simulink建模仿真的方法
训练内容
- 利用命令进行各种相关数学计算
- 编写M文件实现各种相关数学计算
- 利用Simulink建模并仿真
训练任务
- 解方程
就是解个矩阵方程:Ax=B,求x;题目不写了,贴代码吧。
% 矩阵间计算
A = [-3 5 0 8; 1 -8 2 -1; 0 -5 9 3; -7 0 -4 5]
B = [1; 5; -3; 8];
% Ax=B,求x,相当于 x=inv(A)*B 则x=A\B
X = A\B;
disp(X);
唯一值得注意的是matlab的矩阵间的操作真的花样繁多,有普通的乘*
和除/
还有点乘.*
点除./
,对数值运算来说这些符号没有区别,但在矩阵中*
是普通的矩阵的乘法,而.*
是两个矩阵里每一个对应元素相乘,它就要求前后矩阵的行和列数相同;除此之外还分了左除\
右除/
,对除法而言这条杠压在谁身上谁就是“分母”。
- 数值运算
第二题是个数值运算,给入一堆小孩的不同科目的成绩,找出每一科和总分哪个小孩考的最好,最高分是多少。贴代码吧。
% s= [高数 外语 电路]
math = [ 78 89 64 73 78 85]
eng = [ 83 77 83 78 70 79]
elec = [ 85 91 78 82 68 81];
Max = [-1 -1 -1 -1]
flag = [0 0 0 0]
summ = []; % 空矩阵
for i = 1:6
summ(i) = math(i)+eng(i)+elec(i);
if math(i)>Max(1)
Max(1) = math(i);
flag(1) = i;
end;
if eng(i)>Max(2)
Max(2) = eng(i);
flag(2) = i;
end;
if elec(i)>Max(3)
Max(3) = elec(i);
flag(3) = i;
end;
if summ(i)>Max(4)
Max(4) = summ(i);
flag(4) = i;
end;
end;
% 将结果转换为字符串输出
disp(['高数:max number =', num2str(flag(1)), ',max score = ', num2str(Max(1))]);
disp(['英语:max number =', num2str(flag(2)), ',max score = ', num2str(Max(2))]);
disp(['电路:max number =', num2str(flag(3)), ',max score = ', num2str(Max(3))]);
disp(['总分:max number =', num2str(flag(4)), ',max score = ', num2str(Max(4))]);
这题唯一的难度是如何定义数组以及如何访问矩阵/数组的元素。我这里定义总分矩阵是定义了个空矩阵,运算时再对它赋值summ = []
。
访问数组元素可以以A[x]
的形式或A[i,j]
的形式等。
a(i,j) % 第i行第j列队元素
a(n1:n2) % 表示数组中的第n1到n2个元素
a(:,j) % 第j列的所有元素
a(2:end,j) % 第j列中第2行到最后一行的元素
a(:,3:5) % 第3〜5列的所有元素
a(x) % 第x个元素(x为从最左边第1列开始编号)
由于我将每一科分数拆成了单行矩阵,就直接用A[x]
访问,x
表示学生的代号。
- 定积分的计算
直接贴代码。
% 计算定积分
syms x f;% 定义变量
f = sin(x);
y = int(f,x,0,pi/2);
disp(y)
积分的计算有公式的:
R = int(S,v,a,b) % S是表达式,v是组成S的自变量,a,b表示被积区间
注意v作为变量要提前定义,否则编译时会报错。
- 画图
贴代码吧。
% 画二维曲线图
x = linspace(-4*pi, 4*pi, 404)
y = sin(x).*cos(5*x); % 不用点乘会报错
plot(x,y,'b')
ylabel('函数值')
xlabel('x')
注意画图时的x是要给定范围的,并且调用linspace(a,b,n)
函数在a~b之间描n个点。
另外在对y赋值时不用点乘会报错:
错误使用 *
内部矩阵维度必须一致。
- Simulink建模仿真
先画成这样,不知道对不对。
总结
心情好的时候写。