上述提及的後向差分式
,在
MATLAB 有對應的diff
函數來計算二相臨點的差值,
它的語法為
diff(x),其中
x代表一組離散點
。假設有x,
y(x)的數據為
x=[1 3 5 7 9], y=[1 4 9 16 25]
則 diff(x)=[2 2 2 2], diff(y)=[3 5 7 9],注意二者皆以後向差分計算且數據點只剩 4 個而不是5個。而
的
數值微分則為
dy=diff(y)./diff(x)。
因此要計算下列多項式在 [-4, 5] 區間的微分
可依以下方式求解
>> x=linspace(-4,5); % 產生100個x的離散點
>> p=[1 -3 -11 27 10 -24];
>> f=polyval(p,x);
>> plot(x,f) % 將多項式函數繪圖
>> title('Fifth-deg. equation')
>> dfb=diff(f)./diff(x); % 注意要分別計算diff(f)和diff(x)
>> xd=x(2:length(x)); % 注意只有99個df值,而且是對應x2,x3,...,x100的點
>> plot(xd,dfb ) % 將多項式的微分項繪圖
>> title('Derivative
of fifth-deg. equation')
假設我們要找出上述多項式的局部極值(local critical value),可以利用局部極值所在點的微分為零,所以在 這個點的左側及右側的二點微分值一定是一正一負,因此這二點的微分值相乘為負值,可針對此性質找 出局部極值所在點。以原多項式的數據示範如下:
>> product=dfb(1:length(dfb)-1).*dfb(2:length(dfb)); % 注意二相臨點值相乘的寫法
>> crit=xd(find(product<0))
% 注意用到find指令
若上述多項式以中央差分方式計算其函數微分項,就不能以diff計算,而須自行計算如下:
>> num=f(3:length(f))-f(1:length(f)-2); % 注意中央差分是 f(k+1)-f(k-1)
>> deno=x(3:length(f))-x(1:length(f)-2); % 注意中央差分是 x(k+1)-x(k-1)
>> df_c=num./deno;
>> xd=x(2:length(x)-1); % xd的點數只有98個
>> plot(xd,df_c)
>> title('Derivative
of fifth-deg. polynomial')
以下的例子是針對數據組為離散型態,要注意的是原數據所代表的函數分佈並無明顯的折角,但是它的 一階微分經數值微分計算後的微分函數分佈卻有極大的曲折變化。
>> x=0:0.1:1;
>> y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
>> plot(x,y,'o',x,y)
>> title('y(x) data plot')
>> ylabel('y(x)'), xlabel('x')
>> dy=diff(y)./diff(x);
>> xd=x(1:length(x)-1);
>> plot(xd,dy)
>> title('Approximate derivative using diff')
>> ylabel('dy/dx'),
xlabel('x')
