只有这一句,由于这个编辑器不支持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里面已经讲了,更加具体详细的可以到官方文档查阅

    ww2.mathworks.cn/help/matlab…

    参考结果:

    问题描述:

  • 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹有多高?
  • 编程求阶乘数列{n!}前20项的和;
  • 小球下落:

    height = 100;
    sum = 0;
    for i=1:10
        sum = sum + height;
        height = height / 2;
        sum = sum + height;
    

    下落时有一个距离,弹起来之后又有一段距离,两段距离都需要累加,符合顺序结构,循环里面先加了一次距离,后面又加了一次距离

  • height 表示的是当前高度
  • sum 表示的是总共经历的路程
  • 循环中的 i 用于表示当前是第几次下落
  • for 循环的语法: for 循环变量 = 起点(:步长(可选,不写的话默认为1)):终点
    for i=1:10
    

    具体用法参考上面黑色的这一段

    参考结果:

    result=0; 
    for i=1:20  
     sum=1; 
    	for j=1:i    
    		sum=sum*j; 
     result = result + sum; 
    disp(result);
    
  • result 用于存放累加之后的结果
  • sum 用于存放 i 的阶乘
  • 由于每次进行计算的结果相互独立,所以 sum 进行计算完之后的结果要变回 1 ,以参与下一次运算
  • disp() 这是用于显示某个变量的值,相当于输出语句
  • 在这里要感谢某个人,在寒假教她的时候,我发现了改进的方法,只需要一层循环就可以达到这个效果

    result=0; 
    sum = 1;
    for i=1:20
     sum = sum * i;   
     result = result + sum; 
    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);
    

    第三行用于在向量 A 的末尾添加元素,end 表示的是 A 中最后一个元素的位置,在没有使用分号表示要换行的前提下,在末尾添加的元素都是在行的末尾添加

    计算前n项和:

    sum = 0;
    for i = 20:20:100
        for j = 1:i
           sum = sum + A(j); 
        fprintf("前%d的和为%.2f\n",i,sum);
        sum = 0;
    
  • 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用于在输出结果的窗口制造一个空行,这里也将前面部分的结果一起输出了

    任务三这些代码段全部拼接在一起,就是最终的结果

    分类:
    后端
    标签: