MATLAB中的微積分運算(數值&符號)


 

顯然這個函數是單詞differential(微分)的簡寫,用於計算微分。實際上准確來說計算的是差商。

如果輸入一個長度為n的一維向量,則該函數將會返回長度為n-1的向量,向量的值是原向量相鄰元素的差,於是可以計算一階導數的有限差分近似。
 

(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-x23的不定積分。

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函數,從而保證以更高的效率求出所需的定積分值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM