180 likes | 345 Views
MATLAB 数值计算. 矩阵和向量及其数值运算 多项式的运算 求函数的极值和零点. . 矩阵和向量及其运算. 矩阵与向量的输入. MATLAB 的基本数据单元是无需指定维数的矩阵 , 数量可看成 1×1 矩阵 ,n 维行向量或列向量看做 1×n 或 n×1 矩阵. >>A=[1 2 3 4 5 6 7 8 9]. >>clear;A=[1,2,3;4,5,6;7,8,9]. A= 1 2 3 4 5 6 7 8 9. A=
E N D
MATLAB数值计算 矩阵和向量及其数值运算 多项式的运算 求函数的极值和零点
矩阵和向量及其运算 • 矩阵与向量的输入 MATLAB的基本数据单元是无需指定维数的矩阵,数量可看成1×1矩阵,n维行向量或列向量看做1×n或n×1矩阵. >>A=[1 2 3 4 5 6 7 8 9] >>clear;A=[1,2,3;4,5,6;7,8,9] A= 1 2 3 4 5 6 7 8 9 A= 1 2 3 4 5 6 7 8 9 >>clear;B=[0 1 2] B= 0 1 2 输入矩阵元素时,同行元素间用空格或逗号分隔,不同行间用分号或回车分隔.
n=length(A):取出矩阵A的行数和列数的最大值. [m,n]=size(A):取出矩阵A的行数m和列数n. • 向量的快捷生成 • 利用冒号”:”生成等差数列 ①a=i:j初值:终值 如果i<j,则生成向量a=[i,i+1,…,j]; 如果i>j,则生成空向量. ②a=i:k:j初值:步长:终值 如果i<j且k>0,或者i>j且k<0,则生成步长为k的向量a=[i,i+1,…,j]; 如果i<j且k<0,或者i>j,且k>0,则生成空向量. 例1.利用冒号生成等差数列. >>X=1:5%初值:终值 X= 12345 >>Y=0:2:10%初值:步长:终值 Y= 0246810
利用linspace函数生成向量 ①a=linspace(i,j). 生成有100个元素的行向量,在i,j,之间等分分布. ②a=linspace(i,j,n). 生成有n个元素的行向量,在i,j,之间等分分布. • 利用logspace函数生成向量 ①a=logspace(i,j). 生成有50个元素的对数等分行向量,第一个元素是10i,最后一个元素是10j. ②a=logspace(i,j,n). 生成有n个元素的对数等分行向量,第一个元素是10i,最后一个元素是10j. ③a=logspace(i,pi). 生成有50个元素的对数等分行向量,第一个元素是10i,最后一个元素是pi.
例2.利用linspace和logspace生成向量示例. >>x1=linspace(1.2,5.8,4) x1= 1.2000 2.7333 4.2667 5.8000 >>x2=logspace(1.0,2.9,5) x2= 10.0000 29.8538 89.1251 266.0725 794.3282 • 矩阵的快捷生成 • 用函数建立矩阵 用于建立矩阵的函数,常见的有: trace(A):矩阵的迹 zeros(m,n):m行n列零矩阵 ones(m,n):m行n列元素全为1的矩阵 eye(n):n阶单位矩阵 d=eig(A),[v,d]=eig(A):特征值与特征向量 rand(m,n):m行n列均匀分布随机数矩阵 randn(m,n):m行n列正态分布随机数矩阵 det(A):行列式计算 AT:转置.若是复阵,则为共轭转置 inv(A):矩阵的逆 orth(A):正交化 poly(A):特征多项式 rank(A):矩阵的秩
例3.设 ,试生成矩阵A-1,AT,与A同阶的单位矩阵. 解 所用MATLAB命令及运行结果为 >>A=[2 1 1;3 1 2;1 -1 0]; >>inv(A) ans= 1.0000 -0.5000 0.5000 1.0000 -0.5000 -0.5000 -2.0000 1.5000 -0.5000 >>eye(length(A)) ans = 2 3 1 1 1 -1 1 2 0 >>A′ ans = 2 3 1 1 1 -1 1 2 0
矩阵的调用 假如A是一个已知10*10的方阵,那么: A(:,3)是A的第3列元素构成的列向量; A(5,:)是A的第5行元素构成的行向量; A(1:5,3)是A的前5行的第3列元素构成的列向量; A(1:5,7:10)是A的前5行,第7到第10列元素构成的子矩阵; A([1 3 5 ],[2 4 6])是A的第1、3、5行,第2、4、6列元素构成的子矩阵; A(:,7:-1:3)是A的第7、6、5、4、3列元素构成的子矩阵. A(:,[2 4])=[]用于把A的第2、4列删除,形成A的一个子矩阵. • 矩阵运算 • 矩阵的四则运算 ①矩阵相加减. 同型矩阵相加减等于对应矩阵的元素相加减,用符号“+”和“-”表示.
②矩阵相乘. 矩阵相乘用符号*表示,两个矩阵相乘以及数量和矩阵相乘遵循通常的数学规则. ③矩阵相除. 分右除和左除两种,分别用符号“/”和“\”表示.例如,如果A和B都是n阶矩阵,且A非奇异,则A\B=A-1B,B/A=BA-1. • 矩阵的乘方 方阵A的乘方用符号“^”表示. 当p是正整数时, Ap是A的p次幂,即:A^p=Ap; 当p为0时,A^0是单位阵; 当p为负数时,只有当A非奇异才有意义,例如: A^(-1)=A-1,A^(-2)=A-2.
例4.设 试求A+B,A*B,B*A,A2,AB-1. 解 所用MATLAB命令及运行结果为 >>A=[-2 4;1 -2]; >>B=[2 4;-1 -6]; >>A+B ans = 0 8 0 -8 >>B*A ans = 0 0 -4 8 >>D=A/B ans = -2 -2 1 1 >>A*B ans = -8 -32 4 16 >>A^2 ans = 8 -16 -4 8
多项式的运算 • 多项式的表示方法及其运算 • MATLAB中,无论是一个多项式,还是它的根,都是向量,MATLAB规定,多项式是行向量,根是列向量.例如,多项式p(x)=x3-3x+5可以表示成p=[1 0 -3 5].给定一个多项式的根,也可以构造相应的多项式.在MATLAB中,函数poly(r)执行这个任务. • 求多项式p=[1 0 -3 5]在x=5时的值p(5),可以用函数polyval(p,5).其中第一个参数是多项式的系数向量,第二个是自变量的取值(可以是矩阵). • 函数polyvalm(p,X)的第二个参数是方阵,求以矩阵为自变量的多项式的值. • 函数roots(p)可以找一个多项式的根.
例5. 改变自变量时多项式的取值及求多项式的根. >>p=[1 0 -3 5] p = 1 0 -3 5 >>result=polyval(p,5) %自变量为数 result= 115 >>A=[9 1;6 8;2 7]; >>c=polyval(p,A) %自变量为矩阵 c= 707 3 203 493 7 327
>>A=[9 1;6 8]; >>c=polyvalm(p,A) %自变量为方阵 c= 863 220 1320 643 >>p=[1 0 -3 5]; >>r=roots(p) r= -2.2790 1.1395+0.9463i 1.1395-0.9463i
常见的多项式函数 • 函数conv支持多项式乘法 例6.求a(x)=x3+2x2+3x+4和b(x)=x3+4x2+9x+16的乘积. >>a=[1 2 3 4];b=[1 4 9 16] >>c=conv(a,b) c= 1 6 20 50 75 84 64 • 多项式的加法 结果是d(x)=2x3+6x2+12x+20 >>d=a+b d= 2 6 12 20 低阶多项式用首零填补,使其与高阶多项式有相同的阶数 >>e=c+[0 0 0 d] e= 1 6 20 52 81 96 84
一个多项式除以另一个多项式 由函数deconv完成,格式为[g,r]=deconv(c,b)表示c除以b,给出商多项式g和余数r,若r=0,则c=bg. 例7.用例6中的多项式b和c,求它们的商. >>[g,r]=deconv(c,b) g = 1 2 3 4 r = 0 0 0 0 0 0 0 g = 1 6 20 48 69 72 44 >>h=polyder(g) h = 6 30 80 144 138 72 • 多项式的求导函数polyder 例8.对于一个新的多项式g求导 >>g=[1 6 20 48 69 72 44]
求函数的极值和零点 • 求解一元函数的取小值 可以通过函数fminbnd来求一元函数y=f(x)在指定区间[a,b]上的函数局部极小值,该函数返回函数在极小值点时自变量x的值,调用格式为:x=fminbnd(′fun′,a,b). 例9.求humps函数在开区间(0.3,1)内的最小值.humps是MATLAB内置的M文件函数,实际上是y=1/((x-0.3)^2+ 0.01)+1/((x-0.9)^2+0.04)-6. >>x=fminbnd(′humps′,0.3,1) x = 0.6370 >>f=inline(′sin(x)+3′); %用内联函数表达 >>x=fminbnd(f,2,5) x = 4.7124
求解多元函数的取小值 函数fminsearch用于求多元函数在向量x0附近的最小值.它指定一个开始的向量(x0),并非指定一个区间.此函数返回一个向量,为此多元函数局部最小函数值对应的自变量的取值,调用格式为 x=fminsearch(′fun′,x0) 例10.把一个3个自变量的函数创建在一个M文件里. %three.m function b=three(v) x=v(1); y=v(2); z=v(3); b=x*x+2.5*sin(y)-z*z*x*y*y; 求这个函数在[1,-1,0]点附近的最小值可以得到:
>>v=[1 -1 0]; >>fminsearch(′three′,v) ans = -0.0000 -1.5708 0.0008 也可以简单输入如下: f=′x(1)^2+2.5*sin(x(2))-x(3)^2*x(1)*x(2)^2′ >>x=fminsearch(f,[1 -1 0]),f=eval(f) x = -0.0000 -1.5708 0.0008 %函数的最小值点 f = -2.5000 %函数的最小值
求函数的零点 在MATLAB中使用fzero可以找到函数零点,调用格式为 x=fzero(fun,x0) 寻找零点可以指定一个开始的位置,或者指定一个区间. 例11.仍然考虑humps函数,把[1,2]作为函数的参数,命令及结果为 >>fzero(′humps′,[1 2]) ans = 1.2995