用R语言画出方向导数和梯度

用R语言画出方向导数和梯度根据单变量函数的导数定义 可以类推出多变量函数的导数定义

大家好,欢迎来到IT知识分享网。

5 方向导数

基本概念

根据单变量函数的导数定义,可以类推出多变量函数的导数定义。唯一值得注意的地方是,多变量函数在求导时需要指明针对哪一个变量求导。例如,对于函数 f ( x , y ) f(x,y) f(x,y),在 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处对 x x x求导,可以写为

f x ′ ( x 0 , y 0 ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x f’_x(x_0,y_0)=\lim_{\Delta x\to0}\frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x} fx(x0,y0)=Δx0limΔxf(x0+Δx,y0)f(x0,y0)

现有一函数 z = f ( x , y ) = 1 − ( x 2 + y 2 ) z=f(x,y)=1-(x^2+y^2) z=f(x,y)=1(x2+y2),则 z x ′ = − 2 x z’_x=-2x zx=2x。任取一点 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi),以其导数的值为斜率,沿着 x x x方向做出一条切线,其方程为

y = y 0 z = − 2 x 0 ( x − x 0 ) + z 0 \begin{aligned} y&=y_0\\ z&=-2x_0(x-x_0)+z_0 \end{aligned} yz=y0=2x0(xx0)+z0

现绘制出100个随机点处 x x x方向的偏导数

x = matrix(data=seq(-5,4.95,0.05),nrow=200,ncol=200) y = t(x) z = 1-(x^2+y^2) library(rgl) persp3d(x,y,z,col="red") N = 1000 x0 = rnorm(N) y0 = rnorm(N) z0 = 1-(x0^2+y0^2) x1 = x0+3 z1 = -2*x0*3+z0 for(i in 1:N) lines3d(c(x0[i],x1[i]),c(y0[i],y0[i]),c(z0[i],z1[i]),col="green") 

在这里插入图片描述

从观感上来看,绿线的确是沿着 x x x方向。但是这个切线显然不是唯一的, y y y轴方向显然存在另一条切线。推而广之,一旦坐标系旋转,那么曲面上任意一点处的 x x x y y y方向均会发生变化。

那么曲面是否存在一个只和曲面特征有关,而与坐标系无关的参数?

梯度

在解决这个问题之前,最好先找到曲面某点沿着任意方向的导数。回顾 x x x方向偏导数的定义

f x ′ ( x 0 , y 0 ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x f’_x(x_0,y_0)=\lim_{\Delta x\to0}\frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x} fx(x0,y0)=Δx0limΔxf(x0+Δx,y0)f(x0,y0)

如果把 x x x y y y这两个方向等同看待,则该式可以写成更加对偶的形式

f x ′ ( x 0 , y 0 ) = lim ⁡ Δ x → 0 f ( x 0 + 1 ⋅ Δ x , y 0 + 0 ⋅ Δ x ) − f ( x 0 , y 0 ) Δ x f’_x(x_0,y_0)=\lim_{\Delta x\to0}\frac{f(x_0+1\cdot\Delta x,y_0+0\cdot\Delta x)-f(x_0,y_0)}{\Delta x} fx(x0,y0)=Δx0limΔxf(x0+1Δx,y0+0Δx)f(x0,y0)

f x ′ ( x 0 , y 0 ) = lim ⁡ δ x → 0 f ( x 0 + 1 ⋅ δ , y 0 + 0 ⋅ δ ) − f ( x 0 , y 0 ) δ f’_x(x_0,y_0)=\lim_{\delta x\to0}\frac{f(x_0+1\cdot\delta,y_0+0\cdot\delta)-f(x_0,y_0)}{\delta} fx(x0,y0)=δx0limδf(x0+1δ,y0+0δ)f(x0,y0)

如果导数的方向发生旋转,则可以写为

