计算机技术的迅速发展,产生了许多功能强大的数学软件,为应用数学和工程技术的发展提供了威力无比的武器和工具,本章介绍由美国MathWorks 公司开发的集数值计算、符号计算和图形可视化三大基本功能于一体的,功能强大、简单易学的软件MATLAB。它是国际公认的优秀数学应用软件之一。从20世纪80年代产生到现在,MATLAB已经发展成为适合多学科的大型软件,在世界各高校,MATLAB已经成为线性代数、数值分析、数理统计、优化方法、自动控制、数字信号处理、动态系统仿真等高级课程的基本教学工具。特别是最近几年,MATLAB在我国大学生数学建模竞赛中的应用,为参赛者在有限的时间内准确、有效的解决问题提供了有力的保证。
本章以MATLAB6.5.1版本为例,主要通过举例介绍MATLAB的初步应用。 先简单介绍MATLAB的工作界面,启动MATLAB将看到以下界面
图1
命令窗口(Command Window):其中“>>”为命令提示符,表示MATLAB已经准备好,可以接受用户在此输入命令,命令执行的结果也显示在这个窗口中 历史命令窗口(Command History):已经执行过的命令依次显示在这个窗口中,可以备查 工作区窗口(Workspace):显示当前计算机内存中有哪些变量及相关信息
一 基本命令与运算
例1:如图1所示,我们已经输入了3条命令 第一条: >> a=3 运行(点击Enter键),结果为:
a = 3
这表示我们定义了一个变量a,并且给a赋值为3,同时在工作区窗口中就会出现一个小方格,意思是现在我们占据了计算机内存中一块存储空间,空间命名为a,空间里面现在就存放着数字3,用鼠标双击这个小方格,就会看到这个3 第二条: >> b=4;
表示又定义了一个变量b,赋值为4,运行后没有显示结果,这是因为我们在命令后面加了分号,这只是表示不把结果在命令窗口中显示出来(因为有时候我们为了解决某个问题只需显示最后结果,而不需要显示中间结果),实际上命令已经执行过了,这在工作区窗口中就能看出来
第三条: >> c=a+b, 运行结果: c =
7
又定义了一个变量c,同时把变量a里面的数与变量b里面的数加起来将结果放到c里面 这时我们已经定义了三个变量,也就是在计算机内存中我们占据了三块存储空间,假如我们问题解决完了,不需要这几个变量了,我们就用下面的命令清除它们 >> clear
运行后工作区窗口中的三个小方格就会消失,表示三个变量已经清除,内存中所占据的存储空间已经释放,这样就不会影响我们后面解决其它问题了 例2:计算[122(74)]32 >>(12+2*(7-4))/3^2 运行结果: ans = 2
例3:计算圆面积Arear,半径rad=2,则可输入 >>rad=2; %定义变量名为rad >>area=pi*rad^2; %定义变量名为area >>area
说明1:前两行命令加了分号,表示不把这两行命令的结果显示出来,但是我们需要知道面积是多少,所以第三行命令表示把变量area的值显示出来 说明2:pi是Matlab里边已经有的常数(即圆周率),直接应用,不需要定义
说明3:%后面为注释,用来解释前面命令的功能或作用,计算机并不执行,练习时可以不用输入,但在解决复杂问题时,恰当的注释是很有用的
2
表1: 常用函数 名称 sin(x) cos(x) tan(x) cot(x) asin(x) acos(x) exp(x) pow2(x) log(x) log2(x) abs(x) sqrt(x) round(x) rem(x,y) (x,y) lcm(x,y) 含义 x的正弦 x的余弦 x的正切 x的余切 x的反正弦 x的反余弦 ex 2x lnx log2x x的绝对值 x的平方根 四舍五入到最近整数 x除以y的余数 x和y的最大公因数 x和y的最小公倍数 表2: 常用运算符 关系运算符 功 能 + - * / ^ = = ~ = = = <= >= & | ~
例4:1)计算
加号 减号 乘号 除法 乘幂 等于 不等于 等于 小于等于 大于等于 逻辑与 逻辑或 逻辑非 2ysin10e0.34
>>y=sin(10)*exp(-0.3*4^2)
结果 y =
-0.0045
系统默认4位有效数字,若想提高精度可用命令:
>>vpa(y,10) %即取10位有效数字
10 结果为 -.4477156132e-2,即0.4477156132)>> x=sqrt(2)/2 %sqrt为开方,见表1
x =
0.7071
>> y=asin(x) %x的反正弦 y =
0.7854 (此处y为弧度,系统默认)
>> y_deg=y*180/pi %将弧度转化为角度,y_deg为变量名 y_deg =
45.0000
例5: Inf、-Inf表示正负无穷大,例如 >> 2/0
ans = Inf >> log(0)
Warning: Log of zero. ans =
-Inf >> exp(3000)
ans =
Inf (超过计算机能表示的最大的数,故显示为无穷大) NaN表示无意义,Not a Nunber的缩写,例如 >> 0/0
ans = NaN
2
二 向量与矩阵
例1:求向量a{1,1,2}、b{2,1,3}的数量积与向量积 >> a=[1,-1,2]; %生成向量a >> b=[2,1,3]; %生成向量b >> c=dot(a,b) %数量积 >> d=cross(a,b) %向量积 c = 7 d =
-5 1 3
表2:向量与矩阵常用命令 min 最小值 max mean sort length dot 平均值 排序 向量的个数 内积 std diff sum cross 最大值 标准差 相邻元素的差 总和 外积
143例2:求矩阵A652的行列式 785>>A = [1,4,3; 6,5,-2; 7,8,5] %生成矩阵A
>>t=det(A) %求A的行列式 运行结果: A =
1 4 3 6 5 -2 7 8 5 t = -96 常用指令
det(a) 求矩阵a的行列式 eig(a) 求矩阵a的特征值 inv(a)或a^(-1) 求矩阵a的逆矩阵 rank(a) 求矩阵a的秩
trace(a) 求矩阵a的迹(对角线元素之和)
例3:MATLAB中有一些函数可用来直接生成特殊矩阵,如 >> u=zeros(2,3) %生成2×3全零矩阵 u =
0 0 0 0 0 0
>> v=ones(3) %生成3×3全1矩阵 v =
1 1 1 1 1 1 1 1 1
>> w=eye(3) %生成3×3对角线为1的单位阵 w =
1 0 0 0 1 0 0 0 1
>> x=(1:2:121); % 起始值为1,每次增加2,终止值为121的向量,去掉分
号可在屏幕上显示结果
>> x=(1:121); % 起始值为1,系统默认每次增加1,终止值为121的向量 >> x=linspace(0,1,101); % 利用linspace,生成以0为起始值,1为终止值,元素数
目为101的向量
例4:对矩阵中的元素可以进行访问
>> A = [1,4,3; 6,5,-2; 7,8,5] % 先生成矩阵A
>> s=A(2,3) % s为A第二行第三列的元素 s =
-2
>> s1=A(3,:) % s1为A的第三行 s1 =
7 8 5
>> s2=A(:,2) % s2为A的第二列 s2 = 4 5 8
>> s3=A(1:2,2:3) % s3取A的一、二行,二、三列 s3 =
4 3 5 9 注:A输入后一直保存在内存工作区(工作空间,Workspace)中,同时会显示矩阵的大小(几行几列),工作区内的的变量可以随时调用,除非被清除(用命令clear清除) 矩阵中的元素可以修改,如 >> A(2,3)=9 A =
1 4 3 6 5 9 7 8 5 例5:矩阵的拼接
>> a=1:7,b=11:2:23 % 先生成矩阵a及b
a =
1 2 3 4 5 6 7 b =
11 13 15 17 19 21 23
>> c=[b a] % 利用阵列 a 及b ,组成新矩阵c c =
11 13 15 17 19 21 23 1 2 3 4 5 6 7 >> d=[b; a] % 利用a及b,组成新矩阵d d =
11 13 15 17 19 21 23 1 2 3 4 5 6 7
>> f=[b',a'] % b'表示b的转置,将行变成列 f =
11 1 13 2 15 3 17 4 19 5 21 6 23 7
>> g=[f(:,1),zeros(7,1),ones(7,2)] g =
11 0 1 1 13 0 1 1 15 0 1 1 17 0 1 1 19 0 1 1
21 0 1 1 23 0 1 1
例6: 输入矩阵x=[4,8,12,10,23;6,3,15,13,19;9,1,2,18,14;11,7,5,21,17] 运行以下命令,观察结果
m=max(x) % x每列的最大值,如果x只是一行(或一列),则m就是
这一行(或一列)向量的最大值
n=min(x) % 每列的最小值 (问:如何得到整个矩阵的最小值与最大值?)
[m,n]=size(x) % 给出x的大小,即行数和列数
l=length(x) % 给出x的列数,如果x是一行或一列向量,则给出这个
向量的元素的个数,即长度
y=x’ % 矩阵x的转置,即行与列互换
d=x(1:3,3:5) % x的第1到3行,第3到5列送给d,产生一个新矩阵 y(2,3)=y(2,3)/2 % y的第二行第三列的元素除以2,再替换原来的数 y(2, :)=y(2, :)/2 %第二行的元素全部除以二
y( :,4)=y( :,4)+y( :,2) %第四列加第二列替换原来的第四列
例7:下面介绍点运算,这是matlab特有的运算,在后面画函数图象时会用到 >>x=1:8
x =
1 2 3 4 5 6 7 8
>>y=x.^2 %如果x是一个数,它平方就用x^2,但现在x是向量,后面加点表示x的每一
个元素平方,
y =
1 4 9 16 25 36 49 >>z=x./y %x的每一个元素除以y相应的每一个元素
z =
1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250
三 函数作图
例1:画函数ysinx在区间[0,10]上的图像
>>x=0:0.1:10; %自变量x从0到10生成101个点(每隔0.1生成一个点) >>y=sin(x); %生成函数值y的101个点
>>plot(x,y); %以x为自变量,y为函数值画函数图像 运行结果:
图3
从此例可以看出,matlab画图的原理就是描点连线,因此如果点取的不密集,画出来就成了折线图,但也不能太密,否则就超出matlab的计算范围,适当即可
表3:常用画图命令列表 命 令 含 义 plot绘图函数的参数 plot 建立向量或矩阵各队队向量的图形 x、y轴都取对数标度建立图形 x轴用于对数标度,y轴线性标度绘制图形 y轴用于对数标度,x轴线性标度绘制图形 给图形加标题 给x轴加标记 给y轴加标记 在图形指定的位置上加文本字符串 在鼠标的位置上加文本字符串 打开网格线 字元 颜色 字元 图线型态 loglog semilogx y 黄色 . 点 k 黑色 o 圆 semilogy w b g r c 白色 蓝色 绿色 红色 x + * - X + * 实线 点线 title xlabel ylabel text 亮青色 : gtext grid m 锰紫色 -. -- 点虚线 虚线 2例2:在同一窗口中绘正弦曲线ysinx及抛物线yx,绘图区间[2,2],
并设置相关属性
如果仍然像上面那样在命令窗口中输入一句执行一句是很麻烦的,我们现在建立 M文档来解决此问题,步骤如下:
(1)新建一个M文档,即点击主窗口工具栏中的图标
,见下图:
图4
弹出如下窗口:
图5
(2)输入如下程序代码:
x=-2*pi:pi/20:2*pi; % 从-2π到2π每隔π/20生成一个点,共81个点 y1=sin(x); % 生成函数值y1,也是81个点
plot(x,y1,'r'); % 画函数y1=sin(x)的图像,r表示红色 hold on % 为了在同一窗口中继续画图,此命令保持
前面已经作的图形不动
y2=x.^2; % 生成函数值y2的81个点
plot(x,y2,'b*'); % 画函数y2=x^2的图像, b*表示蓝色‘*’型线 xlabel('x轴'); % x轴加标注 ylabel('y轴'); % y轴加标注 title('正弦曲线及抛物线'); % 加标题 grid on; % 显示网格线
axis([-4,4,-2,5]) % 调整图像显示范围,横坐标从-4到4,纵坐标从-2到5
(3)输入完成后,点击图标保存、然后命名,比如命名为pic.m(其中.m是系统自动加上的,表示这是一个m文件,即matlab文件)
(4)运行程序,有两种方法:第一种,点击图5中的图标即可;第二种,在命令窗口中输入文件名 >> pic
运行即可,两种方法都会弹出如下图形:
图6
说明1:程序代码中第五行命令y2=x.^2,自变量x平方时后面加了一点,这是因为x此时不是一个数,而是一系列点(81个点),即一个向量,因此x^2是没有意义的,我们要的是给x里的每一个数平方,这时我们就给x后加一个点,这种运算叫点运算(见前面向量与矩阵部分例5),再如我们要画函数y1的图像时,就应该用命令y=1./x x说明2:第三步中保存m文件,系统会自动将其保存在路径为D:\\MATLAB6\\work的work文件夹里,当我们需要查看我们以前所保存的文件时,就在这个文件夹里找,或者点击图标,
这个叫Current Directory(见图4),意思是matlab当前指向这个文件夹,只有这个文件夹里的程序,matlab才会运行,当我们想运行其他文件夹里的程序时,就要将这个当前路径改成我们想要的那个文件夹
x2y2例3:画椭圆221
32建立m文档如下:
t=[0:pi/50:2*pi]; %角度t从0到2π,每隔π/50一个点 X=cos(t)*3; %参数方程 Y=sin(t)*2; plot(X,Y);
xlabel('x'), ylabel('y'); title('椭圆') 运行结果:略
例4: 在同一个窗口中画出衰减振荡曲线yesin3t与它的包络线y0e4及
13t3y0e4,其中t[0,4]
建立m文档如下: t=0:pi/50:4*pi; y0=exp(-t/3);
y=exp(-t/3).*sin(3*t); % 注意点运算
plot(t,y,'-r',t,y0,':b',t,-y0,':b') % -r表示红色实线,:b表示蓝色点线 grid
运行结果:略
例5:在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图,
下面在一个画面里同时画四个图像,注意哪个图像在哪个区域 x=linspace(0,2*pi,30); y=sin(x); z=cos(x);
u=2*sin(x).*cos(x); v=sin(x)./cos(x); subplot(2,2,1), plot(x,y),
axis([0 2*pi -1 1]), title('sin(x)') subplot(2,2,2), plot(x,z),
axis([0 2*pi -1 1]), title('cos(x)') subplot(2,2,3), plot(x,u),
axis([0 2*pi -1 1]), title('2sin(x)cos(x)') subplot(2,2,4),
t3plot(x,v),
axis([0 2*pi -20 20]), title('sin(x)/cos(x)')
下面举例介绍画空间图像
xcost例6:画三维螺旋线:ysint
zt建立m文档如下: t=0:pi/50:6*pi; x=cos(t); y=sin(t); z=t;
plot3(x,y,z) %plot3指画三维图像 grid %添加网格线 运行结果:
图7
也可以用下面的命令:
t=linspace(0,6*pi,301); %从0到6π生成301个点 plot3(cos(t), sin(t), t); grid
例7:画空间中的曲面要用mesh命令
画出由函数形成的立体网状图:
a=linspace(-2, 2, 30); % 在x轴上从-2到2生成30个点 b=linspace(-2, 2, 30); % 同上在y轴上取30点 [x,y]=meshgrid(a, b); z=x.*exp(-x.^2-y.^2);
mesh(x, y, z); % 画出立体网状图 最后一句命令也可用下面的命令代替
surf(x, y, z); % 画出立体曲面图 运行结果:
图8
同样我们可以设置图像的颜色、光照等属性,这里不再叙述
练习:画出马鞍面zxy图像
22四 符号计算
所谓符号计算,是指分解因式、求导数等等给出解析表达式而不是给出数值结果的运算,下面举一些常用的例子。
1 求极限
axbllimx(1)sin例1:求极限
xxx>> syms x a b; %由此命令开始出现的x a b都是符号(叫符号变量),而不是以前所定义的变量,所以先用syms命令声明一下,告诉计算机下面要进行符号计算,而不是数值计算
>>f=x*(1+a/x)^x*sin(b/x); %这样的得到的函数叫符号函数 >>l=limit(f,x,inf) %inf表示无穷大 运行结果: l =
exp(a)*b
ex1例2:求极限 lim x01cosxsinx>>syms x;
>>f=(exp(x^3)-1)/(1-cos(sqrt(x-sin(x)))); >>limit(f,x,0) 运行结果: ans = 12 例3:求右极限
3x0lime1
1cosxsinxx3>> syms x;
>> f=(exp(x^3)-1)/(1-cos(sqrt(x-sin(x))));
>> limit(f,x,0,'right') %right表示求右极限,换成left就表示求左极限 运行结果: ans = 12
2 求导数
例1:求函数f(x)3xx4x6的一阶导数、二阶导数
>>syms x;
>>f=3*x^3+x^2-4*x-6;
>>f1=diff(f,x) %对x求一阶导数
>>f2=diff(f,x,2) %对x求二阶导数,将2改为3即求3阶导数,余类推 运行结果: f1 =
9*x^2+2*x-4 f2 = 18*x+2
例2:设y3x2x1,求yx1
232>> syms x;
>> y=3*x^2-2*x+1; >> y1=diff(y) >> x=1;
>> eval(y1) %此命令计算符号表达式y1 运行结果: y1 =
6*x-2 ans = 4
例3:求函数zx2sin2y的偏导数 >> syms x y;
>> z=x^2*sin(2*y);
>> Dx=diff(z,x) %z关于x求偏导数 >> Dy=diff(z,y) %z关于y求偏导数 运行结果: Dx =
2*x*sin(2*y) Dy =
2*x^2*cos(2*y)
3 积分
例1:求f(x)x的不定积分
>> syms x; >>f=x^2;
>>int(f) %求f(x)的不定积分 运行结果: ans =
1/3*x^3 %结果没有加任意常数c
例2:求定积分
220x2dx
>> syms x; >>f=x^2;
>>int(f,x,0,2) %求[0,2]上的定积分 运行结果: ans = 8/3
例3:求广义积分>> syms x; >>f=1/x^2;
11dx x2>>int(f,x,1,inf) %求(1,∞)上的广义积分 运行结果: ans = 1 例4:计算二重积分I10x1x(x2y21)dydx (先关于y积分,后关x于积分)
>> syms x y; >> z=x^2+y^2+1;
>> I=int(int(z,y,x,x+1),x,0,1) 运行结果: I = 5/2
4 解方程
例1:解一元二次方程axbxc0
>> syms x a b c >> f=a*x^2+b*x+c;
>> solve(f) %默认x是未知数,解出x
结果: ans =
[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]
>> solve(f , 'b' ) %把b当作未知数,解出b
结果: ans =
-(a*x^2+c)/x 或者用命令:
>> solve('a*x^2+b*x+c') %加引号表示引号中出现的字母都是符号,不用再用命令syms x
a b c
或者:
>> solve('a*x^2+b*x+c=0') 例2:解方程cosxsinx >> syms x
>> f=cos(x)-sin(x) >> f1=solve(f) 结果: f1 = 1/4*pi 或者用命令
>>f1=solve('cos(x)=sin(x)')亦可
2xyz1例3:解方程组 xyz2
2xyz1>>[x,y,z]=solve('x+y+z=1','x-y+z=2','2*x-y-z=1') 结果: x = 2/3 y = -1/2 z = 5/6
或者:
>>g1='x+y+z=1', %引号的作用和前面syms的作用一样,表示引号里面出现的x y
z都是符号变量
>>g2='x-y+z=2', >>g3='2*x-y-z=1', >>f=solve(g1,g2,g3) 结果: f =
x: [1x1 sym] y: [1x1 sym] z: [1x1 sym]
x y z都是符号变量,要把它们显示出来,用下面的命令 >>f.x ans =
2/3 >> f.y, f.z
ans = -1/2 ans = 5/6
5 解微分方程
d2ydy2y0 例1:解微分方程22dxdx>> y=dsolve('D2y+2*Dy+2*y=0')
结果: y =
C1*exp(-t)*sin(t)+C2*exp(-t)*cos(t) %默认自变量为t
dyd2ydy2y0,y(0)1,(0)0 例2:解微分方程22dxdxdx>> y=dsolve('D2y+2*Dy+2*y=0','y(0)=1','Dy(0)=0')
结果: y =
exp(-t)*sin(t)+exp(-t)*cos(t)
对于上面的符号函数y,可以用下面的命令画出函数图像 >> ezplot(y)
图2
x(t)y(t)例3:解微分方程组,x(0)0,y(0)1
y(t)x(t)>> [x,y]=dsolve('Dx=y','Dy=-x','x(0)=0','y(0)=1')
结果: x = sin(t) y = cos(t)
6 化简和代换
MATLAB符号运算工具箱中,包括了较多的代数式化简和代换功能,下面仅举出部分常见运算。
simplify 利用各种恒等式化简代数式 expand 将乘积展开为和式
factor 把多项式转换为乘积形式 collect 合并同类项
horner 把多项式转换为嵌套表示形式
例如:进行合并同类项执行 >> syms x
>> collect(3*x^3-0.5*x^3+3*x^2) ans=
5/2*x^3+3*x^2)
进行因式分解执行
>> factor(3*x^3-0.5*x^3+3*x^2) ans=
1/2*x^2*(5*x+6)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务