MATLAB绘制高等数学附录“地狱渐进难度”函数曲线

00.前言

       前几天有一个小伙伴问我怎么用MATLAB绘制一些函数的图像,我看了下,这不就是万恶的高等数学附录后面的图像内容吗?看到题目要求绘制的前六个图像,我的思绪又飘到了几年前被高等数学支配的恐惧中。但是,这几个函数的确是锻炼MATLAB编码的好例子,因此特地写下这篇帖子,算是对那个u的反馈,对他信任我的MATLAB技术表示感谢。先贴上此次任务的几个函数美貌让大家欣赏一下,见图1

图1:本次的目标函数群

01.绘制三次抛物线\large {\color{Blue} y = a{x}^{3}}的图像

       分析:首先,我们需要注意,这是一个单调函数,而且在整个定义域内单调,这无疑是很简单的。其次,我们需要考虑自变量 \large x 的取值范围。不难分析出来 \small x \mathrm {\in } \left ( -\infty ,+\infty \right )\mathbf{} ,但是,必须注意,在计算机中很难将整个R域表达出来。因此,我们只截取部分对称区间绘图。在本题目中,取\small x \in \left [ -10,10 \right ], 绘图的平滑度取决于自变量取值的步长大小。因变量 \large y 随自变量 \large x 的变化而变化,这个不再赘述。另外,请注意,这个函数中还有一个参数 \large a ,虽然书中的图像并没有对其取值进行讨论,而且书中的 \large a 显然为正值。但为了方便大家了解,本着严谨的态度,我们对其取值也进行讨论。事实上,参数满足:\small a \in R ,但同样地,我们对其进行类似于自变量的简化处理,只考虑在某些特定条件下的取值。

      解:对于自变量 \large x ,我们给步长 \small \Delta x = 0.5,现对参数的取值进行讨论。

①当 \small a \in \left ( -1,-\infty \right ) 时,我们只取 \small a \in \left [ -1.5,-2,-2.5,-5,-10 \right ] ,代码如下:

a = [-1.5 -2 -2.5 -5 -10];% 定义参数a的取值数组
x = -10:.5:10;% 定义自变量的取值范围,步长为0.5
for i =1:length(a)
    y = a(i) * x.^3; %定义函数关系式
    plot(x,y,'LineWidth',3)%绘制函数图像,定义线条宽度为3
    str{i} = ['a=',num2str(a(i))];%定义字符串数组str,用来存放随后需要用到的legend内容
    hold on;
end
legend(str)
title('当a < -1 时曲线的变化情况')
hold off

        代码执行结果如图2所示:

 图2:a<-1时的取值对函数的影响

        分析图2,可以发现:\large a 的值越负,函数的开口越小,或者说函数越来越“陡峭”,但是函数的变化趋势没有发生变化。细心的小伙伴可能已经注意到了,这与书中要求的函数图像不一致,这是不是你的代码有问题?别着急,我们接着往下分析。

②当\small a \in \left ( -1,0 \right ) 时,取 \small a \in \left [ -0.8,-0.5,-0.3,-0.1 \right ] ,代码如下:

a = [-0.8 -0.5 -0.3 -0.1];
x = -10:.5:10;
for j = 1:length(a)
    y1 = a(j) * x.^3;
    plot(x,y1,'LineWidth',3)
    str_1{j} = ['a=',num2str(a(j))];
    hold on;
end
legend(str_1)
title('当 -1 < a <0时曲线的变化情况')
hold off

       代码运行结果如图3所示:

 图3:当 -1<a<0时对函数的影响

        我们发现,此时的规律与①一致,两者其实可以合并,接下来讨论 \large a 取值为正的情况。

③当 \small a \in \left ( 0,1 \right ) 时,取 \small a \in \left [ 0.1,0.3,0.5,0.8 \right ] 进行讨论,话不多说,直接上代码:

a = [0.1 0.3 0.5 0.8];
x = -10:.5:10;
for j = 1:length(a)
    y2 = a(j) * x.^3;
    plot(x,y2,'LineWidth',3)
    str_2{j} = ['a=',num2str(a(j))];
    hold on;
end
legend(str_2)
title('当0 < a < 1时曲线的变化情况')
hold off

        代码运行结果如图4所示:

 图4:当 0<a<1 时对函数的影响

      此时,函数的整体变化趋势与之前相反,而且参数的值越大,函数的开口越小。同样地,当\small a \in \left ( 1,+\infty \right ) 时,情况也是一样的,这里就不放了,感兴趣的小伙伴可以自己私下尝试。

      综上,如果想要实现题目要求的效果,只需要取参数为正就可以了数值取多少什么的どうでもいい。

