3.3 曲线
对于普通一元函数光滑y = f(x),在点P(x0, y0)处,利用f(x)一阶导数,得到P点处切线斜率。f(x)在P点切线方程如下:
如图3.17所示,很容易地得到f(x)在P点(x0, y0)切向量:
图3.17 函数f(x)上P点切向量和法向量
和平面直线不同,切向量随着P点位置变化而变化。和上一节平面直线一样,同样构造如下二元F(x, y)函数:
P点(x0, y0)法向量:
同样,法向量随着P点位置变化而变化。以如下函数为例,用diff() 和quiver() 函数计算一阶导数,并绘制函数法向量和切向量:
f(x)一阶导数如下:
P点(x0, y0)法向量表达式如下:
P点(x0, y0)切向量表达式如下:
丛书第一册第6章中,绘制过函数切线和法线位置图。当时采用gradient()、surfnorm() 和quiver()等函数。本节采向量解析式和quiver()函数绘制切向量和法向量。图3.18展示x在[-5, 5] 范围变化时,不同位置法向量和切向量大小和方向。
图3.18 函数f(x)不同点法向量和切向量
以下代码绘制图3.18。
B4_Ch3_3.m clc; close all; clear all syms f(x) f(x) = cos(2*x)*x; df = diff(f,x) x_fine = -5:0.1:5; x_coarse = -3.5:0.5:3.5; f_x_fine = double(subs(f,[x],{x_fine})); f_x_coarse = double(subs(f,[x],{x_coarse})); df_x_coarse = double(subs(df,[x],{x_coarse})); figure(1) subplot(1,2,1) plot(x_fine,f_x_fine,'color',[0,96,166]/255); hold on plot(x_coarse,f_x_coarse,'xk') quiver(x_coarse,f_x_coarse,... df_x_coarse,-1 + 0*df_x_coarse,... 'color',[255,153,255]/255) decor subplot(1,2,2) plot(x_fine,f_x_fine,'color',[0,96,166]/255); hold on plot(x_coarse,f_x_coarse,'xk') quiver(x_coarse,f_x_ coarse,... 1 + 0*df_x_coarse, df_x_coarse,... 'color',[0,153,255]/255) decor function decor() daspect([1,1,1]); xlim([-5,5]); ylim([-5,5]); ax = gca; box off; grid off ax.XAxisLocation = 'origin'; ax.YAxisLocation = 'origin'; yticks([-4:2:4]); xticks([-4:2:4]); xlabel('x'); ylabel('y') end
还有一类重要函数,叫作隐函数(implicit function)。通俗地说,因变量隐含在隐函数方程中。比如下式,圆心位于原点单位圆方程:
上式中,x为自变量,y为因变量;发现x和y并非一一映射关系。本书第1章符号数学运算部分讨论过fimplicit() 和fimplicit3() 函数绘制隐函数平面图形和空间图像。本节下面内容介绍隐函数法向量和法向量。以单位圆方程为例,先构造F(x, y)函数,如下:
x-y平面,圆上任意一点P点(x0, y0)法向量表达式如下:
P点(x0, y0)切向量表达式如下:
图3.19展示单位圆上不同位置切向量和法向量,可由以下代码获得。下列代码使用for循环,请读者尝试用向量运算代替for循环。
B4_Ch3_4.m clc; close all; clear all syms x y f = x^2 + y^2 - 1; g = gradient(f, [x, y]) [XX1, XX2] = meshgrid(-3:0.2:3,-3:0.2:3); % 0.4 [XX1_fine, XX2_fine] = meshgrid(-3:.2:3,-3:.2:3); figure(1) hold on thetas = pi/12:pi/6:2*pi; for ii = 1:length(thetas) theta = thetas(ii); x0 = cos(theta); y0 = sin(theta); plot(x0,y0,'xk') dFF_dx = subs(g(1), [x y], {x0,y0}); dFF_dy = subs(g(2), [x y], {x0,y0}); h1 = quiv er(x0,y0,dFF_dx,dFF_dy,... 'color',[255,153,255]/255) h1.AutoScaleFactor = 0.4; h2 = quiver(x0,y0,-dFF_dy,dFF_dx,... 'co lor',[0,153,255]/255) h2.AutoScaleFactor = 0.4; end fimplicit(f, [-2 2 -2 2],'color',[0,96,166]/255,'LineWidth',1); hold on daspect([1,1,1]) xlim([-2.1,2.1]); ylim([-2.1,2.1]); ax = gca; box off; gri d off ax.XAxisLocation = 'origin'; ax.YAxisLocation = 'origin'; yticks([-2:1:2]); xticks([-2:1:2]) xlabel('x'); ylabel(' y')
图3.19 单位圆不同点法向量和切向量