我是靠谱客的博主 开朗猫咪,最近开发中收集的这篇文章主要介绍R语言数值导数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 3 数值导数

3 数值导数

根据导数的定义,当函数的定义域不连续时,其不连续处显然是不存在导数的,但图形可以“欺骗”我们的眼睛。

> x = seq(-1,1,0.1)
> y = sin(x)
> y1 = cos(x)
> xEnd = x+0.1
> yEnd = y+y1*0.1
> plot(x,y)
> for(i in seq_along(x)){
+ lines(c(x[i],xEnd[i]),c(y[i],yEnd[i]),col="red")
+ }

在这里插入图片描述

上图中,圆圈是对 y = sin ⁡ x y=sin x y=sinx进行抽样的结果,可以理解为是一个不连续的函数;红线则是在每一个分立的点上, sin ⁡ x sin x sinx在该点的切线。这两者看上去如此一致,说明连续函数的导数在抽样之后仍然具备一定的数学意义。

相应地,不连续的函数,也应该有类似于导数一样的存在,从而与连续函数的导数相对应,此即数值导数。如果回顾导数的定义

f ′ ( x 0 ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f'(x_0)=lim_{Delta xto0}frac{f(x_0+Delta x)-f(x_0)}{Delta x} f(x0)=Δx0limΔxf(x0+Δx)f(x0)

Δ x ↛ 0 Delta xnotto 0 Δx0时,即可理解为数值导数。

假设现在对某个函数 f ( x ) f(x) f(x)进行等间隔抽样,间隔为 h h h,则其第 n n n个点处的数值导数为

f [ x n ] = f ( x n + 1 ) − f ( x n ) x n + 1 − x n = f ( x n + h ) − f ( x n ) h f[x_n]=frac{f(x_{n+1})-f(x_n)}{x_{n+1}-x_n}= frac{f(x_n+h)-f(x_n)}{h} f[xn]=xn+1xnf(xn+1)f(xn)=hf(xn+h)f(xn)

由于一般称 f ( x n + 1 ) − f ( x n ) f(x_{n+1})-f(x_n) f(xn+1)f(xn)为差分,则数值导数是 f ( x ) f(x) f(x)的差分与 x x x的差分的商,所以也叫差商。

仍以 sin ⁡ x sin x sinx为例,假设在 [ − 5 , 5 ] [-5,5] [5,5]区间内分别以0.1,0.5,1为间隔,算其差商,然后和其导数 cos ⁡ x cos x cosx相对比。

x = seq(-5,5,0.1)
y = cos(x)
x1 = seq(-5,5,0.1)
end = length(x1)
y1 = (sin(x1[2:end])-sin(x1[1:end-1]))/0.1
x5 = seq(-5,5,0.5)
end = length(x5)
y5 = (sin(x5[2:end])-sin(x5[1:end-1]))/0.5
x10 = seq(-5,5,1)
end = length(x10)
y10 = (sin(x10[2:end])-sin(x10[1:end-1]))/0.5
plot(x,y,type="l",col="red")
lines(x1[2:length(x1)],y1)
lines(x5[2:length(x5)],y5)
lines(x10[2:length(x10)],y10)

如图所示

在这里插入图片描述

由于我们采用的是后向差分,所以三组差商的值整体右移。此外,随着 h h h的增大,其误差也越来越明显。

对一个函数进行反复求导,即可得到高阶导数,可以用数学归纳法的方式记为

f ( n ) ( x ) = { f ( n − 1 ) ( x ) } ′ f ( 1 ) ( x ) = f ′ ( x ) begin{aligned} f^{(n)}(x)&={f^{(n-1)}(x)}'\ f^{(1)}(x)&=f'(x) end{aligned} f(n)(x)f(1)(x)={f(n1)(x)}=f(x)

差商亦然,可以记为

f ( n ) [ x ] = { f ( n − 1 ) [ x ] } ′ f ( 1 ) [ x ] = f [ x ] begin{aligned} f^{(n)}[x]&={f^{(n-1)}[x]}'\ f^{(1)}[x]&=f[x] end{aligned} f(n)[x]f(1)[x]={f(n1)[x]}=f[x]

但与导数不同之处在于,差商可以更加方便地进行递推,例如

f ( 2 ) [ x ] = f [ x + h ] − f [ x ] h = f [ x + 2 h ] − f [ x + h ] h − f [ x + h ] − f [ x ] h h = f [ x + 2 h ] − 2 f [ x + h ] + f [ x ] h 2 begin{aligned} f^{(2)}[x]&=frac{f[x+h]-f[x]}{h}\ &=frac{frac{f[x+2h]-f[x+h]}{h}-frac{f[x+h]-f[x]}{h}}{h}\ &=frac{f[x+2h]-2f[x+h]+f[x]}{h^2} end{aligned} f(2)[x]=hf[x+h]f[x]=hhf[x+2h]f[x+h]hf[x+h]f[x]=h2f[x+2h]2f[x+h]+f[x]

最后

以上就是开朗猫咪为你收集整理的R语言数值导数的全部内容,希望文章能够帮你解决R语言数值导数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部