任务一:
问题描述:
- 分别使用Matlab的ezplot和isosurface函数绘制附件所示函数图形;
ezplot心形函数:
只有这一句,由于这个编辑器不支持MATLAB语法,自身又有语法规则,只能使用别的方法粘贴过来
ezplot('x^2 + (y - (x^2)^(1/3))^2 - 1',[-5,5])
中间用单引号引起来的就是函数的解析式,后面中括号里面表示的是 x 的范围(可写可不写,如果不写的话,默认范围是-2π到2π)
常见错误: x 平方之后再开三次方的那个部分,如果直接直接写成x的二分之三次方的话,会发现画出来的图形只有半边,因为这么写的话,x的取值会无法取到负数,如果是先进行 x 的平方再进行开三次方(开n次方根,可以表示为 n 分之一次方)的话那就没有这个顾虑了,因为实数范围内的平方是绝对成立的
参考结果:
若将表达式右边的 -1 更换为其他的数,例如 -5 ,可以得到不同形态的心形
isosurface心形曲面函数
[x,y,z] = meshgrid(-10:0.1:10);
V = (x.^2 + 9/4 .* y.^2 + z.^2 - 1).^3 - x.^2 .* z.^3 - 9/80 .* y.^2 .* z.^3;
isosurface(x,y,z,V,0);
- 要绘制这个图形,首先得准备数据,使用meshgrid生成数据,也就是第一句
- 第一句的意思是对于 x y z ,在 -10 到 10 这个区间,生成一个三维的数据,每个数据大小的间隔为 0.01
- 然后就是利用刚刚生成的数据进行函数解析式的计算,也就是第二句
- 由于数据是一个三维的矩阵,只要涉及到矩阵乘法,就得考虑是叉乘还是点乘(叉乘和点乘的区别在上一篇的MATLAB的文章中讲解过),幂次方也是乘法的一种,所以也有点幂和叉幂的区别,同于矩阵乘法
- 在这里的要求显然是所有的数据进行计算之后都位于原来的位置(把这个三维矩阵想象成一个三维的坐标系,每个数据都是其中的一个点,他们都有一个唯一的坐标),所以,进行计算的时候需要使用到点乘
- 最后,就是使用 isosurface 这个工具把数据可视化了,其中使用的 x y z 必须是前面生成数据的时候使用的三个变量,这样的话才能使用到有效的数据进行图像绘制
isosurface 的语法规则在PPT里面已经讲了,更加具体详细的可以到官方文档查阅
https://ww2.mathworks.cn/help/matlab/ref/isosurface.html#mw_79c88feb-20af-42e7-9937-655b16f4e983
参考结果:
任务二:
问题描述:
- 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹有多高?
- 编程求阶乘数列{n!}前20项的和;
小球下落:
height = 100;
sum = 0;
for i=1:10
sum = sum + height;
height = height / 2;
sum = sum + height;
end
下落时有一个距离,弹起来之后又有一段距离,两段距离都需要累加,符合顺序结构,循环里面先加了一次距离,后面又加了一次距离
- height 表示的是当前高度
- sum 表示的是总共经历的路程
- 循环中的 i 用于表示当前是第几次下落
重点:
for 循环的语法:
for 循环变量 = 起点(:步长(可选,不写的话默认为1)):终点
循环体
end
for i=1:10
%循环体
end
具体用法参考上面黑色的这一段
参考结果:
求阶乘:
result=0;
for i=1:20
sum=1;
for j=1:i
sum=sum*j;
end
result = result + sum;
end
disp(result);
- result 用于存放累加之后的结果
- sum 用于存放 i 的阶乘
- 由于每次进行计算的结果相互独立,所以 sum 进行计算完之后的结果要变回 1 ,以参与下一次运算
- disp() 这是用于显示某个变量的值,相当于输出语句
在这里要感谢某个人,在寒假教她的时候,我发现了改进的方法,只需要一层循环就可以达到这个效果
result=0;
sum = 1;
for i=1:20
sum = sum * i;
result = result + sum;
end
disp(result);
为什么只需要一层循环?
n 的阶乘为 (n - 1)的阶乘乘以 n , 所以,每次进行计算的时候利用上一次循环计算出的结果即可
任务三:
问题描述:
- 用for循环生成一个长度为100的行向量A,其通项是log(n),其中n为数列下标;
- 分别计算A向量前20、40、60、80及前100项的和;
- 取A的前20项,重新赋给A,之后在A的下方新增一个元素全部都是1行向量,形成矩阵B,并计算矩阵的转置C;
- 分别计算A * C、C * B和B * C的结果;
生成行向量A:
A = [];
for i = 1:100
A(end + 1) = log(i);
end
第三行用于在向量 A 的末尾添加元素,end 表示的是 A 中最后一个元素的位置,在没有使用分号表示要换行的前提下,在末尾添加的元素都是在行的末尾添加
计算前n项和:
sum = 0;
for i = 20:20:100
for j = 1:i
sum = sum + A(j);
end
fprintf("前%d的和为%.2f\n",i,sum);
sum = 0;
end
- MATLAB中,使用下标访问矩阵中的某个元素是使用小括号,而不是像 C 语言和Python那样使用中括号
- fprintf 的用法和作用与 C 语言一致,参考 C 语言的用法即可
- 计算前n项和的方法参考上面计算阶乘和的思路
取A的前20项,新增一向量,矩阵的转置:
取A的前20项:
A(21:100) = [];
我使用的是把后面那么多项全部去掉,若是选择将前20项赋给一个新的变量,也可以
新增一向量:
使用 ones 函数
B = [A;ones(1,20)];
ones() 函数括号内的参数表示行和列,例如:ones (3,5) 表示的是生成一个元素值全是 1 的 3 * 5 的矩阵
矩阵的转置:
C = B';
在矩阵的名字后面加个单引号,就是表示对该矩阵进行转置
例如 3 * 5 的矩阵转置之后会变成 5 * 3 的矩阵,即 行数变成列数,列数变成行数
具体是怎么实现的呢?其实是个很简单的操作,C 语言课上也讲过
a [ i ] [ j ] 和 a [ j ] [ i ] 进行交换即可
计算矩阵叉乘和点乘的结果:
计算条件和计算方法参考我上一篇MATLAB的博客,最终的结果记得输出
disp(A);
newline;
disp(B);
newline;
disp(C);
newline;
disp(A*C);
newline;
disp(C*B);
newline;
disp(B*C);
newline;
newline用于在输出结果的窗口制造一个空行,这里也将前面部分的结果一起输出了文章来源:https://www.toymoban.com/news/detail-407901.html
任务三这些代码段全部拼接在一起,就是最终的结果文章来源地址https://www.toymoban.com/news/detail-407901.html
到了这里,关于2022.3.11 MATLAB课程作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!