02.绘制半立方抛物线\small y^{2} = ax^{3}, x\in \left ( 0,+\infty \right )的图像

        分析:这个题目的自变量 \small x 取值范围已知,而且参数 \small a 的取值范围我们也可以直接给出:\small a \in \left ( 0,+\infty \right ) ,结合第一个函数分析过程,大家是不是觉得这样做很繁琐呢?其实这只是从逻辑的角度分析可能的状况,现在我们偷个懒,只考虑参数取整数的情况。另外,如果从传统的逻辑角度分析这个函数,你将会发现一个问题,那就是:如果这是一个函数,那么必须满足:自变量取某一个值的时候,因变量都有唯一一个值与之一一对应。但是,这个“函数“明显违背了这一个基本条件,怎么办呢?有两种解决思路:The first one,把这个关系式看成分段函数,然后分别对两半值域区间绘图即可。The second one,将 \small y 看成自变量,将 \small x 看成因变量,这样,将满足函数定义。现讨论第一种情况:

        The first one:很明显,以 0 为断点划分值域,那么两部分都是单调的,绘图将简便很多

①当 \small y \in \left ( -\infty ,0 \right ) 时,我们对关系式进行等价转换,可以得到 \small y = -\sqrt{ax^{3}},然后,上代码:

a = 1;% 为了简便起见,取参数a的值为1
x = 0:.5:10;%只定义自变量为正数

%这里相当于将因变量拆分成两个函数,然后在绘图时拼接即可。
y1 = -sqrt(a * x.^3);
y2 = sqrt(a * x.^3);

%绘图并且拼接
plot(x,y1,x,y2,'LineWidth',3)
hold on;
str_2 = ['a=',num2str(a)];
legend(str_2)
title('半立方抛物线y^2 = a*x^3图像')
hold off

        代码运行结果如图5(a)所示:

 图5(a):半立方抛物线绘图结果

        第一种情况讨论完毕,我们来看看第二种情况。

       The second one,将表达式变形,得到 \small x = \sqrt[\frac{1}{3}]{ay^{2}} ,此时,我们不难发现,自变量的取值范围为: \small y \in R ,另外的取值无任何变化。话不多说,上代码:

a = 1;
y = -10:.5:10;
for i = 1:length(a) %这里都没必要做for循环
    x = (a*y.^2).^(1/3);
    plot(y,x)
    str = ['a = ',num2str(a)];
    hold on;
end
legend(str)
title('y^2 = x^3的图像')
hold off

        代码运行结果如图5(b)所示:

 图5(b):半立方抛物线的运行结果

       不过这里有一个问题啊,跟第一种情况不一样,这里留一个小作业吧,怎么把这张图给它”摆正“?

03. 绘制概率曲线\small y = e^{-x^{2}}, x \in R的图像

       分析:没什么好分析的,莽它就完了,直接上代码:

x = -3:.05:3;
y = exp(-x.^2);
plot(x,y)
title('y = e^-(x)^2')

        代码运行结果如图6所示:

 图6:概率函数的图像

高能预警!接下来的三个函数可不是跟你闹着玩儿的,搞不好的话,小则图画不出来,大则电脑卡死,玩家崩溃。

04.绘制箕舌线\small y = \frac{8a^{3}}{x^{2}+4a^{2}}的图像

        分析:显然 ,自变量的取值范围为 \small x \in R,为了获得和题目要求一致样貌的函数曲线,我们取\small a = 2。需要注意的是,这个函数是由一个圆和上面的部分组成的。可以考虑分部画图,需要指出的是,这个图可以直接用表达式作图,不需要利用极坐标或者参数方程完成。好了,上代码:

a = 2;%取参数a的值为2,当然,你也可以取一个你喜欢的数值
x = -10:.1:10;%定义自变量的取值范围
y = 8*a^3./(x.^2+ 4*a^2);%定义函数公式

%画下面的那个圆
theta = 0:pi/20:2*pi;
xx = a*cos(theta);
yy = a+a*sin(theta);

%组装
plot(x,y,'b','LineWidth',3)
hold on
plot(xx,yy,'r--','LineWidth',1.5)
legend('箕舌线图像,a = 2')
axis equal

        代码运行结果如图7所示:

图7:箕舌线图像 

        配色稍微有点尴尬,如果你实在是看不下去可自行调整代码参数,绘制出属于你的amazing效果。

05.绘制蔓叶线\small y^{2}\left ( 2a-x \right ) = x^{3}的图像

        分析:这是一个隐式方程,可以直接用方程莽,但需要注意分母必须有意义的情况。考虑画这个图的时候,让四五年没有碰高数课本的我着实死了好多脑细胞。我们需要寻找这个方程的其它形式。参考了EMBA乐园:蔓叶线漫谈https://m.sohu.com/a/505017388_121124316/?pvid=000115_3w_a        这一篇帖子。我们发现,可以从常规的定义角度入手,推导这个曲线的极坐标方程。现结合引文内容,与自己的思考,将推导过程再简述一遍。虽然已经有前人做过这个工作了,但我们还是有必要研究一下这个过程。放一张参考图图8作为说明:

 图8:分析过程专用图

       引用定义:

