MATLAB中的微积分运算(数值&符号)

时间:2024-03-13 20:40:57

 

显然这个函数是单词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函数,从而保证以更高的效率求出所需的定积分值。