MATLAB金融风险管理师FRM(高阶实战)
上QQ阅读APP看书,第一时间看更新

3.3 曲线

对于普通一元函数光滑y = fx),在点Px0, y0)处,利用fx)一阶导数,得到P点处切线斜率。fx)在P点切线方程如下:

如图3.17所示,很容易地得到fx)在P点(x0, y0)切向量:

图3.17 函数fx)上P点切向量和法向量

和平面直线不同,切向量随着P点位置变化而变化。和上一节平面直线一样,同样构造如下二元Fx, y)函数:

P点(x0, y0)法向量:

同样,法向量随着P点位置变化而变化。以如下函数为例,用diff() 和quiver() 函数计算一阶导数,并绘制函数法向量和切向量:

fx)一阶导数如下:

P点(x0, y0)法向量表达式如下:

P点(x0, y0)切向量表达式如下:

丛书第一册第6章中,绘制过函数切线和法线位置图。当时采用gradient()、surfnorm() 和quiver()等函数。本节采向量解析式和quiver()函数绘制切向量和法向量。图3.18展示x在[-5, 5] 范围变化时,不同位置法向量和切向量大小和方向。

图3.18 函数fx)不同点法向量和切向量

以下代码绘制图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为因变量;发现xy并非一一映射关系。本书第1章符号数学运算部分讨论过fimplicit() 和fimplicit3() 函数绘制隐函数平面图形和空间图像。本节下面内容介绍隐函数法向量和法向量。以单位圆方程为例,先构造Fx, 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 单位圆不同点法向量和切向量