顯然這個函數是單詞differential(微分)的簡寫,用於計算微分。實際上准確來說計算的是差商。
(1)符號微分
1.常用的微分函數
函數:diff(f) 求表達式f對默認自變量的一次微分值
diff(f,x) 求表達式f對自變量x的一次積分值
diff(f,n) 求表達式f對默認自變量的n次微分值
diff(f,t,n)求表達式f對自變量t的n次微分值
>> x=1:10 x = 1 2 3 4 5 6 7 8 9 10 >> diff(x) ans = 1 1 1 1 1 1 1 1 1
例1:求矩陣中各元素的導數
求矩陣[1/(1+a) (b+x)/cos(x)
1/(x*y) exp(x^2)]
對x的微分,可以輸入以下命令
A = sym('[1/(1+a),(b+x)/cos(x);1,exp(x^2)]'); B = diff(A,'x')
可得到如下結果:
例2:求偏導數
求的偏導數。
syms x y; f = x*exp(y)/y^2; fdx = diff(f,x) fdy = diff(f,y)
可得到如下結果:
例3:求復合函數的導數
求的導數
sym('x'); y = 'x*f(x^2)' y1 = diff(y,'x')
得到結果如下:
例4:求參數方程的導數
對參數方程求導
syms a b t f1 = a*cos(t); f2 = b*sin(t); A = diff(f2)/diff(f1) %此處代入了參數方程的求導公式 B = diff(f1)*diff(f2,2)-diff(f1,2)*diff(f2)/diff(f1)^3 %求二階導數
可得到如下結果:
例5:求隱函數的導數
求的一階導數
syms x y p = 'x*y(x)-exp(x+y(x))' %隱函數可進行整體表示 %注意y(x)這種寫法,它代表了y是關於x的函數 p1 = diff(p,x)
可得到如下結果:
2.符號積分
1符號函數的不定積分
函數:int
功能:求取函數的不定積分
語法:
int(f)
int(f,x)
說明:第一個是求函數f對默認自變量的積分值;第二個是求自變量f對對自變量t的不定積分值。
例:分別求函數f(x)=(3-x2)3、的不定積分。
x = sym('x');
%函數的輸入 f1 = (3-x^2)^3; f2 = sqrt(x^3 + x^4);
%對函數進行積分 intf1 = int(f1) intf2 = int(f2)
可得結果如下:
2符號函數的定積分
函數:int
功能:求取函數的定積分
語法:
int(f,a,b)
int(f,x,a,b)
說明:第一個是求表達式f對默認自變量的定積分值,積分區間為
[a,b];第二個是求表達式f對自變量x的定積分值,積分區間為[a,b]。
例:分別求、
、
、
的定積分。
syms x t %輸入函數方程式 f1 = abs(1-x); f2 = 1/(1+x^2); f3 = 4*t*x; f4 = x^3/(x-1)^100; %求取函數積分 intf1 = int(f1,1,2) intf2 = int(f2,-inf,+inf) intf3 = int(f3,2,sin(t)) intf4 = int(f4,2,3)
可得到如下結果:
(2)數值微分
在MATLAB中,沒有直接提供求數值導數的函數,只有計算向前差分的函數diff。
函數:diff
功能:求取數值微分
語法:
DX = diff(X)
DX = diff(X,n)
DX = diff(X,n,dim)
說明:第一個計算向量X的向前差分,即DX(i) = X(i+1)-X(i),i=1,2,...,n-1。第二個是計算X的n階向前差分。例如,diff(X,2)=diff(diff(X))。第三個計算矩陣A的n階差分,當dim=1或缺省狀態時,按行計算差分;dim=2,按列計算差分。
例:設x由[0,2π]間均勻分布的10個點組成,求sinx的1到3階差分。
x = linspace(0,2*pi,10);
y = sin(x);
Dy = diff(y)
Dy2 = diff(y,2)
Dy3 = diff(y,3)
plot(x,y,'B');hold on
plot(Dy,'Y');plot(Dy2,'G');plot(Dy3,'R');
title('sinx的1到3階差分')
xlabel('x');ylabel('y')
可得到結果如下
圖形如下:
注:二維圖形常用設置選項
例:求函數的數值微分,並畫出函數圖比較
x = 0:0.01:2 %數值微分&積分需要先確定數值的范圍,這一點與符號微分&積分有所不同。 f = x.^2.*cos(x)./(3*x+2) Df = diff(f) plot(x,f,'r') hold on y = x(1:200); plot(y,Df,'b') legend('函數圖','微分圖')
可得到如圖所示圖線
數值積分
求解定積分的數值方法多種多樣,如簡單的梯形法、辛普生(Simpson)法、牛頓-科特斯(Newton-Cotes)法等都是經常采用的方法。他們的基本思想都是將整個積分區間[a,b]分成n個子區間[xi,xi+1],i = 1,2,…,n,其中x1=a,xn+1=b。這樣求定積分問題就變成了求和問題。
1、變步長辛普森法
基於變步長辛普森法,MATLAB給出了quad函數來求定積分。
函數:quad
功能:求取基於變步長辛普森法的數值定積分。
語法:[I,n]=quad('fname',a,b,tol,trace)
說明:fname是被積函數名(需要新建一個函數)。a和b分別是定積分的上限和下限。tol用來控制積分精度,缺省時取tol = 10-6,。trace控制是否展現積分過程,取非0為展現積分過程,取0則不展現,缺省時trace = 0.返回參數I即定積分值,n為被積函數的調用次數。
例:用變步長辛普森法計算函數f(x)=e-0.2xsin(x+π/3)在區間[0.3π]的定積分
首先建立被積函數文件fesin.m
function f = fesin(x) f = exp(-0.2*x).*sin(x+pi/3);
然后調用數值積分函數quad來求定積分
[S,n] = quad('f',0,3*pi)
2、牛頓-科斯特法
在MATLAB中,使用Newton-Cotes來求取定積分函數為quadl。
函數:quadl
功能:基於Newton-Cotes法來求數值定積分
語法:[I,n] = quadl('fname',a,b,lol,trace)
說明:參數的含義和quad函數相似,只是tol的缺省值取10-6。該函數可以更精確地求出定積分的值,且一般情況下函數調用的步數明顯小於quad函數,從而保證以更高的效率求出所需的定積分值。