MATLAB数学运算基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
1 数据表示方法
2 矩阵的赋值
3 向量的赋值
4 用矩阵元素组成新矩阵附:矩阵赋值中的标点符号
5 矩阵运算
6 多维矩阵
7 元胞数组
8 自定义函数
9 数值计算
10 符号数学
11 绘图
12 文件和数据
13 控制语句
14 字符串
15 帮助
16 函数库
17 日志文件
1数据表示方法
1. MATLAB中的数据单位是矩阵,矩阵的元素可以是实数,也可以是复数。

复数表示为a+bi或者a+bj,如
2.73+42.6i或者2.73+42.6j,但MATLB给出的运算结果中只有i而没有j 。

在符号表达式中,系数与i或者系数与j 之间应加上*号。

2.向量是矩阵的特殊形式,即向量是只有一行或者只有一列的矩阵。

3.单个数的属性为1×1矩阵,例如,a=4,size(a),返回[1 1],但与矩阵相加,相乘时,按数学规则视为单个数。

4.矩阵的左上角元素的脚标为(1,1),而不是(0,0),向量的元素的起始脚标是(1)而不是(0)。

5.矩阵元素也可以用单脚标指示,这时,元素脚标号 = (元素列号-1) x 矩阵总行数 + 元素行号
例:
>> a = [ 1 2 3 4; 5 6 7 8; 9 10 11 12 ]
得 a = 1 2 3 4
5 6 7 8
9 10 11 12
>> a(9)
得 a(9)= 11
2矩阵的赋值
1.对整个矩阵赋值
例:为二行二列矩阵赋值,赋值式中的逗号可以用空格代替
>> a = [ 236, 347; 365, 56 ] 或
>> a = [ 236 347; 365 56 ] 或
>> a = [ 236, 347 ;
365, 56 ] 或
>> a = [ 236 347
365 56 ]
2.逐个元素赋值
逐个元素赋值时,允许跳空赋值,跳过的元素的值默认为0。

例:
>> a(1, 1) = 34; a(1, 2) = 57; a(3, 4) = 17 得 a = 34 57 0 0
0 0 0 0
0 0 0 7
3.整行赋值
整行赋值时,所赋数据的列数,必须与原矩阵的列数相同。

例: 为第4行赋值
>> a = [ 1 2 3; 4 5 6 ]; a(4, :) = [ 9 8 7 ];
>> a
得 a = 1 2 3
4 5 6
0 0 0
9 8 7
4.整列赋值
整列赋值时,所赋数据的行数,必须与原矩阵的行数相同
例: 为第5列赋值,
>> a = [ 1 2 3; 4 5 6 ]; a(:,5) = [ 10 11 ]'
>> a
a = 1 2 3 0 10
4 5 6 0 11
3向量的赋值
1.逐个元素赋值
向量的逐个元素赋值与矩阵相同。

2.等距赋值 a = start:step:end或a = [start:step:end]
例:
>> a = 1:2:10
得 a = 1 3 5 7 9
3.等差赋值 a = linspace(a1,a2,n) 从a1到a2取n个等分点,返回这n个等分点的值。

4.等比赋值 a = logspace(a1,a2,n) 从a1到a2取n个等分点,返回以10为底,n个等分点的值为指数的幂。

4用矩阵元素组成新矩阵
1.取大矩阵元素组成新的矩阵
例: 取a矩阵中第2行和第3行这两行的第3,4,5列组成新的矩阵b
>> a = [ 11 12 13 14; 15 16 17 18; 19 20 21 22; 23 24 25 26 ];
>> b = a([ 2, 3 ], [ 2, 3, 4 ])
得 b = 16 17 18
20 21 22
2.用小矩阵组成大的矩阵
例: 将2个矩阵左右拼接
>> a = [ 1 2; 3 4 ]; b=[ 5 6; 7 8 ] >> c = [ a, b ]
得 c = 1 2 5 6
3 4 7 8
例:将2个矩阵上下拼接 >> d = [ a; b ]
得 d = 1 2
3 4
5 6
7 8
附:矩阵赋值中的标点符号:
1. 逗号或者空格 , 隔开同一行中的元素
2.分号或者回车符 ; 隔开矩阵中的行。

用回车键可以直观的方式在屏幕上输入矩阵
3.冒号 : ⑴ a = 3: 0.5: 10或a = [ 3: 0.5: 10 ] 建立行向量
⑵ a(:, 4) 全部行的第4列
a(3, :) 全部列的第3行
⑶ a(1:4, 3) 第3列的第1行到第4行 a(2, 2:3) 第2行的第2列到第3列5矩阵运算
1.以矩阵为参数进行运算
加 mat1 + mat2 减 mat1 - mat2 乘 mat1 * mat2 左除 mat1 \ mat2
右除 mat1 / mat2
幂 mat ^ figure
转置mat’
2.以矩阵为变量求函数值以下3个函数见函数库matfun
矩阵平方根 sqrtm 矩阵幂 expm 矩阵对数 logm
3. 以矩阵元素为参数进行运算
点乘 mat1 .* mat2 点除 mat1 ./ mat2 点幂 mat .^ figure
4.以矩阵元素为变量求函数值
函数库elfun中所有数学函数,都可以以矩阵元素为变量求函数值,例如对于矩阵A,sin(A) 即对矩阵A中的每个元素求正弦值。

对于自定义函数,如果也希望做到这一点,其中的乘,除,幂运算,应分别使用.* ,./ 和.^ figure 这些符号。

矩阵A
注: 5 1. 和5 3. 仅介绍了部分运算符,运算符函数库是ops,可通过命令 help ops 获得全面了解。

6多维矩阵
矩阵是一个数学实体,又是一种数据结构,而多维矩阵则仅仅是一种数据结构,也可称为多维数组。

其元素仅限于数值,使用函数cat,可以将维数相同的矩阵组成多维数组。

例: 设三维矩阵的元素表达式m(i, j, k)中,i为行号,j为列号,k为页号。

以下对4个元素赋值:
>> m(3, 3, 3) = 333; m(3, 3, 2) = 332; m(3, 3, 1) = 331; m(2, 1, 2) = 212;
>> m
得 m(:, :, 1) = 0 0 0 % 第一页
0 0 0
0 0 331
得 m(:, :, 2) = 0 0 0 %第二页
212 0 0
0 0 332
得 m(:, :, 3) = 0 0 0 % 第三页
0 0 0
0 0 333
7元胞数组
元胞数组是一种二维或多维的数据结构,其元素可以是数值,字符串,矩阵,元胞数组。

读取和赋值元胞数组时,用圆括号指示元胞,用花特号指示元胞的内容。

使用函数celldisp,可以同时显示元胞数组中各个元胞的内容。

例:
>> a = cell(2, 2); % 预分配
>> a{1,1} = 'cellclass';
>> a{1,2} = [ 2.7 5.9; 4.7 8.9 ];
>> a{2,1} = [ 'a', 'b', 'c' ];
>> a{2,2} = [ 97.3 58.2 64.3; 32.1 79.5 52.1; 45.0 32.1 58 ];
>> a = 'cellclass' [ 2x2 double ] % 显示元胞数组的组成
'abc' [ 3x3 double ]
>> a{1,2} % 取元胞的内容
得 a{1,2} = 2.7000 5.9000
4.7000 8.9000
>> a{2,2}(2,3) % 取元胞内的元素
得 a{1,2} = 52.1000
8自定义函数
自定义函数可以像内部函数一样在MATLAB窗口中被调用,并且,有的函数也要求用自定义函数作为参数。

自定义函数应包含在一个名为fun_name.m的文件中,文件名必须与函数名相同。

文件的框架格式是:
function y=fun_name(var1,var2,...)
y=expression;
9数值计算
1. 求向量积
两向量点乘 dot(A,B) 两向量叉乘 cross(A,B) 2. 多项式计算
设A 是多项式的系数向量(从高到低),X ,Y 是数据向量,N 是拟合多项式阶数,XI 是插值点: 求多柄式的根 roots(A)
求多项式的值 polyval(A,x) l 是字符L 的小写
多项式乘法 conv(A,B) 多项式A 与多项式B 相乘,得到一个新的多项式 多项式除法,或称反卷积 [Q R] = deconv(B,A) B = conv(A,Q) + R 例: 223a x x =++ 324321b x x x =+++,求?b a
=
手工计算不难得出 32
2
4321(45) (1623)
b x x x x a
x x +++==-++
deconv 函数的过程是:
>> b = [ 4 3 2 1 ]; a = [ 1 2 3 ]; >> [q r] = deconv(b,a) 得 q = 4 -5
得 r = 0 0 0 16 3. 插值和曲线拟合
插值 interp1(X,Y,Xi) interp1中“1”是数字1 曲线拟合 polyfit(X,Y,n) 4. 解线性方程组 例: 设有线性方程组 121225346
x x x x ⎧+=⎪⎨
+=⎪⎩
>> a = [1 2;3 4]; b = [ 5 6 ]'; >> x = a\b (左除) 得 x = -4.0000 4.5000

