一.多项式和函数
1.多项式的表示:
多项式:an * x^n + a(n-1) * x^(n-1) + ... + a1 * x + a0
MATLAB中表示为:[an a(n-1) ... a1 a0]
#注意:最后1项一定是a0,第1项是系数不为0的最高次项的系数
#如果某项的系数为0,也不能省略
#实例:
%多项式x^3 - 2 * x - 5
>> p = [1 0 -2 -5];
2.计算多项式的值:
[<y>[,<delta>]] = polyval(<p>,<x>[,<S>,<mu>]):计算多项式在指定位置的值
#参数说明:详情参见官方文档
p:指定多项式(多项式表示方法见上)
x:指定要计算在哪些位置的值(即多项式中的x的值);为num/num array
S:使用polyfit()生成的可选输出结构体S来生成误差估计值
y:返回结果;为num/num array
delta:使用p(x)预测x处的未来观测值时的标准误差估计值
mu:使用polyfit()生成的可选输出mu来中心化和缩放数据
#详情参见官方文档
#如果要在指定该参数的同时不指定S,S的位置应使用[ ]来占位
#实例:
>> p = [3 2 1];
>> x = [5 7 9];
>> y = polyval(p,x)
y = 1×3
86 162 262
3.函数的表示:
<f> = @(<x1>[,<x2>...])<func_expr>:定义函数
#参数说明:
x1,x2...:指定自变量
func_expr:指定函数表达式(其中的自变量应∈(x1,x2...))
f:函数句柄;用于调用函数
#注意:定义函数都是在直角坐标系下进行的,如果要使用极坐标系,需进行如下转换
>> polarfunc = @(theta,r) fun(r.*cos(theta),r.*sin(theta)).*r
@(<x1>,<x2>...)<f>([<x1>,<c1>...]):执行函数
#参数说明:
f:之前定义的函数;为函数句柄
x1,x2...:调用时作为未知数的自变量(即参与运算的自变量)
c1,c2...:调用时作为常数的自变量(即不参与运算的自变量)
#但是传入的不一定是常数
#实例:
>> fun = @(x,c) 1./(x.^3-2*x-c);%定义了2个自变量x,c
>> q = integral(@(x)fun(x,5),0,2)%x传入的是未知数x,c传入的是常数5
q =
-0.4605
二.多项式的微分与积分
1.求多项式的导数:
<k> = polyder(<p>):计算多项式的导数
#即k(x)=d[p(x)]/dx
#参数说明:
p:指定多项式
k:返回结果
<k> = polyder(<a>,<b>):计算多项式的积的导数
#即k(x)=d[a(x)*b(x)]/dx
#参数说明:k同上
a,b:各指定1个多项式
[q,d] = polyder(<a>,<b>):计算多项式的商的导数
即q(x)/d(x)=d[a(x)/b(x)]/dx
#参数说明:
a:指定分子处的多项式
b:指定分母处的多项式
q:结果中分子的部分
d:结果中分母的部分
#实例:
>> p = [3 0 -2 0 1 5];
>> q = polyder(p)
q = 1×5
15 0 -6 0 1
>> a = [1 -2 0 0 11];
>> b = [1 -10 15];
>> q = polyder(a,b)
q = 1×6
6 -60 140 -90 22 -110
>> p = [1 0 -3 0 -1];
>> v = [1 4];
>> [q,d] = polyder(p,v)
q = 1×5
3 16 -3 -24 1
d = 1×3
1 8 16
2.求多项式的不定积分:
<q> = polyint(<p>[,<k>]):计算多项式的不定积分
#参数说明:
p:指定多项式
k:指定求不定积分后的常数项;默认为0
#相当于q中的最后1个元素;即q(x)=polyint(q(x),k)=ployint(p(x))+k
q:返回结果
#实例:
>> p = [3 0 -4 10 -25];
>> q = polyint(p)
q = 1×6
0.6000 0 -1.3333 5.0000 -25.0000 0
>> p = [1 0 -1 0 0 1];
>> v = [1 0 1];
>> k = 3;
>> q = polyint(conv(p,v),k)
q = 1×9
0.1250 0 0 0 -0.2500 0.3333 0 1.0000 3.0000
三.数值微分和积分
1.求差分和近似导数:
<Y> = diff(<X>[,<n>,<dim>]):沿指定维度计算相邻元素间的差分
#参数说明:
X:指定n维数组
如果为长度为m的向量,则返回长度为m-1的向量,Y的元素是X相邻元素间的差分
#即Y=[X(2)-X(1),X(3)-X(2),...,X(m)-X(m-1)]
如果为p×m的矩阵,则返回大小为(p-1)×m的矩阵,其元素是X的行之间的差分
#即Y=[X(2,:)-X(1,:);X(3,:)-X(2,:);...;X(p,:)-X(p-1,:)]
以此类推
n:指定求沿指定维度的n阶差分;默认为1
#在实际操作中,这表示diff(X,2)与diff(diff(X))相同
dim:指定沿哪个维度计算差分;默认为第1个长度>1的维度
#如果要指定该参数,则必须指定参数n
Y:返回结果
#实例:
>> X = [1 1 2 3 5 8 13 21];
>> Y = diff(X)
Y = 1×7
0 1 1 2 3 5 8
>> X = [1 1 1; 5 5 5; 25 25 25];
>> Y = diff(X)
Y = 2×3
4 4 4
20 20 20
>> X = [0 5 15 30 50 75 105];
>> Y = diff(X,2)
Y = 1×5
5 5 5 5 5
>> X = [1 3 5;7 11 13;17 19 23];
>> Y = diff(X,1,2)
Y = 3×2
2 2
4 2
2 4
%使用差分求导数近似值:
>> h = 0.001;
>> X = -pi:h:pi;
>> f = sin(X);
>> Y = diff(f)/h;%计算1阶近似导数;也可以是Y = diff(f)/diff(X)
>> Z = diff(Y)/h;%计算2阶近似导数
>> plot(X(:,1:length(Y)),Y,'r',X,f,'b',X(:,1:length(Z)),Z,'k')%结果见下图
%蓝线对应原始函数sin(),红线对应1阶导数cos(),黑线对应2阶导数-sin()
2.求数值积分
(1)策略:求面积法(Quadrature Method)
#以下方法分割的每个条段都等宽
1.中点策略(Midpoint Rule):布喇格-威廉姆近似(Zeroth-order Approximation)
用矩形的面积近似曲边梯形的面积(见下图1)
2.梯形策略(Trapezoid Rule):一阶近似(First-order Approximation)
用梯形的面积近似曲边梯形的面积(见下图2)
3.1/3辛普森策略(1/3 Simpson's Rule):二阶近似(Second-order Approximation)
用h * (f0 + 4 * f1 + f2)/3某一小段上的积分近似(见下图3)
3种方法比较见下图4
(2)使用内置函数求数值积分:
<Q> = trapz([<X>,]<Y>[,<dim>]):基于梯形策略计算数值积分
#参数说明:
Y:计算Y的近似积分;为arrar/matrix/多维数组
如果为array,则计算Y的近似积分(见下图)
此时Y中的元素代表函数的一系列值,或各直边梯形2侧的高
如果为matrix,则默认对Y列计算每列的积分
如果为多维数组,则默认对其长度>1的第1个维度求积分
#该维度的长度变为1,其他维度的长度不变
X:指定Y中各元素对应的x坐标/梯形(在x轴上)的宽度;分别为array/num
默认为1,表示梯形(在x轴上)的宽度为1
如果为array,则length(X)等于Y在第1个长度>1的维度上的长度
如果为num,则trapz(X,Y) = X * trapz(Y)
dim:指定沿哪个维度求积分;
#例如:如果Y为matrix,则trapz(X,Y,2)对Y的每行求积分
Q:返回结果
#实例:
>> h = 0.05;
>> x = 0:h:2;
>> y = 4 * x.^3
>> s = h * trapz(y)%相当于h * sum((y(1:end-1) + y(2:end)) / 2)
s =
16.0100
>> X = 0:pi/100:pi;
>> Y = sin(X);
>> Q = trapz(X,Y)
Q =
1.9998
<q> = integral(<fun>,<xmin>,<xmax>[,"<Name>",<Value>]):使用全局自适应积分策略和默认误差容限求数值积分
#这里的数值积分是包括瑕积分和无穷积分在内的广义积分(∞的表示为Inf)
#参数说明:
func:指定被积函数;为函数句柄
xmin:指定积分下限
xmax:指定积分上限
q:返回计算结果
Name,Value:指定其他参数
如指定"WayPoints",为要使用的积分器指示特定点;为实/复数向量(见下例5)
指定"ArrayValued"为true以便计算数组值/向量值函数(见下例6)
"RelTol"和"AbsTol"分别指定相对误差和绝对误差
"Method"指定方法???(什么方法)
#实例:
>> fun = @(x) exp(-x.^2).*log(x).^2;%定义函数
>> q = integral(fun,0,Inf)
q =
1.9475
#########################################################
>> fun = @(x,c) 1./(x.^3-2*x-c);
>> q = integral(@(x)fun(x,5),0,2)
q =
-0.4605
#########################################################
>> fun = @(x)log(x);
>> format long
>> q1 = integral(fun,0,1)
q1 =
-1.000000010959678
#########################################################
%再次计算积分:使用12位小数精度;将RelTol设为0,以便integral()仅尝试满足绝对误差容限
>> q2 = integral(fun,0,1,'RelTol',0,'AbsTol',1e-12)
>> q2 =
-1.000000000000010
#########################################################
>> fun = @(z) 1./(2*z-1);
%通过指定路点,在复平面中从0至1+1i到1-1i至0的三角形路径上计算积分
>> q = integral(fun,0,0,'Waypoints',[1+1i,1-1i])
q =
-0.0000 - 3.1416i
#########################################################
>> fun = @(x)sin((1:5)*x);
%指定"ArrayValued"为true以便计算数组值/向量值函数的积分
q = integral(fun,0,1,'ArrayValued',true)
q = 1×5
0.4597 0.7081 0.6633 0.4134 0.1433
#########################################################
>> fun = @(x)x.^5.*exp(-x).*sin(x);
>> format long
q = integral(fun,0,Inf,'RelTol',1e-8,'AbsTol',1e-13)
q =
-14.999999999998360
(3)自定义计算数值积分:
- 使用布喇格-威廉姆近似计算定积分的近似值:
使用sum()进行求和,从而得到近似的积分结果
#实例:计算4 * x^3在[0,2]上的定积分
>> h = 0.05;
>> x = 0:h:2;
>> midpoint = (x(1:end - 1) + x(2:end)) ./ 2;
>> y = 4 * midpoint.^3;
>> s = sum(h * y)
s =
15.9950
- 使用二阶近似计算定积分的近似值:
同样使用sum()进行求和,得到定积分的近似值
#实例:
>> h = 0.05;
>> x = 0:h:2;
>> y = 4 * x.^3
>> s = h * (y(1) + 2 * sum(y(3:2:end-2)) + 4 * sum(y(2:2:end)) + y(end)) / 3
s =
16
3.求重积分
(1)计算2重数值积分:
<q> = integral2(<func>,<xmin>,<xmax>,<ymin>,<ymax>[,"<Name>",<Value>])
#参数说明:q/func/Name/Value同integral()
xmin,xmax,ymin,ymax:指定第1/2个变量的积分下限和积分上限
#实例:
%将三角形区域与奇异性在边界处集成:
>> fun = @(x,y) 1./( sqrt(x + y) .* (1 + x + y).^2 )
fun = function_handle with value:
@(x,y)1./(sqrt(x+y).*(1+x+y).^2)
>> ymax = @(x) 1 - x;
>> q = integral2(fun,0,1,0,ymax)
q =
0.2854
#########################################################
%在极坐标中计算2重积分:
>> fun = @(x,y) 1./( sqrt(x + y) .* (1 + x + y).^2 );
>> polarfun = @(theta,r) fun(r.*cos(theta),r.*sin(theta)).*r;
>> rmax = @(theta) 1./(sin(theta) + cos(theta));
>> q = integral2(polarfun,0,pi/2,0,rmax)
q =
0.2854
#########################################################
%使用特定方法和误差容限计算参数化函数的2重积分:
>> a = 3;
>> b = 5;
>> fun = @(x,y) a*x.^2 + b*y.^2;
>> format long
>> q = integral2(fun,0,5,-5,0,'Method','iterated',...
'AbsTol',0,'RelTol',1e-10)
q =
1.666666666666667e+03
(2)计算3重数值积分:
<q> = integral3(<fun>,<xmin>,<xmax>,<ymin>,<ymax>,<zmin>,<zmax>[,"<Name>",<Value>])
#参数说明:q/func/Name/Value同integral()
xim,xmax,ymin,ymax,zmin,zmax:分别指定第1/2/3个参数的积分下限和积分上限
#实例:
>> fun = @(x,y,z) y.*sin(x)+z.*cos(x)
fun = function_handle with value:
@(x,y,z)y.*sin(x)+z.*cos(x)
>> q = integral3(fun,0,pi,0,1,-1,1)
q =
2.0000
#########################################################
%在笛卡尔坐标中对单位球面计算积分:
>> fun = @(x,y,z) x.*cos(y) + x.^2.*cos(z)
fun = function_handle with value:
@(x,y,z)x.*cos(y)+x.^2.*cos(z)
>> xmin = -1;
>> xmax = 1;
>> ymin = @(x)-sqrt(1 - x.^2);
>> ymax = @(x) sqrt(1 - x.^2);
>> zmin = @(x,y)-sqrt(1 - x.^2 - y.^2);
>> zmax = @(x,y) sqrt(1 - x.^2 - y.^2);
>> q = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax,'Method','tiled')
q =
0.7796
#########################################################
%计算参数化函数的错误3重积分:
>> a = 2;
>> f = @(x,y,z) 10./(x.^2 + y.^2 + z.^2 + a);
>> format long
>> q1 = integral3(f,-Inf,0,-100,0,-100,0)
q1 =
2.734244598320928e+03
>> q2 = integral3(f,-Inf,0,-100,0,-100,0,'AbsTol', 0,'RelTol',1e-9)
q2 =
2.734244599944285e+03
(3)计算4重及以上的数值积分:
依靠嵌套使用上述3个函数:integral(),integral2(),integral3()
#实例:
>> f = @(r,theta,phi,xi) r.^3 .* sin(theta).^2 .* sin(phi);
>> Q = @(r) integral3(@(theta,phi,xi) f(r,theta,phi,xi),0,pi,0,pi,0,2*pi);
>> I = integral(Q,0,2,'ArrayValued',true)
I =
78.9568
>> I_exact = pi^2*2^4/(2*gamma(2))
I_exact =
78.9568
四.符号微分与积分
1.微分:
求符号化函数的微分:Y = diff(X[,n])
#参数说明:
X:指定符号化的函数
n:指定求n阶微分;默认为1
Y:返回结果
#实例:
>> x=sym("x");
>> diff(x^3)
ans =
3*x^2
>> diff(x^3,2)
ans =
6*x
2.积分
(1)不定积分:
求符号化的不定积分:F = int(expr[,var,Name,Value])
#也可以求多重不定积分
#参数说明:
expr:指定函数
var:指定对哪个变量积分
F:返回结果
#实例:
>> x=sym("x");
>> y=sym("y");
>> int(x^3)
ans =
x^4/4
>> int(x+y^3)
ans =
(x*(2*y^3 + x))/2
>> int(x+y^3,x)
ans =
(x*(2*y^3 + x))/2
>> int(x+y^3,y)
ans =
y^4/4 + x*y
>> int(x+y^3,[x,y])
ans =
-((x - y)*(2*y^3 + y + x))/2
(2)定积分:
求符号化的定积分:F = int(expr[,var],a,b[,Name,Value])
#参数说明:
a,b:指定积分下/上限
#实例:
>> int(x+y^3,y,1,3)
ans =
2*x + 20
>> int(x^3-2,1,3)
ans =
16