上一節(jié)課主要介紹了曲線擬合與插值,曲線擬合主要包括線性擬合(單特征線性回歸和非線性擬合(非線性方程特征變換、高階多項式擬合)旬陡,插值包括多項式插值(拉格朗日形式、牛頓形式)语婴、樣條插值(線性插值季惩、二次樣條插值录粱、三次樣條插值),其中三次樣條插值還有一個便于求解的拉格朗日形式画拾。這里的曲線擬合與機器學(xué)習(xí)中的回歸問題非常相似啥繁,具有很大的參考意義。本節(jié)課主要介紹幾種求解微分的數(shù)值方法青抛。
1. 有限差分法
給定一個函數(shù)旗闽,在處的微分定義為: 圖上的解釋是在處的斜率:
前向、后向以及中心差分法是最簡單的有限差分法:
前向差分:
后向差分:
中心差分:
例:蜜另,計算在處的微分
(a)
真實值:,
前向差分:
后向差分:
中心差分:
(b)
前向差分:
后向差分:
中心差分:
可以看到中心差分最為準(zhǔn)確适室,且兩點間距變小時,差分計算會更為準(zhǔn)確举瑰。
MATLAB實現(xiàn):
function dx = derivative(x,y)
% derivative calculates the derivative of a function that is given by a set
% of points. The derivative at the first and last points are calculated by
% using the forward and backward finite difference formula, respectively.
% The derivative at all the other points is calculated by the central
% finite difference formula.
% Input variables:
% x A vector with the coordinates x of the data points.
% y A vector with the coordinates y of the data points.
% Output variable:
% dx A vector with the value of the derivative at each point.
n = length(x);
dx(1)=(y(2)-y(1))/(x(2)-x(1));
for i=2:n-1
dx(i)=(y(i+1)-y(i-1))/(x(i+1)-x(i-1));
end
dx(n)=(y(n)-y(n-1))/(x(n)-x(n-1));
2. 泰勒公式有限差分法
2.1 一階微分(兩點法)
前向展開:
在點處的值可以使用如下泰勒公式來逼近: 其中,是與之間的數(shù)捣辆。求解該公式,有: 等同于之前的前向差分汽畴,具有一階準(zhǔn)確度后向展開:
在點處的值可以使用如下泰勒公式來逼近: 其中,是與之間的數(shù)。求解該公式忍些,有: 等同于之前的后向差分坎怪,具有一階準(zhǔn)確度中心展開(假設(shè)間距相同)
結(jié)合上述兩種展開,可以得到: 因此有 等同于之前的中心差分搅窿,可以看到,具有二階準(zhǔn)確度
2.2 一階微分(三點法)
分別寫出四點的泰勒展開:
可以看到: 進一步得: 這是一階微分的三點前向公式男应,具有二階準(zhǔn)確度痹仙,類似地,可以得到如下具有二階準(zhǔn)確度的三點后向公式:
2.3 二階微分(三點法)
注意:
前面兩式相加殉了,得 可得 此即為三點中心差分公式开仰,具有二階準(zhǔn)確度。類似地薪铜,推導(dǎo)可得如下五點中心差分公式: 具有四階準(zhǔn)確度众弓。
另一方面: 可得 此即為三點前向差分公式,具有一階準(zhǔn)確度隔箍,類似可得如下具有一階準(zhǔn)確度三點后向差分公式:
MATLAB實現(xiàn):
function [yd,ydd] = FirstScndDerivPt(x,y)
n = length(x);
h = x(2)-x(1);
% 首個數(shù)據(jù)谓娃,一階導(dǎo)數(shù)使用三點前向差分,二階導(dǎo)數(shù)使用4點前向差分
yd(1) = (-3*y(1)+4*y(2)-y(3))/(2*h);
ydd(1) = (2*y(1)-5*y(2)+4*y(3)-y(4))/(h^2);
% 中間數(shù)據(jù),一階導(dǎo)數(shù)使用兩點中心差分蜒滩,二階導(dǎo)數(shù)使用三點中心差分
for i=2:n-1
yd(i)=(y(i+1)-y(i-1))/(2*h);
ydd(i)=(y(i-1)-2*y(i)+y(i+1))/(h^2);
end
% 末尾數(shù)據(jù)滨达,一階導(dǎo)數(shù)使用三點后向差分奶稠,二階導(dǎo)數(shù)使用4點后向差分
yd(n) = (y(n-2)-4*y(n-1)+3*y(n))/(2*h);
ydd(n) = (-y(n-3)+4*y(n-2)-5*y(n-1)+2*y(n))/(h^2);
figure
subplot(3,1,1)
plot(x,y)
subplot(3,1,2)
plot(x,yd)
subplot(3,1,3)
plot(x,ydd)
end
3. 拉格朗日多項式求導(dǎo)公式
對點進行拉格朗日多項式插值,有
此時 因此 當(dāng)時捡遍,有 此式與三點前向差分公式一致锌订。
4. 數(shù)值偏微分
對二元函數(shù) ,其在點處的偏微分定義為: 對一階偏微分画株,辆飘,兩點前向公式為: 兩點后向公式為:
兩點中心差分公式: 對二階偏微分,三點中心差分公式為: 對二階偏微分谓传,逐步計算即可:
MATLAB實現(xiàn):
function [dfdx,dfdy] = ParDer(x,y,f)
n = length(x);
m = length(y);
hx = x(2)-x(1);
hy = y(2)-y(1);
% 首位數(shù)據(jù)使用三點前向
for j = 1:m
dfdx(1,j) = (-3*f(1,j)+4*f(2,j)-f(3,j))/(2*hx);
end
for i = 1:n
dfdy(i,1) = (-3*f(i,1)+4*f(i,2)-f(i,3))/(2*hy);
end
% 兩點中心差分
for i = 2:n-1
for j = 1:m
dfdx(i,j) = (f(i+1,j)-f(i-1,j))/(2*hx);
end
end
for j = 2:m-1
for i = 1:n
dfdy(i,j) = (f(i,j+1)-f(i,j-1))/(2*hy);
end
end
% 末尾數(shù)據(jù)使用三點后向
for j = 1:m
dfdx(n,j) = (f(n-2,j)-4*f(n-1,j)+3*f(n,j))/(2*hx);
end
for i = 1:n
dfdy(i,m) = (f(i,m-2)-4*f(i,m-1)+3*f(i,m))/(2*hy);
end
end
5. Richardson外推加速算法
Richardson外推加速算法能夠把兩個低精度的方法組合成一個高精度的計算方法蜈项,假設(shè)是一種數(shù)值微分計算方法,是估計的微分续挟,和是估計誤差紧卒,可以看到,具有二階精度诗祸,如果把間距調(diào)整為,則 其精度仍是二階的贬媒。但是有: 因此肘习, 可以看到,具有四階精度脖含。
舉個例子投蝉,考慮一階微分的兩點中心差分法(二階精度): 縮短間距瘩缆,有 按照Richardson外推加速算法,有 進一步 因此 可以看到着绊,精度提高到了四階归露。
6. 總結(jié)
本節(jié)課主要介紹了一些數(shù)值微分算法斤儿,對于一階微分恐锦,最常用的有兩點前向差分(精度為)一铅、兩點后向差分(精度為)以及兩點中心差分算法(精度為)枚粘,其表達式均可以通過處理泰勒展開式來得到。通過處理泰勒展開式還可以得到一階微分的三點前向差分和三點后向差分算法福也,精度與兩點中心差分一致攀圈。對于二階微分,同樣可以利用泰勒展開赘来,得到三點前向差分、三點后向差分以及三點中心差分算法嗦篱。另一方面幌缝,還可以通過拉格朗日插值公式,得到相應(yīng)的微分計算公式浴栽。這些公式又都可以很容易推廣到多元函數(shù)的數(shù)值微分中去轿偎。最后,對于兩個精度不高的微分算法萝玷,可以通過Richardson外推加速算法得到一個精度更高的算法,在實際問題中具有很廣泛的應(yīng)用球碉。