周啟楠
【摘要】這篇論文說明了一種JAVA在微積分計(jì)算中的創(chuàng)新方法及其應(yīng)用。
【關(guān)鍵詞】JAVA;積分;微分;微積分;向量;極限;求和
一、介紹
JAVA這種方法在定積分的上下限過大時(shí),電腦的運(yùn)算速度會(huì)大大減慢,而且精度也會(huì)有一定的損失。所以,我提供了一下一種用JAVA計(jì)算微積分的創(chuàng)新方法,以克服這些傳統(tǒng)方法所存在的缺點(diǎn)。
二、微分
在解決上述存?zhèn)鹘y(tǒng)方法中的問題之前,我們應(yīng)該先要知道導(dǎo)數(shù)的定義?!癟he derivative of f at x is given by
provided the limit exists.For all x for which this limit exists,fis a function of x”[4],也就是說在x值所對(duì)應(yīng)一個(gè)函數(shù)f上的點(diǎn)的導(dǎo)數(shù)為:
我們都知道,在定義中,我們必須要有兩個(gè)點(diǎn)來計(jì)算一階導(dǎo)數(shù)。
在傳統(tǒng)方法中我們用的是點(diǎn)(x,f(x))和點(diǎn)(x+h,f(x+h)),且要求h要盡可能地接近于0。
下一步就是研究為什么傳統(tǒng)方法在x很大時(shí)會(huì)失去精度。事實(shí)上,當(dāng)x增加時(shí),一個(gè)函數(shù)的斜率也會(huì)增加。所以當(dāng)x很大時(shí),斜率的值也會(huì)變得非常的大。一個(gè)很大的斜率就意味著一個(gè)很大的rate of change。也就是說,一個(gè)x值很小的改變都會(huì)引起在y值上很大的改變,進(jìn)而產(chǎn)生了更大的斜率。與傳統(tǒng)方法相比,這種方法更精確。下面我們來討論這個(gè)現(xiàn)象的主要原因。我們?cè)倌命c(diǎn)(1,f(1))作例子。很明顯可以發(fā)現(xiàn),連接點(diǎn)(1-h,f(1-h))和(1+h,f(1+h))的直線平行于點(diǎn)(1,f(1))的切線,但是連接點(diǎn)(1,f(1))和(1+h,f(1+h))的直線不平行于點(diǎn)(1,f(1))的切線。所以,連接點(diǎn)(1-h,f(1-h))和(1+h,f(1+h))的直線的斜率與切線的斜率更接近。所以,這種新方法或更正確。
以下是對(duì)這觀點(diǎn)的證明。我們?cè)僖詾槔?。不過與上次不同的是,這次中的差由使用symmetric difference quotient所得出的,而不用Newtons difference quotient。
我們這里用的是實(shí)際值和理想值的差表示電腦計(jì)算的誤差。我們都可以看到,我們成功地控制了誤差,使得誤差保持在0.0001。但當(dāng)x=1000,好像這個(gè)差變?yōu)榱?。但是,在這里這個(gè)誤差仍是0.0001。在這里,其實(shí)是因?yàn)閷?shí)際值很大,所以0.0001與實(shí)際值比起來很小,所以由于計(jì)算自身的原因,這一點(diǎn)小誤差就被電腦省略了。
所以,現(xiàn)在在計(jì)算微分的時(shí)候還是有一些誤差的。我們還需要更精確點(diǎn)。
為了更進(jìn)一步地提高準(zhǔn)確度,我們還需要調(diào)試h的值。h的值越小,兩點(diǎn)越近。兩點(diǎn)越近,結(jié)果就越準(zhǔn)確。
當(dāng)h=0.0000000001時(shí),結(jié)果是300。這看起來,已經(jīng)把誤差消除了。但事實(shí)上,誤差還在,只是太小了,電腦自動(dòng)把它忽略了。所以h的最佳值為0.0000000001。
三、積分
在解決上述存?zhèn)鹘y(tǒng)方法中的問題之前,我們應(yīng)該先要知道定積分的定義。“If f is defined on the closed interval [a,b] and the limit of Riemann sums over partitionsexists,...the limit is denoted
by.The limit is called definite integral.”[8]
也就是說定積分實(shí)際上是無數(shù)個(gè)寬為h(h趨近于0)和長為f(x)的面積之和。
基于這個(gè)概念,傳統(tǒng)方法也就產(chǎn)生了。以right Riemann sum of rectangles方法為例,我們把要積分的區(qū)域分成很多小小的矩形。然后,我們把它們依次加起來,這樣就能得到一個(gè)與積分值相近的一個(gè)值了。
下一步就是研究為什么傳統(tǒng)方法在上下限很大時(shí)會(huì)變得很慢。
讓我們?cè)僖詒ight Riemann sum of rectangles方法為例。正如我們?cè)谥疤岬降模瑸榱擞?jì)算定積分,傳統(tǒng)方法要先計(jì)算這些小矩形的面積和。為了使結(jié)果有較高的精度,每一個(gè)小矩形都要很小很小,以至于計(jì)算一次定積分所用的小矩形會(huì)很多很多。
不幸的是,這個(gè)想法不能很好地運(yùn)用到JAVA中。在JAVA中計(jì)算就和的常用方法是創(chuàng)造一段for-loop。在for-loop里面,電腦先把頭兩項(xiàng)相加,然后拿這兩項(xiàng)的和去加第三項(xiàng),以此類推。所以,矩形越多,計(jì)算機(jī)就會(huì)有越多的計(jì)算步驟。
當(dāng)矩形的數(shù)量或者說是上下限的值非常大時(shí),計(jì)算機(jī)計(jì)算的次數(shù)就非常多,以至于計(jì)算速度大大減慢。
仍以為例,來證明我們這個(gè)想法。
很明顯我們可以發(fā)現(xiàn),當(dāng)矩形的數(shù)量增加時(shí),電腦所花在計(jì)算上的時(shí)間也變大了。當(dāng)上下限的差增加時(shí),時(shí)間也增加了。
所以,我們要尋找一個(gè)更好的計(jì)算定積分的方法,最好能在很大程度上較少for-loop的執(zhí)行次數(shù)或者甚至不用循環(huán)。
所以,我提供了一種新方法,這種方法不會(huì)要就太多的循環(huán)次數(shù),有時(shí)以至于不會(huì)有循環(huán)產(chǎn)生。讓我們來看看這個(gè)方法。
在解釋方法之前,我們先來研究一種特殊的函數(shù)一一二次函數(shù),來看看我們有什么很好的方法去計(jì)算二次函數(shù)的定積分。我們來介紹一個(gè)計(jì)算二次函數(shù)定積分的規(guī)律?!癐f,then”.[9]
這是一個(gè)計(jì)算二次函數(shù)非常好的方法,因?yàn)槲覀儾恍枰獮榱擞?jì)算定積分而使用傳統(tǒng)方法中的求和。我們只用把公式代入,計(jì)算一次就可以了。所以,也就不需要有for-loop了。所以,這種方法會(huì)有更快的執(zhí)行速度。
我們比較下兩種方法。仍以為例。
很明顯,新方法的計(jì)算速度更快。
上述的規(guī)律是Simpsons Rule的基礎(chǔ),Simpsons Rule同樣也是一個(gè)計(jì)算積分的很好方法?!癓et f be continuous on [a,b] and let n be an even integer.Simpsons Rule for approximating the integral of function f(x) is:”.[10]
也就是說,如果說把任意一個(gè)函數(shù)分成n份,那么其函數(shù)的定積分值就滿足這個(gè)公式。
四、總結(jié)
有了這樣高的精度和效率,這段代碼和這個(gè)方法能運(yùn)用到很多不同的領(lǐng)域,尤其是物理,數(shù)學(xué)和工程。在這些領(lǐng)域里,這個(gè)新方法可以提高計(jì)算的效率,也可以使測(cè)量更加精確。
參考文獻(xiàn)
[1]http://en.wikipedia.org/wiki/Numerical_differentiation.
[2]Bock D.,M.S & Hockett O.S.,M.A.,Barrons AP Calculus 11th Edition,World Book Edition Cooperation,page 257-259.