目录
12.1 数列
12.1.1 数列求和
1. 累计求和函数sum()
2. 忽略NaN累计求和函数 nansum()
3. 求此元素位置之前的元素和函数cumsum()
4. 求梯形累计和函数cumtrapz()
12.1.2 数列求积
1. 元素连续相乘函数 prod()
2. 求累计积函数 cumprod()
3. 阶乘函数 f=factorial(n) n!,n为非负整数值
4. 伽马函数 gamma()
12.2 极限和导数
12.2.1 极限
12.2.2 导数
12.3 级数求和
12.3.1 有限项级数求和
12.3.2 无穷级数求和
参考资料:
12.1 数列
12.1.1 数列求和
1. 累计求和函数sum()
调用格式 | 说明 |
S=sum(A) | (1)A为向量,返回所有元素和,结果是一个数值; (2)A为矩阵,返回每一列所有元素和,结果为数值个数等于列数的行向量; (3)A为n维阵列,相当于n个矩阵,则返回n个矩阵累和(按列) |
S=sum(A,dim) | (1)对于向量求和运算:dim=1,不求和,返回原数列;dim=2,求和; (2)对于矩阵求和运算:dim=1,对列求和,结果组成行向量;dim=2,对行求和,结果则称列向量 |
S=sum(A,vecdim) | 根据向量vecdim中指定的维度对A的元素进行求和 |
S=sum(A,’all’) | 计算A的所有元素的值,包括行列与维度的和,结果是单个数值 |
S=sum(…,outtype) | 可以设置特殊格式的累计和值,输出类型outtype包含’defalult’、’double’、’native’ |
S=sum(…,nanflag) | 若向量或矩阵中包含NaN,在此格式下nanflag可以设置是否计算NaN,nanflag参数设置为’includenan’表示计算,设置为’omitnan’表示忽略 |
2. 忽略NaN累计求和函数 nansum()
调用格式 | 说明 |
S=nansum(A) | 累计和中不包括NaN |
… | … |
nansum(A)与sum(A,omitnan)可以通用,前者步骤更简洁
3. 求此元素位置之前的元素和函数cumsum()
函数cumsum()求解的是新定义的累计和,即每个位置的新元素值不包括当前项的元素之和。
略,详见MA1.269-270
4. 求梯形累计和函数cumtrapz()
略,详见MA1.270-273
12.1.2 数列求积
1. 元素连续相乘函数 prod()
调用格式 | 说明 |
B=prod(A) | (1)A为向量,返回所有元素和,结果是一个数值; (2)A为矩阵,返回每一列所有元素积,结果为数值个数等于列数的行向量; |
B=prod(A,dim) | (1)对于向量求和运算:dim=1,不求积,返回原数列;dim=2,求积; (2)对于矩阵求和运算:dim=1,对列求积,结果组成行向量;dim=2,对行求积,结果则称列向量 |
B=prod(A,vecdim) | 根据向量vecdim中指定的维度对A的元素进行求积,其中不包括NaN |
B=prod(A,’all’) | 计算A的所有元素的乘积 |
B=prod(…, type) | 可以设置特殊格式的累计和值,输出类型outtype包含’defalult’、’double’、’native’ |
2. 求累计积函数 cumprod()
略,详见MA1.274
3. 阶乘函数 f=factorial(n) n!,n为非负整数值
4. 伽马函数 gamma()
伽马函数(Gamma Function)也叫欧拉第二积分,是阶乘函数在实数与复数上扩展的一类函数,一般情况下,阶乘是定义在正整数和0(大于等于0)的范围里的,小数没有阶乘,这里将函数gamma()定义为非整数的阶乘,作为阶乘的延拓,是定义在复数范围内的亚纯函数,通常写作Γ(x)
在实数域上伽马函数定义为
在复数域上伽马函数定义为
同时,gamma()也适用于正整数,factorial()同用法
补充:不完全伽马函数gammainc(),其中
12.2 极限和导数
在工程计算中,经常会研究某一函数随自变量的变化趋势与相应的变化率,也就是要研究函数的极限和导数问题。
12.2.1 极限
极限是数学分析最基本的概念和出发点,在工程实际中,其计算往往比较繁琐。在MATLAB中,运用limit命令可以解决。调用格式:
调用格式 | 说明 |
limit(f,x,a) 或 limit(f,a) | 求解 |
limit(f) | 求解 |
limit(f,x,a,’right’) | 求解 |
limit(f,x,a,’left’) | 求解 |
示例1:
>> clear
>> syms x;
>> f=sin(x)/x;
>> limit(f)
ans =1
示例2:
>> syms n
>> limit((1+1/n)^n,inf)
ans =exp(1)
示例3:
>> syms x
>> limit(log(1+x)/x,x,0,'right')
ans = 1
示例4:计算,注意此处是二元函数的极限
>> syms x y %定义符号变量x y
>> f=(exp(x)+exp(y))/(cos(x)-sin(y)); %定义符号表达式
>> limit(limit(f,x,0),y,0) %先求x趋近于0时的符号表达式f的极限值,再求y趋近于0的极限值
ans =2
12.2.2 导数
导数是数学分析的基础内容之一,在工程运用中用来描述各种各样的变化率。可以根据导数的定义,利用limit命令求解,同时MATLAB也提供了专门的函数求导命令diff。调用格式:
调用格式 | 说明 |
Y=diff(X) | 计算沿大小不等于1的第一个数组维度的X相邻元素之间的差分 |
Y=diff(X,n) | 通过递归应用diff(X)运算n次求n阶导数 |
Y=diff(X,n,dim) | 求沿dim指定的维度计算的第n个差分 |
示例1:
>> clear
>> syms x
>> f=2^x+x^(1/2)*log(x);
>> diff(f) %求表达式f的一阶导数
ans = log(x)/(2*x^(1/2)) + 2^x*log(2) + 1/x^(1/2)
示例2:
>> syms x
>> f=(1-cos(x))/(3*x^2);
>> diff(f,1) %求表达式f的一阶导数
ans = sin(x)/(3*x^2) + (2*(cos(x) - 1))/(3*x^3)
>> diff(f,2) %求表达式f的二阶导数
ans = cos(x)/(3*x^2) - (4*sin(x))/(3*x^3) - (2*(cos(x) - 1))/x^4
>> diff(f,3) %求表达式f的三阶导数
ans = (6*sin(x))/x^4 - sin(x)/(3*x^2) - (2*cos(x))/x^3 + (8*(cos(x) - 1))/x^5
示例3:
>> syms x
>> limit(log(1+x)/x,x,0,'right')
ans = 1
示例4: 计算对x、y的1阶、2阶偏导数
>>clear
>>syms x y %定义符号变量x y
>>f=log(exp(2*(x+y^2))+(x^2+y)+sin(1+x^2)); %定义符号表达式
>>fx=diff(f,x) %计算f对x的1阶导数
fx =(2*x + 2*exp(2*y^2 + 2*x) + 2*x*cos(x^2 + 1))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)
>>fy=diff(f,y) %计算f对y的一阶导数
fy =(4*y*exp(2*y^2 + 2*x) + 1)/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)
>>fxy=diff(fx,y) %对x求导后,再对y求导
fxy =(8*y*exp(2*y^2 + 2*x))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2) - ((4*y*exp(2*y^2 + 2*x) + 1)*(2*x + 2*exp(2*y^2 + 2*x) + 2*x*cos(x^2 + 1)))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)^2
>>fyx=diff(fy,x) %对y求导后,再对x求导
fyx =(8*y*exp(2*y^2 + 2*x))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2) - ((4*y*exp(2*y^2 + 2*x) + 1)*(2*x + 2*exp(2*y^2 + 2*x) + 2*x*cos(x^2 + 1)))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)^2
>>fxx=diff(fx,x) %再次对x求导(等价于求二阶导)
fxx =(2*cos(x^2 + 1) + 4*exp(2*y^2 + 2*x) - 4*x^2*sin(x^2 + 1) + 2)/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2) - (2*x + 2*exp(2*y^2 + 2*x) + 2*x*cos(x^2 + 1))^2/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)^2
>>fyy=diff(fy,y) %再次对y求导(等价于求二阶导)
fyy =(4*exp(2*y^2 + 2*x) + 16*y^2*exp(2*y^2 + 2*x))/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2) - (4*y*exp(2*y^2 + 2*x) + 1)^2/(y + sin(x^2 + 1) + exp(2*y^2 + 2*x) + x^2)^2
>>fxx=diff(f,x,2) %略
>>fyy=diff(f,y,2) %略
12.3 级数求和
级数是数学分析的重要内容,无论对于数学理论本身还是在科学技术的应用中都是一个有力的工具。
12.3.1 有限项级数求和
求级数命令symsum,调用格式:
调用格式 | 说明 |
F=symsum(f,k) | 返回级数f关于指数k的有限项和 |
F=symsum(f,k,a,b) | 返回级数f关于指数从a到b的有限项和 |
示例1:
>> syms a b n %定义符号变量
>> s=a^n+b*n; %定义符号表达式
>> symsyn(s,n,0,n) %计算级数关于指数n从0到n共n+1项的有限项和
ans =piecewise(a == 1, n + (b*n)/2 + (b*n^2)/2 + 1, a ~= 1, -(b*n + b*n^2 - 2*a*a^n - a*b*n - a*b*n^2 + 2)/(2*(a - 1)))
示例2:
>> syms n x
>> s=sin(n*x);
>> symsum(s,n,0,n)
ans =piecewise(in(x/(2*pi), 'integer'), 0, ~in(x/(2*pi), 'integer'), (exp(-x*(n + 1)*1i)*(exp(x*(n + 1)*1i) - exp(x*(n + 1)*2i) - exp(x*1i) + exp(x*(n + 1)*1i)*exp(x*1i))*1i)/(2*(exp(x*1i) - 1)))
示例3:计算级数的前n+1项(n从0开始),并求前11项的和
>>syms n
>>s=2*sin(2*n)+4*cos(4*n)+2^n;
>>sum_n=symsum(s)
sum_n =(exp(-2i)^n*1i)/(exp(-2i) - 1) - (exp(2i)^n*1i)/(exp(2i) - 1) + (2*exp(-4i)^n)/(exp(-4i) - 1) + (2*exp(4i)^n)/(exp(4i) - 1) + 2^n
>>sum10=symsum(s,0,10)
sum10 =4*cos(4) + 4*cos(8) + 4*cos(12) + 4*cos(16) + 4*cos(20) + 4*cos(24) + 4*cos(28) + 4*cos(32) + 4*cos(36) + 4*cos(40) + 2*sin(2) + 2*sin(4) + 2*sin(6) + 2*sin(8) + 2*sin(10) + 2*sin(12) + 2*sin(14) + 2*sin(16) + 2*sin(18) + 2*sin(20) + 2051
>> vpa(sum10) %控制级数前1项和的精度
ans =2048.2771219312785147716264587939
注:若不知道级数s中的变量是哪个,采用symvar命令:C=symvar(expr),搜索表达式expr,查找除i、j、pi、inf、nan、eps和公共函数之外的标识符。这些标识符是表达式中变量的名称。
12.3.2 无穷级数求和
MATLAB中的symsum命令该可以求无穷级数,此时只需将命令参数中的求和区间改为无穷即可。示例如下:
>> syms n
>> s1=1/n;
>> v1=symsum(s1,n,1,inf) %计算级数s1关于指数n从1到+∞的和
v1 =Inf 实际上,该级数发散
>> s2=1/n^3;
>> v2=symsum(s2,n,1,inf)
v2 =zeta(3)
>> vpa(v2) %控制v2的精度
ans =1.2020569031595942853997381615114
zeta(3)表示zeta函数在3处的值,其中函数zeta()的定义是
MATLAB并不是可以计算出所有的级数求和结果,求不出时答案会给出求和形式:
计算级数
>> syms n
>> s1=(-1)^n*sin(n)/(n^2+1);
>> v1=symsum(s1,n,1,inf)
v1 = symsum(((-1)^n*sin(n))/(n^2 + 1), n, 1, Inf)
参考资料:
[1] 天工在线. MATLAB2020从入门到精通·实战案例版[M]. 北京: 中国水利水电出版社, 2020.