f x ′ ( x 0 , y 0 ) = lim ⁡ δ → 0 f ( x 0 + cos ⁡ θ ⋅ δ , y 0 + sin ⁡ θ ⋅ δ ) − f ( x 0 , y 0 ) δ = lim ⁡ δ → 0 f ( x 0 + cos ⁡ θ ⋅ δ , y 0 + sin ⁡ θ ⋅ δ ) − f ( x 0 , y 0 + sin ⁡ θ ⋅ δ ) + f ( x 0 , y 0 + sin ⁡ θ ⋅ δ ) − f ( x 0 , y 0 ) δ = lim ⁡ cos ⁡ θ δ → 0 f ( x 0 + cos ⁡ θ ⋅ δ , y 0 + sin ⁡ θ ⋅ δ ) − f ( x 0 , y 0 + sin ⁡ θ ⋅ δ ) cos ⁡ θ δ ⋅ cos ⁡ θ + lim ⁡ sin ⁡ θ δ → 0 f ( x 0 , y 0 + sin ⁡ θ ⋅ δ ) − f ( x 0 , y 0 ) sin ⁡ θ δ ⋅ sin ⁡ θ = f x ′ ( x 0 , y 0 ) sin ⁡ θ + f y ′ ( x 0 , y 0 ) cos ⁡ θ \begin{aligned} f’_x(x_0,y_0)=&\lim_{\delta\to0}\frac{f(x_0+\cos\theta\cdot\delta,y_0+\sin\theta\cdot\delta)-f(x_0,y_0)}{\delta}\\ =&\lim_{\delta\to0}\frac{f(x_0+\cos\theta\cdot\delta,y_0+\sin\theta\cdot\delta)-f(x_0,y_0+\sin\theta\cdot\delta)+f(x_0,y_0+\sin\theta\cdot\delta)-f(x_0,y_0)}{\delta}\\ =&\lim_{\cos\theta\delta\to0}\frac{f(x_0+\cos\theta\cdot\delta,y_0+\sin\theta\cdot\delta)-f(x_0,y_0+\sin\theta\cdot\delta)}{\cos\theta\delta}\cdot\cos\theta\\ &+\lim_{\sin\theta\delta\to0}\frac{f(x_0,y_0+\sin\theta\cdot\delta)-f(x_0,y_0)}{\sin\theta\delta}\cdot\sin\theta\\ =&f’_x(x_0,y_0)\sin\theta+f’_y(x_0,y_0)\cos\theta \end{aligned} fx(x0,y0)====δ0limδf(x0+cosθδ,y0+sinθδ)f(x0,y0)δ0limδf(x0+cosθδ,y0+sinθδ)f(x0,y0+sinθδ)+f(x0,y0+sinθδ)f(x0,y0)cosθδ0limcosθδf(x0+cosθδ,y0+sinθδ)f(x0,y0+sinθδ)cosθ+sinθδ0limsinθδf(x0,y0+sinθδ)f(x0,y0)sinθfx(x0,y0)sinθ+fy(x0,y0)cosθ

其中 ( cos ⁡ θ , sin ⁡ θ ) (\cos\theta,\sin\theta) (cosθ,sinθ)表示当前点的方向。受此启发,对于更多自变量的函数 y = f ( x 0 , x 1 , . . . x ) n y=f(x_0,x_1,…x)_n y=f(x0,x1,x)n,其在 V ⃗ = ( v 0 , v 1 , . . . v n ) \vec V=(v_0,v_1,…v_n) V
=
(v0,v1,vn)
方向的导数可以写为

∂ f ∂ x 1 v 1 + ∂ f ∂ x 2 v 2 + ⋯ + ∂ f ∂ x n v n \frac{\partial f}{\partial x_1}v_1+ \frac{\partial f}{\partial x_2}v_2+\cdots+ \frac{\partial f}{\partial x_n}v_n x1fv1+x2fv2++xnfvn

如果写成矢量形式,则定义梯度

