欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

R语言数值导数

发布时间:2023/12/18 编程问答 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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⁡xy=\sin xy=sinx进行抽样的结果,可以理解为是一个不连续的函数;红线则是在每一个分立的点上,sin⁡x\sin xsinx在该点的切线。这两者看上去如此一致,说明连续函数的导数在抽样之后仍然具备一定的数学意义。

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

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

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

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

f[xn]=f(xn+1)−f(xn)xn+1−xn=f(xn+h)−f(xn)hf[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(xn+1)−f(xn)f(x_{n+1})-f(x_n)f(xn+1)f(xn)为差分,则数值导数是f(x)f(x)f(x)的差分与xxx的差分的商,所以也叫差商。

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

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)

如图所示

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

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

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+2h]−f[x+h]h−f[x+h]−f[x]hh=f[x+2h]−2f[x+h]+f[x]h2\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语言数值导数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。