張雨濃, 鄧健豪, 劉錦榮, 仇 堯, 金 龍
(1.中山大學信息科學與技術(shù)學院,廣東廣州510006; 2.中山大學軟件學院,廣東廣州510006)
數(shù)值微分是數(shù)值分析中的基本問題,同時也是應(yīng)用科學中非常有用的一個工具[1-3]. 通過使用鄰近的離散數(shù)據(jù)點,有限差分法可有效地近似一個函數(shù)在目標點的導數(shù)值[4]. 根據(jù)目標點在采樣區(qū)間中的位置,有限差分公式可以被劃分為前向差分、后向差分和中心差分公式. 目標點是所用數(shù)據(jù)點的最左點即為前向差分,最右點為后向差分,中間點為中心差分.
使用多點中心差分公式時,要求目標點兩側(cè)有相同數(shù)量的離散數(shù)據(jù)點. 因此,當目標點靠近邊界時,單邊數(shù)據(jù)點不足,多點中心差分公式往往不能被應(yīng)用. 當未知函數(shù)在目標點的導數(shù)值發(fā)生加速變化時,由于前(后)向差分公式只應(yīng)用單邊的數(shù)據(jù)點,可能無法適應(yīng)該變化,使得近似導數(shù)值的誤差較大.
為了解決以上問題,一點超前差分公式被提出[5]. 該公式綜合了三種傳統(tǒng)的差分公式,在后向差分公式的形式上“前移”一點,解決了因單邊數(shù)據(jù)點不足造成的問題,同時適應(yīng)了目標點的導數(shù)值可能發(fā)生的加速變化[5]. 該公式由拉格朗日插值多項式推導而來. 利用采集的等間距數(shù)據(jù)點,可以構(gòu)造近似未知函數(shù)的拉格朗日插值多項式;對該式子求導,即可得到近似的未知函數(shù)的一階數(shù)值差分公式[6],由此可以得出求一階導數(shù)的一點超前公式.
不同于文獻[5]和[6]中利用拉格朗日插值多項式來推導一階數(shù)值差分公式的方法,本文提出了基于泰勒級數(shù)展開[7]的對一點超前差分公式的推導. 由給出的未知函數(shù)在指定區(qū)間上的N+1個等間距點的函數(shù)值,即可列出N個關(guān)于目標點的1到N階導數(shù)的泰勒級數(shù)展開式. 將N個式子代入一點超前差分公式中,即可得出關(guān)于N+1個系數(shù)的方程組. 求解該方程組即可得到N+1個數(shù)據(jù)點的一點超前公式. 使用基于泰勒級數(shù)展開的推導方法所得到的二至十六個數(shù)據(jù)點的一點超前公式以及截斷誤差與文獻[5]中給出的一致,這使得一點超前公式的理論基礎(chǔ)更加完善.
另外,計算機數(shù)值實驗表明,一點超前公式可以取得較好的一階導數(shù)估計精度[5]. 附錄中給出了利用一點超前差分公式來近似目標點的一階導數(shù)的Matlab程序代碼. 只要給出N+1個等間距數(shù)據(jù)點的函數(shù)值及間距,即可求出第N個點的一階導數(shù)近似值.
若x0,x1,…,xn為采樣區(qū)間[a,b]上n+1個互不相同的等間距數(shù)據(jù)點,即xi+1-xi=h,i=0,1,…,n-1,其中h為采樣間隔常數(shù),則未知目標函數(shù)f(x)的一階導數(shù)的一點超前差分公式為[5]
表1 二至八個數(shù)據(jù)點的等間距一點超前數(shù)值差分公式
定理1一階導數(shù)的等間距一點超前差分公式的形式為
f′(xn-1)≈a0f(x0)+a1f(x1)+…+an-1f(xn-1)+anf(xn),
(1)
系數(shù)a0,a1,…,an可以由泰勒級數(shù)展開來推導并求解線性方程組得出.
證f(x)在點xn-1的泰勒展開式為
(2)
其中c介于xn-1與x之間.
對于0≤k≤n(k≠n-1),將xk=xn-1+(k+1-n)h代入(2)中,可以得出n個等式
其中ck介于xn-1與xk之間.
將以上n個等式代入(1)中,可得
f′(xn-1)≈ (a0+a1+…+an-1+an)f(xn-1)
+(1-n)ha0+(2-n)ha1+…+(-1)han-2+hanf′(xn-1)
(3)
令(3)右邊的f′(xn-1)的系數(shù)等于1,f(xn-1),f″(xn-1),…,f(n)(xn-1)的系數(shù)于0,可得出關(guān)于a0,a1,…,an的線性方程組
由此可以求出一階導數(shù)的等間距一點超前差分公式中的系數(shù). 通過觀察可知,該公式的截斷誤差為
(4)
當n=1時,一點超前差分公式的形式為f′(x0)≈a0f(x0)+a1f(x1),此時關(guān)于a0,a1的方程組及其解為
因此f′(x0)≈f(x1)-f(x0)/h. 由(4)可知截斷誤差為
當n=2時,一點超前差分公式的形式為f′(x1)≈a0f(x0)+a1f(x1)+a2f(x2),此時關(guān)于a0,a1,a2的方程組及其解為
因此f′(x1)≈f(x2)+0f(x1)-f(x0)/(2h),截斷誤差為
當n=3時,一點超前差分公式的形式為
f′(x2)≈a0f(x0)+a1f(x1)+a2f(x2)+a3f(x3),
此時關(guān)于a0,a1,a2,a3的方程組及其解為
因此f′(x2)≈2f(x3)+3f(x2)-6f(x1)+f(x0)/(6h),截斷誤差項為
可以看出,基于泰勒級數(shù)展開推導出來的一點超前差分公式及其截斷誤差,與表1給出的完全一致. 對于n>3的情況,可使用附錄中給出的Matlab程序來驗證. 另外,八至十六個數(shù)據(jù)點的等間距一點超前差分公式可參考文獻[5].
這樣,我們就從另一個方面證明了一點超前公式的正確性.
傳統(tǒng)的有限差分公式包括前向差分、后向差分和中間差分公式. 使用這些公式可以有效地近似未知函數(shù)在目標點的近似值. 但是,對于靠近邊界的目標點,單邊數(shù)據(jù)點不足,無法應(yīng)用多點的中間差分公式. 另外,前(后)向差分公式無法適應(yīng)未知函數(shù)在目標點的導數(shù)的加速變化. 一點超前數(shù)值差分公式可以有效地解決上述問題,其準確性也已經(jīng)得到了驗證.
本文給出了基于泰勒級數(shù)展開的對一點超前差分公式的推導過程. 通過對采樣點應(yīng)用泰勒級數(shù)展開式,我們得出了關(guān)于一點超前公式中的系數(shù)的線性方程組. 最后,我們還給出了自動列出并求解該方程組的Matlab程序. 總而言之,本文從另一個角度,進一步證實了一點超前差分公式的有效性和正確性.
以下給出求一點超前公式系數(shù)及目標點的一階導數(shù)近似值的Matlab程序.
%輸入:
% F: 包含n+1個采樣函數(shù)值的向量,即[f(0),f(1),...,f(n)]′
% h: 采樣間隔常數(shù)
%輸出:
% d: 第n-1個點的一階導數(shù)近似值,即f′(n-1)
% A: 包含n+1個系數(shù)的向量,即[a0,a1,...,an]′
function [d,A]=oneNodeAhead(F,h)
n=size(F,1)-1;
Y=zeros(n+1,1);
Y(2,1)=1/h;
B=ones(n+1,n+1);
for j=1∶(n+1)
b=1;
for i=2∶(n+1)
if j==n
B(i,j)=0;
else
b=b*(j-n);
B(i,j)=b;
end
end
end
A=BY;
d=A'*F;
end
[參 考 文 獻]
[1] Li Jian-ping. General explicit difference formulas for numerical differentiation[J]. Journal of Computational and Applied Mathematics,2005,183(1):29-52.
[2] John H M,Kurtis D F. 數(shù)值方法(MATLAB 版)[M] .4 版.周璐,陳渝,錢方,等譯. 北京:電子工業(yè)出版社,2009.
[3] 李建良,蔣勇,汪光先. 計算機數(shù)值方法[M]. 南京:東南大學出版社,2000.
[4] Ishtiaq R K,Ryoji O. Taylor series based finite difference approximations of higher-degree derivatives[J]. Journal of Computational and Applied Mathematics,2003,154(1):115-124.
[5] 張雨濃,陳宇曦,陳錦浩,殷勇華. 一點超前數(shù)值差分公式的提出、研究與實踐[J]. 中山大學學報(自然科學版),2012,51(2):1-5.
[6] 張雨濃,郭東生,徐思洪,李海林. 未知目標函數(shù)之一階數(shù)值微分公式驗證與實踐[J].甘肅科學學報,2009,21(1):13-18.
[7] 白曉東. Taylor公式逼近精度的研究[J]. 大學數(shù)學,2004,20(4):108-110.