实验二 MATLAB语言基础
一、实验目的
基本掌握MATLAB向量、矩阵、数组的生成及其基本运算(区分数组运算和矩阵运算)、常用的数学函数。了解字符串的操作。
二、实验内容
1.向量的生成与运算;
2.矩阵的创建、引用和运算;
3.多维数组的创建及运算;
4.字符串的操作。
三、实验步骤
1.向量的生成与运算
①向量的生成
向量的生成有三种方法:
直接输入法:生成行向量、列向量;
冒号表达式法:变量=初值:间隔(可正可负):终值
函数法:使用linspace线性等分函数,logspace对数等分函数。
格式为:linspace(初值,终值,个数)
Logspace(初值,终值,个数), 初值及终值均为10的次幂。
②向量的运算
A=[1 2 3 4 5],b=3:7,计算两行向量的转置,两行向量人加、减,两列向量的加、减;向量的点积与叉积。
a=[1 2 3 4 5];
b=3:7;
a =
1 2 3 4 5
b =
3 4 5 6 7
at=a',bt=b'
at =
1
2
3
4
5
bt =
3
4
5
6
7
e1=a+b,e2=a-b
e1 =
4 6 8 10 12
e2 =
-2 -2 -2 -2 -2
f1=at+bt,f2=at-bt
f1 =
4
5
6
10
12
f2 =
-2
-2
-2
-2
-2
g1=dot(a,b),g2=a*bt
>> g1=dot(a,b),g2=a*bt
g1 =
85
g2 =
85
g4=a.*b
>> g4=a.*b
g4 =
3 8 15 24 35
A=1:3;B=4:6;
g3=cross(A,B)
>> g3=cross(a,b)
g3 =
-3 6 -3
注意:g1和g2的结果是否相同,为什么?g4的结果与g1和g2结果是否一样,为什么?
g1和g2的结果相同,因为两者是同一种运算;g4与g1和g2不相同,因为两者一个是点乘一个是叉乘,运算不一样。
2.矩阵的创建、引用和运算
矩阵是由n×m元素构成的矩阵结构。行向量和列向量是矩阵的特殊形式。
①矩阵的创建
矩阵的创建可由以下方法进行操作:直接输入法、抽取法、函数法、拼接法。
具体步骤为:建立两个矩阵,利用已学过的函数,对此进行所述四种方法进行操作。
a=[1 2 3;4 5 6];
b=[1 4 7
2 5 8
3 6 9];
a(1)
>> a(1)
ans =
1
a(4:end)
>> a(4:end)
ans =
5 3 6
b(:,1)
>> b(:,1)
ans =
1
2
3
b(:)
>> b(:)
ans =
1
2
3
4
5
6
7
8
9
b(5)
>> b(5)
ans =
5
a=fix(rand(3)*100)%建立一个两位有效整的随机矩阵
>> a=fix(rand(3)*100)
a =
95 48 45
23 89 1
60 76 82
b=a(1:3,2:3)
>> b=a(1:3,2:3)
b =
48 45
89 1
76 82
c=a([1 3],[2 3])
>> c=a([1 3],[2 3])
c =
48 45
76 82
d=a([1 3 ;2 4])
>> d=a([1 3;2 4])
d =
95 60
23 48
a=ones(3,3)
>> a=ones(3,3)
a =
1 1 1
1 1 1
1 1 1
b=zeros(3)
>> b=zeros(3)
b =
0 0 0
0 0 0
0 0 0
c=eye(3)
>> c=eye(3)
c =
1 0 0
0 1 0
0 0 1
d=magic(3)%建立一个行、列、对角线上的和为一相同的数的魔术矩阵
d=[a b]
>> d=[a b]
d =
1 1 1 0 0 0
1 1 1 0 0 0
1 1 1 0 0 0
f=[a;c]
>> f=[a;c]
f =
1 1 1
1 1 1
1 1 1
1 0 0
0 1 0
0 0 1
②矩阵的运算
矩阵的运算有基本运算(加、减、乘、左除、右除)等,还有矩阵函数运算(求逆inv、秩rank、矩阵的翻转、矩阵的转置)等。
已知
,
求a+b,2*a,2*a-3*b,a*b,b/a,a\b,求a逆矩阵,求矩阵的秩,矩阵的翻转,矩阵的转置。
>> a+b
ans =
0 2
4 1
>> 2*a
ans =
2 4
6 -2
>> 2*a-3*b
ans =
5 4
3 -8
>> a*b
ans =
1 4
-4 -2
>> b/a
ans =
-0.1429 -0.2857
1.0000 0
>> a\b
ans =
0.1429 0.5714
-0.5714 -0.2857
>> inv(a)
ans =
0.1429 0.2857
0.4286 -0.1429
>> rank(a)
ans =
2
>> flipud(a)
ans =
3 -1
1 2
>> a'
ans =
1 3
2 -1
3.多维数组的创建及运算
多维数组的创建与矩阵的创建基本相同;数组的运算除加减操作相同外,其它如乘、左除、右除的运算在运算符前加上小圆点表示,以区分矩阵运算。特点是两个数组相对应元素进行运算。
已知
,
求a+b, a-b, a.*b,a./b,a.\b
>> a+b
ans =
0 2
4 1
>> a-b
ans =
2 2
2 -3
>> a.*b
ans =
-1 0
3 -2
>> a./b
Warning: Divide by zero.
ans =
-1.0000 Inf
3.0000 -0.5000
>> a.\b
ans =
-1.0000 0
0.3333 -2.0000
4.字符串的操作
字符串的操作有字符串的创建、求字符串的长度、数值与字符之间相互转换操作等。
s1='I like matlab'
s2='I am a student'
s3=[s2,' and ',s1]
>> s1='I like matlabv'
s1 =
I like matlabv
>> s2='T am a student'
s2 =
T am a student
>> s3=[s2,' and ',s1]
s3 =
T am a student and I like matlabv
length(s1)
>> length(s1)
ans =
14
size(s1)
>> size(s1)
ans =
1 14
cs1=abs(s1)
>> cs1=abs(s1)
cs1 =
73 32 108 105 107 101 32 109 97 116 108 97 98 118
cs2=double(s1)
>> cs2=double(s1)
cs2 =
73 32 108 105 107 101 32 109 97 116 108 97 98 118
char(cs2)
>> char(cs2)
ans =
I like matlabv
setstr(cs2)
>> setstr(cs2)
ans =
I like matlabv
四、实验体会
本次实验主要是对数组或矩阵的操作,通过这次的实验我熟悉了数组和矩阵的一些常规操作,包括矩阵的创建、矩阵操作函数的使用。矩阵的创建有很多种方法,使用非常灵活。矩阵函数更是多种多样,通过实验的练习能够使我们更加深的理解和记忆。
实验三 MATLAB数值运算
一、实验目的
掌握 MATLAB 的数值运算及其运算中所用到的函数,掌握结构数组和细胞数组的操作。
二、实验内容:
(1) 多项式运算。
(2) 多项式插值和拟合。
(3) 数值微积分。
三、实验步骤:
1. 多项式运算
(1) 多项式表示。在 MATLAB 中,多项式表示成向量的形式。
如:
在 MATLAB 中表示为
>>S=[ 1 3 -5 0 9]
(2) 多项式的加减法相当于向量的加减法,但须注意阶次要相同。如不同,低阶的要补 0。如多项式
与多项式
相加。
>>S1=[0 0 2 3 11 ]
>>S2=[1 3 -5 4 7 ]
>>S3=S1+S2
(3) 多项式的乘、除法分别用函数 conv 和 deconv 实现
>>S1=[ 2 3 11 ]
>>S2=[1 3 -5 4 7 ]
>>S3=conv(S1,S2)
>>S4=deconv(S3,S1)
(4) 多项式求根用函数 roots
>> S1=[ 2 4 2 ]
>> roots(S1)
(5) 多项式求值用函数 polyval
>> S1=[ 2 4 1 -3 ]
>> polyval(S1,3)
>> x=1:10
>> y=polyval(S1,x)
2. 多项式插值和拟合
有一组实验数据如附表 1-1 所示。
X
1
2
3
4
5
6
7
8
9
10
Y
16
32
70
142
260
436
682
1010
1432
1960
请分别用拟合(二阶至三阶)和插值(线性和三次样条)的方法来估测 X=9.5 时 Y 的值。以下是实现一阶拟合的语句。
>>x=1:10
>>y=[16 32 70 142 260 436 682 1010 1432 1960]
>>p1=polyfit(x,y,1)
>>y1=polyval(p1,9.5)
3. 数值微积分
(1) 差分使用 diff 函数实现。
>>x=1:2:9
>>diff(x)
(2) 可以用因变量和自变量差分的结果相除得到数值微分。
>>x=linspace(0,2*pi,100);
>>y=sin(x);
>>plot(x,y)
>>y1=diff(y)./diff(x);
>>plot(x(1:end-1),y1)
(3) cumsum函数求累计积分,trapz 函数用梯形法求定积分,即曲线的面积。
>>x=ones(1,10)
>> cumsum(x)
>> x=linspace(0, pi,100);
>> y=sin(x);
>> S=trapz(y,x)
四、实验体会
本次实验主要是要我们了解数组的一些操作和属性。实验通过对多项式的运算插值等操作来帮助理解数组和矩阵的一些操作。另外,加入了两个画图函数来通过实际的图像进一步的了解数组函数的操作和功能。
实验四 MATLAB符号运算
一、实验目的
掌握符号变量和符号表达式的创建, 掌握MATLAB的symbol工具箱的一些基本应用。
二、实验内容
(1) 符号变量、表达式、方程及函数的表示。
(2) 符号微积分运算。
(3) 符号微分方程求解。
三、实验步骤
1. 符号运算的引入
在数值运算中如果求
则可以不断地让 x 趋近0, 以求得表达式趋近什么数,但是终究不能令 x=0,因为在数值运算中 0 是不能作除数的。MATLAB 的符号运算能解决这类问题。输入如下命令:
>>f=sym('sin(pi*x)/x ')
>>limit(f,’x’,0)
2. 符号常量、符号变量、符号表达式的创建
(1) 使用 sym( )创建
输入以下命令,观察 Workspace 中 A、B、f是什么类型的数据,占用多少字节的内存空间。
>>A=sym('1') %符号常量
>>B=sym('x') %符号变量
>>f=sym('2*x^2+3y-1') %符号表达式
>>clear
>>f1=sym('1+2') %有单引号,表示字符串
>>f2=sym(1+2) %无单引号
>>f3=sym('2*x+3')
>>f4=sym(2*x+3) %为什么会出错
>>x=1
>>f4=sym(2*x+3)
通过看 MATLAB 的帮助可知,sym( )的参数可以是字符串或数值类型,无论是哪种类型都会生成符号类型数据。
(2) 使用 syms 创建
>>clear
>>syms x y z %注意观察x,y,z都是什么类型的,它们的内容是什么
>>x,y,z
>>f1=x^2+2*x+1
>>f2=exp(y)+exp(z)^2
>>f3=f1+f2
通过以上实验,知道生成符号表达式的第二种方法:由符号类型的变量经过运算(加减乘除等)得到。又如:
>>f1=sym('x^2+y +sin(2)')
>>syms x y
>>f2=x^2+y+sin(2)
>>x=sym('2') , y=sym('1')
>>f3=x^2+y+sin(2)
>>y=sym('w')
>>f4=x^2+y+sin(2)
3. 符号矩阵创建
>>syms a1 a2 a3 a4
>>A=[a1 a2;a3 a4]
>>A(1),A(3)
或者
>>B=sym('[ b1 b2 ;b3 b4] ')
>>c1=sym('sin(x) ')
>>c2=sym('x^2')
>>c3=sym('3*y+z')
>>c4=sym('3 ')
>>C=[c1 c2; c3 c4]
4. 符号算术运算
(1) 符号量相乘、相除
符号量相乘运算和数值量相乘一样,分成矩阵乘和数组乘。
>>a=sym(5);b=sym(7);
>>c1=a*b
>>c2=a/b
>>a=sym(5);B=sym([3 4 5]);
>>C1=a*B, C2=a\B
>>syms a b
>>A=[5 a;b 3]; B=[2*a b;2*b a];
>>C1=A*B, C2=A.*B
>>C3=A\B, C4=A./B
(2) 符号数值任意精度控制和运算
任意精度的 VPA 运算可以使用命令 digits(设定默认的精度)和 vpa(对指定对象以新的精度进行计算)来实现。
>>a=sym('2*sqrt(5)+pi')
>>b=sym(2*sqrt(5)+pi)
>>digits
>>vpa(a)
>>digits(15)
>>vpa(a)
>>c1=vpa(a,56)
>>c2=vpa(b,56)
注意:观察 c1 和 c2 的数据类型,c1 和 c2 是否相等。
5. 符号表达式的操作和转换
符号表达式化简主要包括表达式美化(pretty)、合并同类项(collect)、多项式展开(expand)、因式分解(factor)、化简(simple 或 simplify)等函数。
1 合并同类项(collect)。分别按x的同幂项和e指数同幂项合并表达式:
>>syms x t; f=(x^2+x*exp(-t)+1)*(x+exp(-t));
>>f1=collect(f)
>>f2=collect(f,’exp(-t)’)
② 对显示格式加以美化(pretty)。针对上例,用格式美化函数可以使显示出的格式更符合数学
写习惯。
>>pretty(f1)
>>pretty(f2)
注意:与直接输出的 f1 和 f2 对比。
③ 多项式展开(expand)。展开 (x-1)12 成 x 不同幂次的多项式。
>>clear all
>>syms x;
>>f=(x-1)^12;
>>pretty(expand(f))
④ 因式分解(factor)。将表达式 x12–1作因式分解。
>>clear all
>> syms x; f=x^12-1;
>>pretty(factor(f))
⑤ 化简(simple 或 simplify)。
将函数
化简。
>>clear all, syms x; f=(1/x^3+6/x^2+12/x+8)^(1/3);
>>g1=simple(f)
>>g2=simplify(f)
6. 符号极限、符号积分与微分
(1) 求极限函数的调用格式
limit(F,x,a) %返回符号对象F当x→a时的极限
limit(F,a) %返回符号对象F当独立变量*→a时的极限
limit(F) %返回符号对象F当独立变量→0(a=0)时的极限
limit(F,x,a,’right’) %返回符号对象F当x→a时的右极限
limit(F,x,a,’left’) %返回符号对象F当x→a时的左极限
(2) 求积分函数的调用格式
int(F) %求符号对象F关于默认变量的不定积分
int(F,v) %求符号对象F关于指定变量v的不定积分
int(F,a,b) %求符号对象F关于默认变量的从a到b的定积分
int(F,v,a,b) %求符号对象F关于指定变量v的从a到b的定积分
(3) 求微分函数的调用格式
diff(F) %求符号对象F关于默认变量的微分
diff(F,v) %求符号对象F关于指定变量v的微分
diff(F,n) %求符号对象F关于默认变量的n次微分,n为自然数1、2、3…
diff(F, v,n) %求符号对象F关于指定变量v的n次微分
7. 符号方程的求解
(1) 常规方程求解函数的调用格式
g = solve(eq) %求方程(或表达式或字串)eq关于默认变量的解
g = solve(eq,var) %求方程(或表达式或字串)eq关于指定变量var的解
g = solve(eq1,eq2,...,eqn,var1,var2,...,varn) %求方程(或表达式或字串)组
eq1,eq2,...,eqn关于指定变量组var1,var2,...,varn的解
(2) 常微分方程求解
求解常微分方程的函数是 dsolve。应用此函数可以求得常微分方程(组)的通解,以及给定边界条件(或初始条件)后的特解。 常微分方程求解函数的调用格式:
r = dsolve('eq1,eq2,...','cond1,cond2,...', 'v')
r = dsolve('eq1','eq2',...,'cond1','cond2',...,'v')
说明:
① 以上两式均可给出方程 eq1、eq2 ...对应初始条件 cond1、cond2 ...之下的以 v作为
解变量的各微分方程的解。
2 常微分方程解的默认变量为 t。
3 第二式中最多可接受的输入式是 12 个。
④ 微分方程的表达方法。
在用MATLAB求解常微分方程时, 用大写字母Dy表示微分符号
,用D2y表示
,依次类推。
边界条件以类似于 y(a) = b 或 Dy(a) = b 的等式给出。其中 y为因变量,a、b 为常数。如果初始条件给得不够,求出的解则为含有 C1、C2 等待定常数的通解。
例如:求微分方程为y’=2x 的通解。
四、实验
1、求
2、求函数
的积分;求函数
的导数。
3、计算定积分
。
4、求下列线性方程组的解
5、求解当y(0)=2,z(0)=7时,微分方程组的解
五、实验体会。
本次实验,主要练习了在MATLAB中使用表达式和函数的求解,进一步让我见识到了MATLAB的强大功能,特别是方程组、积分微分方程的求解,使得我们在今后的学习生活中都能受益匪浅。
实验五 MATLAB程序设计
一、实验目的
掌握 MATLAB 程序设计的主要方法,熟练编写 MATLAB 函数。
二、实验内容
(1) M 文件的编辑。
(2) 程序流程控制结构。
(3) 子函数调用和参数传递。
三、实验步骤
1. M 文件的编辑
选择 MATLAB 的菜单 File|New|M-file,打开新的M文件进行编辑,然后输入源程序;保存好文件后,运行该程序。在菜单 debug|run命令保存文件并运行该文件,结果在命令窗口下显示;注意观察工作空间中显示的变量。注意保存文件的文件名的选取。
2. 程序流程控制结构
(1) for循环结构
for 循环控制变量=表达式1:表达式2:表达式3
语句
end
(2) while 循环结构
while 关系表达式
语句
end
(3) if-else-end 分支结构
if-else-end分支有如下3种形式。
(a) if 表达式
语句组1
end
(b) if 表达式
语句组1
else
语句组2
end
(c) if 表达式 A
语句组1
elseif 表达式B
语句组2
elseif
语句组3
……
else
语句组n
end
(4) switch-case 结构
switch 语句的一般结构是
switch 表达式
case 表达式1
语句1
case 表达式2
语句2
... ...
case 表达式n
语句n
otherwise
语句n+1
end
当表达式的值等于表达式 1 的值时,执行语句 1;当表达式的值等于表达式 2 的值时,执行语句 2;...;当表达式的值等于表达式 n 的值时,执行语句 n;当表达式的值不等于任何 case 后面所列的表达式时,执行语句 n+1。当任何一个分支语句执行完后,都直接转到end 语句的下一条语句。
三、实验内容
1. 试计算以下循环语句操作的步数。
(1) for i=-1000:1000
共2001步
(2) for j=1:2:20
共10步
2. 用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到最后一项的绝对值小于
为止,试编写其 M文件并运行,写出实际运行结果。
3. 试用 switch 语句完成卷面成绩 score 的转换:
(1) score ≥90 分,优;
(2) 90>score ≥80 分,良;
(3) 80>score≥70 分,中;
(4) 70>score ≥60 分,及格;
(5) 60<score,不及格。
4. 用for循环和while循环语句求 1!+2!+…+10!的值。
四、实验体会
本次实验主要是练习MATLAB的程序设计,matlab的程序设计,虽然和以前学的c/c++有很大的不同,但编程的思想还是一样的。所以对于MATLAB的程序设计理解和学习并没有太多的难处,但是,一旦亲手编写时,还是觉得有点力不从心,主要是对于M语言的具体细节的东西不然太熟练,还不习惯C语言以外的编程特点,在M语言方面的编程有过一次实践了,学到了很多的东西,觉得这是一个挺重要的内容,今后可以继续深入的学习的。
实验六 MATLAB数据可视化
一、实验目的
掌握 MATLAB 二维、三维图形绘制,掌握图形属性的设置和图形修饰;掌握图像文件的读取和显示。
二、实验内容
(1) 二维图形绘制。
(2) 三维曲线和三维曲面绘制。
三、实验步骤
1.二维图形绘制
(1) 二维图形绘制主要使用函数 plot。
>> clear all;
>> x=linspace(0,2*pi,100);
>> y1=sin(x);
>> plot(x,y)
>> hold on
>> y2=cos(x)
>> plot(x,y)
>> hold off
注:hold on 用于保持图形窗口中原有的图形,hold off解除保持。
(2) 函数 plot 的参数也可以是矩阵。
>> close all
>> x=linspace(0,2*pi,100);
>> y1=sin(x);
>> y2=cos(x);
>> A=[y1 ; y2]';
>> B=[x ; x]'
>> plot(B,A)
(3) 选用绘图线形和颜色。
>> close all
>> plot(x,y1,'g+',x,y2, 'r:')
>> grid on
(4) 添加文字标注。
>> title('正弦曲线和余弦曲线')
>> ylabel('幅度')
>> xlabel('时间')
>> legend('sin(x)', 'cos(x)')
>> gtext('\leftarrowsinx')
(5) 修改坐标轴范围。
>> axis equal
>> axis normal
>> axis([0 pi 0 1.5])
(6) 子图和特殊图形绘制。
>>subplot(2,2,1)
>>t1=0:0.1:3;
>>y1=exp(-t1);
>>bar(t1,y1);
>>subplot(2,2,2)
>>t2=0:0.2:2*pi;
>>y2=sin(t2);
>>stem(t2,y2);
>>subplot(2,2,3)
>>t3=0:0.1:3;
>>y3=t3.^2+1;
>>stairs(t3,y3);
>>subplot(2,2,4)
>>t4=0:.01:2*pi;
>>y4= abs(cos(2*t4));
>>polar(t4,y4);
提示:二维图形绘制按照以下的步骤进行
(1)产生曲线的数据;
(2)选择合适的线形、标记、颜色(正弦曲线为红色,余弦曲线为紫色);
(3)添加图例及文字说明信息;
(4)添加坐标轴说明与图标题。
2. 三维曲线和三维曲面绘制
(1) 三维曲线绘制使用 plot3 函数。绘制一条空间螺旋线:
>>z=0:0.1:6*pi;
>>x=cos(z);
>>y=sin(z);
>>plot3(x,y,z);
(2) 三维曲面图的绘制: MATLAB 绘制网线图和网面图的函数分别是 mesh( )和 surf( ),
其具体操作步骤是:
① 用函数 meshgrid( )生成平面网格点矩阵[X,Y];
② 由[X,Y]计算函数数值矩阵 Z;
③ 用 mesh( )绘制网线图,用 surf( )绘制网面图。
绘制椭圆抛物面:
>>clear all,close all;
>>x=-4:0.2:4;
>>y=x;
>> [X,Y]=meshgrid(x,y);
>>Z=X.^2/9+Y.^2/9;
>>mesh(X,Y,Z);
>>title('椭圆抛物面网线图')
>>figure(2)
>>surf(X,Y,Z);
>>title('椭圆抛物面网面图')
绘制阔边帽面:
>>clear all,close all;
>>x=-7.5:0.5:7.5;
>>y=x;
>> [X,Y]=meshgrid(x,y);
>>R=sqrt(X.^2+Y.^2)+eps; %避开零点,以免零做除数
>>Z=sin(R)./R;
>>mesh(X,Y,Z);
>> title('阔边帽面网线图')
>>figure(2)
>>surf(X,Y,Z);
>>title('阔边帽面网面图')
练习:考虑以下问题:设
求定义域 x=[-2,2],y=[-2,2]内的z值(网格取 0.1)。请把 z 的值用网线图形象地表示出来。
三、实验体会
本次实验学习了用MATLAB内置的函数进行图像的绘制,主要是二维和三维图像。对于图像的绘制,我觉得MATLAB是很强大的,能生动形象的把复杂的函数用图像画出来。虽然有很多是上课讲过的,但是,还是通过自己实验之后才能真正体会到MATLAB的妙用有多大。MATLAB内置了强大的绘图函数,通过学习和使用MATLAB绘制二维图像特别是三维图像,使我们更进一步了解MATLAB的功能,对我们今后的学习将会有很大的帮助。