12
x=-4, x=4.5
线性方程组有以下4种直接解法:
①行列式法 X
n = D
n
/D
分别求出各未知数的特征行列式的值和系数行列式的值,再依据克莱姆法则做除法求出全部解。

②矩阵左除法 X = A\B
通过矩阵的左除法运算求得方程组AX = B的解。

③ LU分解法 [L,U] = lu(A) X = U\(L\B)
对方程组 AX = B 的系数矩阵 A 进行 LU 分解,使之A = LU。

将方程组变为LUX = B,再用除法求解。

④ QR分解法 [Q,R] = qr(A) X = R\(Q\B)
对方程组AX = B的系数矩阵A进行QR分解,使之A = QR,将方程组变为QRX = B,再用除法求解。

⑤逆矩阵法 NA = inv(A) X = NA*B
⑥ Cholesky分解法 [R,p] = chol(A) X = R\(R'\B)
对具有对称正定系数矩阵的方程组AX = B的系数矩阵A进行Cholesky分解,若p = 0,则可得A = R'R。

将方程组变为R'RX = B,再用除法求解。

不过,即使p = 0,也可能得到与其它算法不一样的结果,所以,使用Cholesky 分解的方法求解线性方程组应该慎重。

以下用前5种方法解同一个线性方程组,可以比较计算结果:
a = [ 3.6 6.8 -3.56 3.90 4.5 -3.21 2.12 -5.78 9.45 5.23;
7.56 -4.3 4.33 2.15 4.5 -2.7 2.44 1.54 7.33 -1.2;
-14.33 -2.33 1.58 7.68 12.44 7.55 4.66 4.88 -12.33 5.88;
5.78 5.66 8.44 -3.56 13.46 1.23 4.88 11.22 7.99 1.55;
16.33 7.33 4.55 2.33 9.11 0.45 -2.78 -5.5 -5.6 7.99;
14.33 6.77 2.33 3.22 8.11 5.43 -5.66 -2.11 4.33 11.22;
4.56 -1.11 2.33
5.67 8.25 7.3 -
6.1 -5.1
7.89 -13.12;
5.89 -3.27 -0.8 5.72 -3.24 -5.6 11.23 14.35 5.66 -8.2;
6.57 5.2 -5.23 4.36 11.0 -2.0 5.6 -
7.3 5.0 -3.0;
-3.5 -2.7 -1.1 5.8 -3.0 7.63 3.28 11.56 8.0 8.14 ];
b = [ 13.7 14.5 -11.0 3.2 8.4 5.0 -3.0 8.0 3.23 14.3] ;
a0 = det(a); % 求系数行列式
for n = 1:10
d = a; % 将系数矩阵赋于中间变量
d(:,n) = b; % 替换对应列,得到第n个未知数的特征行列式 x1(n) = det(d)/a0; % 求得第n个未知数
end
[l,u] = lu(a); % 对系数矩阵a进行lu分解
[q,r] = qr(a); % 对系数矩阵a进行qr分解
na = inv(a); % 求系数矩阵a的逆矩阵x4=na*b
x1 = x1' % 显示行列法的结果
x2 = a\b % 矩阵左除法求解
x3 = u\(l\b) % lu法求解
x4 = r\(q\b) % qr法求解
x5 = na*b % 逆矩阵法求解
cond = cond(a) % 求系数矩阵的条件数,以估计解的精度
5.解任意方程 fzero(fun,x0) fun是方程的符号表达式,x0是迭代起始值
例: 求解方程23cos70
x x
--=的根
>> y = 'x^2-3*cos(x)-7'
>> x = fzero(y,3)
得 x = 2.25775155709708 或者
>> y = fzero('x^2-3*cos(x)-7',3)
得 x = 2.25775155709708
6.解非线性方程组(数值法,而不是符号法)
首先建立fun.m文件,m文件的文件名必须与文件中的函数名相同:
function y = fun(x)
%使用方法:
>> fsolve('fun',[0 0],optimset('fsolve'))
得 x = 1.47447478468452 -1.43175210046021
得 y = 1.0e-006 *
0.19292374231483 -0.03529814840419
其中[0 0]是迭代起始点,可以是实数点,也可以是复数点。

用fzero和fsolve解方程组速度快,缺点是迭代起始点不好选择,当有复数根更是如此。

使用符号法函数solve可以克服这个缺点,但用solve函数解题速度比较慢。

6.求随机数 unifrnd(A,B,C,D)
(A,B)是产生的随机数的区间,A和B也可以是矩阵,C D
是产生的矩阵的尺寸
10符号数学
1.建立符号表达式
例:
>> syms x
y = 2*x^2+sin(x)
2.定义数值符号
例:
>> s = sym('0.6789421798645731098759378567897654') % 数值要带引号
s = 0.6789421798645731098759378567897654
3.复合函数
例:
>> syms x t
>> y = 2*x^2+sin(x)
>> x = t^2
>> w = compose(y,x)
w = 2*t^4+sin(t^2)
4.求符号表达式的值
例:
>> syms x y; m = '2*x^2+sin(y)'; >> x = sym('3.45');y=sym('3.67'); >> eval(m)
ans = 23.300841452146388427791975941086
5. 解非线性方程组 用solve('eqn1','eqn2',...,'eqnN')函数 例1: 设有非线性方程组 1122110702075070213
x x x x x x ⎧=⎪⎨
+=⎪⎩-.sin()-.cos().-.cos().sin()-.
>> [x1,x2] = solve('x1-0.7*sin(x1)-0.2*cos(x2)-0.75=0','x2-0.7*cos(x1)+0.2*sin(x1)=-1.3') 得 x1 = 1.474474611643002028761298028880 得 x2 = -1.4317519412660980161387167052389
例2: 设有非线性方程组 ⎧⎪⎨
⎪⎩2122
21x -x -0.75=0x -0.7x +1.3=0
>> [x1,x2] = solve('x1^2-x2-0.75=0','x2^2-0.7*x1+1.3=0')
x1 = [ -1.0308377032790522581043905579820 - .69454388822563214024094924875560 * i ] [ -1.0308377032790522581043905579820 + .69454388822563214024094924875560 * i ] [ 1.0308377032790522581043905579820 - .37797027440221192779145393835429 * i ] [ 1.0308377032790522581043905579820 + .37797027440221192779145393835429 * i ] x2 = [ -0.16976484216994800533187380202924 + 1.4319240531300268430618401527465 * i ] [ -0.16976484216994800533187380202924 - 1.4319240531300268430618401527465 * i ] [ 0.16976484216994800533187380202924 - 0.77925201914505860066403521466727 * i ]
[ 0.16976484216994800533187380202924 + 0.77925201914505860066403521466727 * i ] 例3: 设有非线性方程2x -0.52x +7=0 >> x = solve('x^2-0.56*x+7=0')
得 x = .28000000000000000000000000000000 + 2.6308933843848556836562188304088*i
.28000000000000000000000000000000 - 2.6308933843848556836562188304088*i
6. 解复系数线性方程组
%本题来自用回路电流法解电路,未知数是回路电流
d = [ 2+4i, -1, -4i ; % a 为系数矩阵,也是系数行列式 -1, 2-0.25i, -1 ; -4i, -1, 3+4i ];
c = [ 8.6603+5i ; % b 为常数项向量 0 ;
0 ];
%以下用矩阵左除法计算电流
i = d\c
%以下用行列式除法,即克莱姆法,计算电流')
d1 = d; %以下d1,d2,d3用常数项替换后的特征行列式
d1(:,1) = c(:,1);
i1 = det(d1)/det(d) %求i1(det为求行列式值的函数,下同)
d2 = d;
d2(:,2) = c(:,1);
i2 = det(d2)/det(d) %求i2
d3 = d;
d3(:,3) = c(:,1);
i3 = det(d3)/det(d) %求i3
%以下用符号法解,用x1,x2,x3代替i1,i2,i3,注意,在符号表达式中虚数i与系数之间要加乘号*
[x1,x2,x3]=solve('(2+4*i)*x1+(-1)*x2+(-4*i)*x3=8.6603+5*i','(-1)*x1+(2-0.25*i)*x2+(-1)*x3=0','(-4*i)*x1+(-1)*x2+(3+4*i)*x3')
%x1=3.5005813725490196078431372549020+1.1686745098039215686274509803922*i
%x2=2.6576313725490196078431372549020+2.0404745098039215686274509803922*i
%x3=2.3248000000000000000000000000000+2.2478666666666666666666666666667*i
%以下分别用矩阵乘法c1=d*i和c2=d*[i1;i2;i3]验算
c1 = d*i
c2 = d*[i1;i2;i3]
%以下用指数式表达电流
i1 = sprintf(' %5.2f∠%5.2f°',abs(i1),180*angle(i1)/3.1416)
i2 = sprintf(' %5.2f∠%5.2f°',abs(i2),180*angle(i2)/3.1416)
i3 = sprintf(' %5.2f∠%5.2f°',abs(i3),180*angle(i3)/3.1416)
7.变量代换
例:
>> syms x y;w=x+y
得 w = x+y
>> t=subs(w,{x y},{sym('m'),sym('n')})
得 t = m+n
8.设置计算精度
digits函数用于设置计算结果的精度。

>> digits() ;默认精度是32位有效数字
得 Digits = 32
>> digits(10) ;设置10位有效数字
9. VPA函数的应用
VPA函数用于计算符号表达式。

>> vpa('20/3') ;按此前用digits设置的有效数字位数计算
得 ans =6.666 666 667
>> vpa('20/3',15) ;本次计算设置为15位有效数字
得 ans =6.66 666 666 666 667
11绘图
绘图函数plot,fplot,polar,以及这里没有列出的,step,impulse,bode,nyquist等,用于控制系统的绘图函数,都可以加上颜色参数:'c'_青色,'g'_绿色,'k'_黑色,'m'_红紫色(洋红),'r'_红色,'w'_白色,'y'_黄色。

1.按给定数据绘图 plot(x,y),semilogx(x,y),semilogy(x,y),loglog(x,y)
2.按给定函数绘图 fplot('fun',[x0,x1]) ;式中方括号中是绘图参数,而不是表示可选项
3.按给定数据绘极座标图 polar(θ,ρ)
4.保留图形 hold,hold on,hold off
5.创建图形窗口 figure, figure(i)
6.打开存在的图形窗口 figure(i)
12文件和数据
1.打开文件 id=fopen('file_name')
2.写格式文件 fprintf(id,format,variable)
3.读格式文件 fscanf(id,format,size)
4.将变量存入数据文件 save file_name variable -ascii -ascii表示以ascii方式保存
5.从数据文件读入 load('data_file') 读入的数据自动存入与数据文件同名的变量中
6.从屏幕输入 variable=input('prompt')
7.用对话框输入answer_c=inputdlg('prompt')
注意:返回的值answer_c是cell类型,如果想得到数值,请用char和strnum两个函数进行转换,即
answer_s = char(answer_c), answer_n = str2num(answer_s(1))
8.显示到屏幕上 disp(variable) %只显示变量值
display(variable) %显示变量值和变量符号
13标识符和流程控制语句
注释符 %
换行符 ...
流程控制语句不论在m文件中,还是在屏幕上,流程控制语句既可以写成分行的形式,也可以写成单行的形式,对于单行形式,一组控制语句中的各个语句之间应该用逗号或分号隔开。

continuie,break,仅在for语句和while语句中使用。

1 IF expression
statements
ELSEIF expression
statements
ELSE
statements
END
2 FOR variable = initval:stepval:endval
statements
END
3 WHILE expression
statements
END
4 SWITCH switch_expr
CASE case_expr
statement
CASE {case_expr1,case_expr2,...}
statement
...
OTHERWISE
statement
END
5 continuie
6 break
14字符串
1.数字转换为字符串 num2str(number)
2.字符串转换为数值 str2num(string)
3.字符串联接 strcat(string,string)
15帮助
1. help 显示所有的函数库
2. help lib_name 显示库名为lib_name的函数库中的所有函数名及关于每一个函数的简要说明
3. help fun_name 显示函数名为fun_name的函数的功能及用法
16函数库
1.操作符和特殊字符 ops
2.通用命令 general
3.初等矩阵和矩阵处理 elmat
4.初等矩阵函数 elfun
5.矩阵函数和数值线性代数 matfun
6.特殊矩阵函数 specfun
7.插值和多项式 polyfun
8.程序设计语言结构函数库 lang
9.字符串函数库 strfun
10.二维图形 graph2d
以下是2个工具箱:
11.符号数学工具箱 symbolic
12.控制工具箱 control
17日志文件
1.打开默认的日志文件 diary on
2.用编辑器打开日志文件diary,可以阅读,编辑和打印其中的内容
3.用命令 diary('file_dia.dat'),可以自定义日志文件为file_dia.dat。

相关文档
最新文档