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?)=Δx→0lim?Δxf(x0?+Δx)?f(x0?)?
當Δx→?0\Delta x\not\to 0Δx→0時,即可理解為數值導數。
假設現在對某個函數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+1??xn?f(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(n?1)(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(n?1)[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]??
總結
- 上一篇: Win10设置每天定时运行某程序
- 下一篇: 无心剑英译许巍《温暖》