《matlab程序设计》课程体系.docx
《《matlab程序设计》课程体系.docx》由会员分享,可在线阅读,更多相关《《matlab程序设计》课程体系.docx(36页珍藏版)》请在冰豆网上搜索。
《matlab程序设计》课程体系
第一讲:
Matlab介绍及桌面操作环境
一、matlab介绍
(1)历史背景
产生的背景
版本:
1992年(v4.0),1997年(v5.0),1999年(v5.3),2000年(v6.0),2002年(v6.5),2004年(v7.0)。
操作系统:
windows(98、2000、xp),Dos(unix、linux)
(2)特点
①工作界面友好,操作简单;
②编程语言简单,程序设计自由;
③计算能力强大,库函数资源丰富;
④超强图形处理能力;
⑤源代码开放,工具箱应用广泛;
⑥图形用户界面(GUI)设计和应用程序接口(API)
(3)安装与卸载
(4)启动与退出
启动:
①单击Windows开始菜单,依次选择程序→MATLAB7.0→MATLAB7.0;②运行MATLAB系统启动程序matlab.exe;③ 如果用户在桌面上建立了快捷方式,也利用快捷方式启动MATLAB系统。
退出:
①在MATLAB主窗口File菜单中选择ExitMATLAB命令;②在MATLAB命令窗口输入Exit或Quit命令;③单击MATLAB主窗口的关闭按钮。
(5)工作界面(主窗口)
二、桌面操作环境
(1)窗口
①命令窗口
主要操作:
输入、输出,运行函数,执行程序。
常见命令及功能:
clc、clear、clearall、clear变量名、clf(清楚图形窗口内容)、delete文件名、help文件名、which文件名(查找文件路径)、svae、load、size、↑、↓、ctrl+c(ctrl+break)。
②M文件编辑/调试器
③历史命令窗口
④当前目录窗口
⑤工作空间窗口
⑥图形窗口
(2)菜单
①file:
常用菜单项:
new、open、importdata、preferences、pagesetup(页面设置)、print、exit。
②edit(编辑菜单),很多时候采用快捷键实现。
③debug(调试菜单)
④desktop
⑤window
⑥help(有效利用帮助信息)
(3)工具条
(4)帮助系统
①联机帮助系统
菜单help或快捷键F1;工具条上问号按钮;在命令行窗口输入helpdesk、helpwin、doc命令;
②联机演示系统
help->demos;在命令窗口输入demos。
③在线帮助系统
help->webresources(网络资源)+checkforupdates(检测更新)。
④命令查询系统
help函数名;help->demos->search+函数名。
第二讲:
Matlab基本运算
一、数值类型
(1)变量
①命名规则
(a):
变量名以英文字母开始,由字母、数字、下划线组成,不能有空格和标点符号;
(b):
区分大小写;
(c):
变量名长度不能超过31位,超过部分将被忽略;
(d):
某些常量也可作变量名,如虚数单位i。
②变量的显示
format:
短格式(5位定点数);
formatlong:
长格式(15位定点数);
formate:
短格式e方式;
formatlonge:
长格式e方式;
formatbank:
2位十进制格式;
③变量存取
save:
存储
load:
读取
(2)常量
matlab中常见常量:
pi:
圆周率
i(j):
虚数单位
inf:
无穷大
nan:
“notanumber”即不定值
自然对数的底e:
[exp(x):
计算e的x次方],故e=exp
(1).
二、关系运算与逻辑运算
(1)关系运算符:
大于:
>大于等于:
>=
小于:
<小于等于:
<=
等于:
==不等于:
~=
(2)逻辑运算符:
逻辑与:
&逻辑或:
|逻辑非:
~
三、数学运算符和基本数学函数
(1)数学运算符
加:
+减:
-乘:
*
右除:
/左除:
\乘方:
^
(2)常用数学函数
abs(x):
sqrt(x):
exp(x):
log(x):
log2(x):
log10(x):
sin(x):
cos(x):
tan(x):
cot(x):
sec(x):
csc(x):
asin(x):
acos(x):
atan(x):
acot(x):
real(z):
imag(z):
conj(z):
取整函数:
round(x):
4舍5入
fix(x):
向零取整
floor(x):
向小取整
ceil(x):
向大取整
rem(x,y):
x除以y的余数
gcd(x,y):
求整数x与y的最大公因子
lcm(x,y):
求正整数的最小公倍数
四、矩阵及其运算
(1)矩阵的创建
向量(横向量、列向量),矩阵
例如:
>>a=[1234]%建立一个4维行向量
>>b=[2;4;6;8]%建立一个4维列向量
>>c=[1011;0011;0101;1110]%建立4行4列的矩阵
>>d=[1234;4356;2213]%建立3行4列矩阵
(2)矩阵的访问
向量单个元素访问:
a(i)
矩阵单个元素访问:
c(i,j)
访问矩阵某一行:
d(i,:
)
访问矩阵某一列:
d(:
j)
访问矩阵某一块:
d(1:
2,2:
4)
(3)矩阵的基本运算
加(+)、减(-)、乘(*)、左除(/)、右除(\)、幂(^)、转置(‘)、求逆(inv())
(4)常用矩阵函数
方阵的行列式:
det(A)
矩阵的秩:
rank(A)
矩阵的特征值和特征向量:
eig(A)
计算矩阵特征方程的根:
poly(A)(参考帮助系统)
diag(A):
生成由矩阵A的主对角元素组成的列向量;
diag(X):
生成由向量X的元素为主对角元素,其余元素为零的方阵;
triu(A):
生成上三角矩阵;
tril(A):
生成下三角矩阵;
(5)常见特殊矩阵
zeros():
产生元素全为0的矩阵
ones():
产生元素全为1的矩阵
eye():
产生单位矩阵
rand():
产生均匀分布的随机矩阵
randn():
产生正态分布的随机矩阵
五、符号运算
(1)创建符号对象
①sym函数:
一次定义一个符号;
格式:
符号变量=sym(‘符号字符串’)
②syms函数:
一次定义多个符号;
格式:
symsx1x2x3......
例如:
>>u=sym('3*x^2+5*y^2+2*x*y+6')
>>symsxy
>>v=x^2-2*y^2+x*y
>>2*u-v+2
(2)符号表达式的四则运算
symsxy;
s1=2*x^2-x+5;
s2=x^2+3*x-2;
s1+s2
s1-s2
s1*s2
s1/s2
①因式分解:
例如:
>>s=sym('x^2-2*x-3');
>>factor(s)
又如
s=sym('6*x^4+5*x^3+5*x-6');
factor(s)
再如
f=factor(123)
②多项式展开
s=sym('(2*x+3)*(3*x-2)*(x^2+1)')
expand(s)
(3)符号微积分运算
①极限
命令:
limit(F,x,a)%计算函数F当x趋向于a时的极限;
例1:
求
>>symsx;
>>limit((x^2-1)/(x-1),x,1)
例2:
求
>>symsx;
>>limit((cos(x)-cos(3*x))/(x^2),x,0)
例3求
>>symsx;
>>limit((x+sin(x))/x,x,inf)
②导数
一阶导数
命令:
diff(F)%计算函数F的导数
例1求
的导数
>>symsx;
>>diff(3*x^2+2*x+1)
命令:
diff(F,x)%计算函数F关于x的导数
例2求
的导数
>>symsax;
>>diff(cos(a*x^2-1),x)
例3求
关于a的导数
>>symsax;
>>diff(cos(a*x^2-1),a)
高阶导数:
命令:
diff(F,x,n)
例4:
求
的二阶导数
>>symsx;
>>diff(3*x^2+2*x+1,2)
例5:
求
关于x的二阶导数
>>symsax;
>>diff(cos(a*x^2-1),x,2)
例6:
求
的二阶混合导数
>>symsax;
>>dx=diff(cos(a*x^2-1),x);
>>dxa=diff(dx,a)
③积分
不定积分
命令:
int(F)%求F的不定积分
例1:
求
>>symsx;
>>int(cos(2*x-1))
例2:
求
>>symsx;
>>int(x/sqrt(x+1))
定积分
命令:
int(F,a,b)%求F在[a,b]上的定积分
例3:
求
>>symsx;
>>int(x^3*atan(x),0,1)
例4:
计算广义积分
symsx;
int(1/(1+9*x^2),-inf,inf)
二重积分:
例5:
计算二重积分
,D由
和
围成。
若先对y积分,则积分限为:
,
>>symsxy;
>>z=0.5*(2-x-y);
>>z_y=int(z,y,x^2,x);
>>z_y_x=int(z_y,x,0,1)
第三讲:
Matlab数值计算
一、解方程
(1)直接解法
①roots函数
格式:
roots(P)%计算多项式方程P=0的根
例1:
求方程
的根
>>P=[1-2-3];%用向量表示多项式,即P是多项式的系数向量
>>roots(P)
例2:
求方程
的根
>>P=[1-203-8];
>>X=roots(P)
②fsolve函数
格式:
fsolve(‘fun’,x0)%计算fun=0的根,x0为估计根的初始值
[x,fva]=fsolve(‘fun’,x0)%输出根x及x处的函数值
[x,fva,exi]=fsolve(‘fun’,x0)%输出根x及x处的函数值,exi为1表示正常退出
例3:
求方程
的根
>>[x,fva]=fsolve('x*3^x-1',0.8)
例4:
求方程
的根
>>[x,fva,exi]=fsolve('x*exp(2*x)-8',0.8)
>>[x,fva,exi,out]=fsolve('x*exp(2*x)-8',0.8)
③fzero函数
格式:
fzero(‘fun’,x0)%计算fun=0的根,x0为估计根的初始值,可是是常数,也可以是区间,若是常数则计算x0附近的根,若是区间,则计算区间里的根,无根则输出错误信息。
[x,fva]=fszero(‘fun’,x0)%输出根x及x处的函数值
[x,fva,exi]=fzero(‘fun’,x0)%输出根x及x处的函数值,exi为1表示正常退出
例5:
求方程
的根
>>x=fzero('x^2+x-1',0.5)
>>x=fzero('x^2+x-1',-2)
>>x=fzero('x^2+x-1',[12])
>>x=fzero('x^2+x-1',[02])
>>[x,fva,exi,out]=fzero('x^2+x-1',[02])
(2)其它迭代解法
如二分法、牛顿切线法、不动点迭代法、弦截法等,这些算法的实现将在第五讲应用举例中讲述。
二、求解方程组
(1)线性方程组
①矩阵求逆法
例1:
求解线性方程组
>>A=[123;-137;903];
>>b=[1;4;7];
>>x=A\b
或者
>>A=[123;-137;903];
>>b=[1;4;7];
>>x=inv(A)*b
②矩阵分解法
LU分解
命令:
[L,U]=lu(A)%对AX=B的系数矩阵A进行lu分解,使A=LU,则原方程变为LUX=B,则X=U\(L\B)或X=inv(U)*inv(L)*B.
例2:
利用LU分解求解线性方程组
>>A=[1.53-0.84;20910;-74.8-0.61;1412.3-45];
>>B=[4;0;1;-2];
>>[L,U]=lu(A)
>>X=U\(L\B)%或X=inv(U)*inv(L)*B
QR分解
命令:
[Q,R]=qr(A)%对AX=B的系数矩阵A进行qr分解,使A=QR,则原方程变为QRX=B,则X=R\(Q\B)或X=inv(R)*inv(Q)*B.
例3:
利用QR分解求解线性方程组
>>A=[10.50.33330.25;0.50.33330.250.2;...
0.33330.250.20.1667;0.250.20.16670.1429;];
>>B=[1;2;2;1];
>>[Q,R]=qr(A)
>>x=R\(Q\B)或X=inv(R)*inv(Q)*B
Cholesky分解
命令:
[R,p]=chol(A)%对AX=B的系数矩阵A进行Cholesky分解,使A=R'R,则原方程变为R'RX=B,则X=R\(R'\B)或X=inv(R)*inv(R')*B.若A正定对称,则p为0,否则p为一正整数。
例4:
利用QR分解求解线性方程组
>>A=[9-3630;-36192-180;30-180180];
>>B=[1;1;1];
>>[R,p]=chol(A)
>>x=R\(R'\B)%或X=inv(R)*inv(R')*B
③迭代法
如Gauss-Seidel迭代法、Jacobi迭代法等,这些算法的实现将在第五讲应用举例中讲述。
④超定方程的近似解法
伪逆法:
X=pinv(A)*B
最小二乘法:
X=lsqnonneg(A,B)
例5:
利用伪逆法和最小二乘法求解超定方程组
>>A=[1-23;410;716;958];
>>B=[1;0;1;0];
>>X1=pinv(A)*B%利用伪逆法
>>X2=lsqnonneg(A,B)%利用最小二乘法
⑤欠定方程AX=B的通解
matlab在求解欠定方程组时,只给出其中一组解,不会给出方程组的通解,但是可以用rref命令<化为行阶梯>(查看增广矩阵的秩和系数矩阵的秩)来分析方程是否有通解。
例6:
求欠定方程的通解
>>A=[123-1;321-1;1-2-51];
>>B=[2;4;0];
>>X=A\B
X=
1.25
0
0.25
0
>>rref([AB])
ans=
1.000-1.0001.00
01.002.00-0.500.50
00000
显然有通解为:
当
就是系统给出的特解。
(2)非线性方程组
①直接解法
直接采用fsolve函数进行求解。
例7:
求方程组
的根,初始解为x=[2,2].
解:
首先建立函数的m文件,文件名为myfun.m:
functionF=myfun(x)
F=[x
(1)^2-x
(2)-2;-2*x
(1)+x
(2)^2-4];
然后再命令窗口中输入:
>>x0=[22];
>>[r,val]=fsolve(@myfun,x0)
结果为:
r=
2.214319743378112.90321192591201
val=
1.0e-011*
0.20752288776293
0.152********251
也可以用fsolve函数求解矩阵方程;
例8:
求矩阵方程
的一个根,初始解为x0=[1,1;1,1].
解:
首先建立函数的m文件,文件名为matrixfun.m:
functionF=matrixfun(x)
F=[x*x-[-11,-8;24,-3]];
然后再命令窗口中输入:
>>x0=[1,1;1,1];
>>[r,val]=fsolve(@matrixfun,x0)
结果为:
r=
0.99999999999957-1.99999999999959
6.000000000000102.99999999999989
val=
1.0e-011*
0.140687461680500.27231550348006
-0.284217094304040.16089352072868
可以验证结果。
②迭代解法
非线性方程组的数值解法大多源于非线性方程的解法,区别是将数的计算换成了矩阵的计算。
常用的非线性方程组的迭代算法有不动点迭代法和牛顿迭代法等。
具体算法实现将在第5讲中讲述。
三、解微分方程
(1)直接解法
函数:
dsolve
格式:
(1)dsolve(‘equation’)%给出微分方程的解析解,表示为t的函数。
(2)dsolve(‘equation’,’v’)%给出微分方程的解析解,表示为v的函数。
(3)dsolve(‘equation’,’condition’)%给出微分方程初值问题的解,表示为t的函数。
(4)dsolve(‘equation’,’condition’,’v’)%给出微分方程初值问题的解,表示为v的函数。
例1:
计算
的通解。
>>dsolve('Dy=x^2')
ans=
x^2*t+C1
由于系统默认的自变量是t,故在求解时将x看作了常数。
>>dsolve('Dy=x^2','x')
ans=
1/3*x^3+C1
此解才是我们想要的解。
例2:
计算
的通解
>>dsolve('Dy+3*x*y=x*exp(-x^2)','x')
ans=
exp(-x^2)+exp(-3/2*x^2)*C1
例3:
求微分方程
在初始条件
下的特解。
>>dsolve('x*Dy+2*y-exp(x)=0','y
(1)=2*exp
(1)','x')
ans=
(exp(x)*x-exp(x)+2*exp
(1))/x^2
例4:
求二阶微分方程
的通解。
>>dsolve('D2y+2*Dy+exp(x)=0','x')
ans=
-1/3*exp(x)-1/2*exp(-2*x)*C1+C2
(2)微分方程(组)数值解法
请在学了数值计算方法后自学这部分内容。
主要方法有欧拉法、龙格-库塔法、预估-校正法等。
四、数理统计
(1)数据排序、最值、均值、查找
①排序
命令:
sort(x)%向量x按曾序排列;
[y,ind]=sort(x)%向量x增序排列为y向量,并输出下表向量;
例1:
已知某5个同学的数学、外语、计算机成绩分别为math=[8678829185];english=[6248716966];computer=[8879769496],请将按各科分数增序排列,并分别找出各科的最差生和最优生。
②最大、小值
命令:
max(x)%求向量的x的最大元素值;
min(x)%求向量x的最小元素值;
max(A)%求矩阵A每一列中最大值组成的行向量;
min(A)%求矩阵A每一列中最小值组成的行向量;
max(A,B)%求矩阵A和B中对应元素最大值组成的矩阵;
例2:
找出数学最高分和英语最低分;将各科成绩写成一个矩阵result=[math;english;computer],利用相应命令寻找各科的最高最低分和每个同学的最高最低分。
③均值(期望)
命令:
mean(x)%求向量x的平均值;
mean(A)%计算矩阵A每一列的均值
例3:
计算每门课程的平均成绩和每个同学的平均成绩;
④查找
命令:
find(express)
例4:
找出数学成绩最高的是第几个学生、高于平均成绩的是那几个学生;
>>find(math==max(math))
>>find(math>=mean(math))
(2)和与积
①和、累计和
命令:
sum(x)%求向量x所有元素之和
sum(A)%求矩阵A的各列元素和;
cumsum(x)%求向量x的累计和向量
例5:
求1+3+5+…+99;
>>x=1:
2:
99;
>>sum(x)
例6:
求每个学生的总成绩;
例7:
cs1=[342563];cs2=cumsum(cs1);plot(cs1);holdon;plot(cs2);
例8:
cs3=ones(4);cs4=cumsum(cs3);
②积、累计积
命令:
prod(x)%求向量x所有元素之积
prod(A)%求矩阵A的各列元素积;
cumprod(x)%求向量x的累计积向量
(3)方差、标准差
命令:
var()%方差
std()%标准差
例8:
>>a1=rand(1,200);%在0到1之间产生200个均匀分的随机数
>>mean(a1)%计算其期望
>>var(a1)%计算其方差
>>std(a1)%计算其标准差
(4)协方差、相关系数
命令:
cov()%协方差
corrcoef()%相关系数
例9:
>>cov(a1)%计算a1的协方差(方差)
>>cov(a1,a2)%计算a1和a2的协方差
>>corrcoef(a1,a2)%计算a1和a2的相关系数
>>b1=[1234567];
>>b2=[24.15.87.910.212.515];
>>corrcoef(b1,b2)%计算>>corrcoef(a1,a2)%计算b1和b2的相关系数
(5)随机数的产生
命令:
random%参考help
例10:
>>y=random('normal',0,1,1,10000);%产生0均值1方差1行10000列的正太分布随机数;
>>mean(y)%检验均值
>>var(y)%检验方差
>>y1=random('poisson',10,1,10000);%产生均值为10的1行10000列的泊松分布随机数;
>>mean(y1)%检验均值
>>var(y1)%检验方差
>>y2=random('exp',2,1,10000);%产生均值为2的1行10000列的指数分布随机数;
>>mean(y2)%检验均值
>>var(y2)%检验方差
综合例:
某校60名学生的一次考试成绩如下:
937583939185848277767795948991888683968179977875676968848381756685709484838280787473767086769089716686738094797877635355
1)计算均值、标准差、极差,画出直方图;
2)检验分布的正态性;
3)若检验符合正态分布,估计正态分布的参数并检验参数。
>>x=[93758393918584827776779594899188868396817997787567696884838175668570948483828078747376708676