作一圆,取它的一条直径ON,不妨置于水平位置。过N作ON的垂线l。从点O引射线,交圆于点A,交垂线于点B。以AB长度为半径,以点O为圆心作圆,与射线交于点M。那么,随着射线的运动,点M就将描绘出一条曲线,这条曲线就是蔓叶线,

        为了方便起见,我们统一引用极坐标表达式表示其中的任何线条。

        对于直线 \small l ,我们知道它的直角坐标表达式为: \small x = 4,化为极坐标表达式为:\small \rho _{l} cos\theta = 4。如果不知道怎么换算,可以参考这篇文章:直线的极坐标方程https://zhuanlan.zhihu.com/p/55877974

     那么,在直线上的 \small B 点的极坐标就可以确定为:\small (\rho _{B},cos\theta )。而 \small A 点在半径为a的圆上并且满足射线方程,那么其满足:\small \left\{\begin{matrix} x = a + acos\theta _{1};\\ \\y = asin_{1}; \end{matrix}\right.,线段 \small AB 的长度为:\small \left | AB \right | = \rho_{B} - \rho _{A}=\left | OM \right |,其中\small \rho _{A} = \left | OA \right |,\rho _{B} = \left | OB \right |,在\small \Delta OAB中,我们可以很方便地利用直角三角形的角度和边的关系推导出\small M点应该满足的关系式。

\small connect A and N\\ \because \angle ONB = 90^{o} and \angle OAN = 90^{o};\\ \therefore \angle BAN = \angle OAN = 90^{o};\\ \therefore \angle BON = \angle BNA;\\ \therefore \Delta ABN \sim \Delta NBO;\\ \therefore \frac{\left | NB \right |}{\left | OB \right |} = \frac{\left | BA \right |}{\left | BN\right |};\\ and \left | NB \right | = \left | OB \right |sin\angle BON;\\ \therefore \left | BA \right | = \rho _{M} = \frac{\left | NB^{2} \right |}{\left | OB \right |} = \frac{asin^{2}\theta }{cos\theta };

    即:\small \left | OM \right | = \frac{asin^{2}\theta }{cos\theta }。根据引文中的转换,将其转换成直角坐标系的表达式,即:

\small y^{2} = \frac{x^{3}}{2a-x}。话不多说,开始编写代码:

a = 2; %定义a的取值
x = 0:.05:4;%定义自变量的取值范围

ylim = get(gca,'Ylim');%获取当前窗口的Y轴数值


%定义主函数图像关系式
y1 = sqrt(x.^3./(2*a-x));
y2 = -sqrt(x.^3./(2*a-x));

%定义辅助圆参数
theta = -2*pi:pi/20:2*pi;
xx = a+a*cos(theta);
yy = a*sin(theta);

plot(x,y1,x,y2,'LIneWidth',3)
hold on
plot(xx,yy,[4,4],ylim,'LineWidth',1.5)
axis([0 10 -10 10])
grid on

    代码运行结果如图9所示:

图9: 蔓叶线绘图结果

 06.绘制笛卡尔叶形线\small x^{3} + y^{3} -3axy = 0的图像

       分析:这个堪称史诗级难度,不过幸好有参数方程,即:\small \left\{\begin{matrix} x = \frac{3at}{1+t^{3}}; & & \\ \\ y = \frac{3at^{2}}{1+t^{3}}; \end{matrix}\right.,有了参数方程就会好很多,其次,我们需要知道它的渐近线方程,即:x + y + a = 0。上代码:

a = 1.5;
t = -5:.1:5;
x = 3*a.*t./(1+ t.^3);
y = 3*a.*t.^2./(1+ t.^3);
plot(x,y,'LineWidth',3)
hold on
grid on
x1 = -10:.001:10;
y1 = -a-x1;
plot(x1,y1,'--')
axis([-5 5 -5 5])

    运行结果如图10所示:

 图10:笛卡尔叶形线图像

         至于为什么中间那一段儿不封闭,我也不晓得咯~

07.后记

       从早上一直写到现在,花了一天时间了,终于写完了。后面这几个着实废了一番功夫,但值得你花时间思考。听说MATLAB还可以画出动态效果,这里就先不展示了,研究一段时间再说,如果大家感兴趣的话也可以自己尝试一下,很带劲儿。 


       代码没有经过专门的优化,如果大家有更好的编写方式,欢迎留言讨论,我们下期再会,see you then~

  • 14
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值