∇ f = [ ∂ f ∂ x 1 , ∂ f ∂ x 2 , ⋯   , ∂ f ∂ x n ] T \nabla f=[\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2},\cdots, \frac{\partial f}{\partial x_n}]^T f=[x1f,x2f,,xnf]T

则在 V ⃗ \vec V V
方向的导数可以写为

D V f ( x ⃗ ) = ( ∇ f ) T ⋅ V ⃗ D_Vf(\vec x)=(\nabla f)^T\cdot\vec V DVf(x
)=
(f)TV

而今通过方向导数去考察 z = 1 − ( x 2 + y 2 ) z=1-(x^2+y^2) z=1(x2+y2)这个函数,其梯度为 ( z x ′ , z y ′ ) = ( − 2 x , − 2 y ) (z’_x,z’_y)=(-2x,-2y) (zx,zy)=(2x,2y)。则该点处最大方向导数必与梯度方向相同,即 ( − 2 x 4 x 2 + 4 y 2 , − 2 y 4 x 2 + 4 y 2 ) (\frac{-2x}{\sqrt{4x^2+4y^2}},\frac{-2y}{\sqrt{4x^2+4y^2}}) (4x2+4y2
2x
,4x2+4y2
2y
)
,其方向导数为 2 x 2 + y 2 2\sqrt{x^2+y^2} 2x2+y2

任取一点 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0),以其最大方向导数的方向为斜率做出一条直线,其方程为

x − x 0 − x 0 x 0 2 + y 0 2 = y − y 0 − y 0 x 0 2 + y 0 2 = z − z 0 2 x 0 2 + y 0 2 \frac{x-x_0}{\frac{-x_0}{\sqrt{x_0^2+y_0^2}}}=\frac{y-y_0}{\frac{-y_0}{\sqrt{x_0^2+y_0^2}}}=\frac{z-z_0}{2\sqrt{x_0^2+y_0^2}} x02+y02
x0
xx0
=
x02+y02
y0
yy0
=
2x02+y02
zz0

x = ( z − z 0 ) − x 0 2 ( x 0 2 + y 0 2 ) + x 0 y = ( z − z 0 ) − y 0 2 ( x 0 2 + y 0 2 ) + y 0 \begin{aligned} x=(z-z_0)\frac{-x_0}{2(x_0^2+y_0^2)}+x_0\\ y=(z-z_0)\frac{-y_0}{2(x_0^2+y_0^2)}+y_0\\ \end{aligned} x=(zz0)2(x02+y02)x0+x0y=(zz0)2(x02+y02)y0+y0

简单起见,在距离 x = 0 , y = 0 x=0,y=0 x=0,y=0的直线为 1 1 1处等间隔选取一些点,则 x 0 2 + y 0 2 = 1 \sqrt{x_0^2+y_0^2}=1 x02+y02
=
1
,上式简化为

x = − x 0 2 ( z − z 0 ) + x 0 y = − y 0 2 ( z − z 0 ) + y 0 \begin{aligned} x=-\frac{x_0}{2}(z-z_0)+x_0\\ y=-\frac{y_0}{2}(z-z_0)+y_0\\ \end{aligned} x=2x0(zz0)+x0y=2y0(zz0)+y0

沿这些点梯度方向做一些直线,看看效果如何

x = matrix(data=seq(-5,4.95,0.05),nrow=200,ncol=200) y = t(x) z = -(x^2+y^2) library(rgl) persp3d(x,y,z,col="red") theta = seq(-pi,pi,0.01) x0 = cos(theta) y0 = sin(theta) z0 = 1-(x0^2+y0^2) x1 = x0*0 y1 = y0*0 z1 = z0+2 for(i in 1:N) lines3d(c(x0[i],x1[i]),c(y0[i],y1[i]),c(z0[i],z1[i]),col="green") 

如图所示,像一顶漂亮的帽子,在某个投影方向看去,和我们熟知的切线如出一辙。

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/158479.html

(0)
上一篇 2025-01-19 21:26
下一篇 2025-01-19 21:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信