@suixinhita
2020-09-10T16:22:31.000000Z
字数 6877
阅读 825
软件学习
MATLAB
语言学习
- 第四代计算机语言
- 语言简单
- 计算功能强大
- 可视化功能强大,绘图功能强大,图像处理能力强大
- 可扩展性强、开放、扩充能力强
- 有很多现成工具
三大功能:
- 数学计算
- 可视化
- 程序设计
Simulink:类似于蓝图的可视化建模系统,基于MATLAB,可以自动生成代码
>>12+2*(7-4)\(3^2)
>>x=?
>>y=f(x)
y=
....
红色字体是错的
- 直接对于抽象的符号对象进行计算,获得问题的解析结果
符号计算的基本概念:
- 相对于数值计算的概念,在MATLAB中是使用符号运算工具箱来实现的。
- 不受误差困扰,计算可以给出完全正确的封闭解或者任意精度的数值解。
- 指令比较简单,时间较长。
- 数值运算必须要先对变量进行赋值,但符号计算不需要,运算结果会世界以标准是符号形式表达
符号计算的一般使用:
- 建立符号变量
>>syms a b c x;
- 输入方程
f=
- 把方程解出来
solve(f)
- 得到答案
ans=
软件不止一种
sym
用来建立单个符号量,写法是 符号变量名=sym('符号字符')
whos
命令可以了解到变量的特性syms
一次可以定义多个符号变量,写法是 syms 符号变量名1 符号变量名2 ...
,该语句没有进行赋值,只是创建了变量。sym
函数建立表达式 ,例如 u=sym(x*y)
,或者不写 sym
也可以sym
,例如 A=sym([a,2*b;3*x,0])
矩阵使用方括号 []
,中间换行是 ;
collect()
,针对合并 的话 collect(R,v)
,否则就是将所有的都合并expand()
simplify()
factor()
,会使用行向量去表示finverse()
,一般需要指定变量compose()
,一般是用后替代前digits(d)
确定精度为d位的有效数字vpa(a,d)
输出精度是d位的有效数字double()
转换为双精度变量 limit
函数limit(f,a)
默认 x 趋近于 a 的时候极限,不写a会默认趋向于0limit(f,'y',inf)
,是y趋近于正无穷limit(f,'x',a,'left')
是x从左边趋近于a,右侧同理微分
- 使用 diff
函数
- diff(s)
默认一阶导数
- diff(s,3)
求三阶导数
- diff(s,x,2)
对x求二阶导数
int
函数int(s)
是不定积分int(s,t)
对t不定积分int(s,t,a,b)
上下限分别是 a b 级数:
symsum(s,v,n,m)
s是通项表达式,v求和变量,n,m分别是开始项和末项taylor(f,v,a,name,value)
函数f按变量展开为泰勒级数,展开到第n项,n默认为6,a是在a处展开,'order'
写在name处代数方程:(solve
是不能解微分方程的!)
slove
函数slove(f)
默认是解 的情况ep1=a+b+c==3
方程组是 f=[a+b==2;a+c==3;b+c==4];[a,b,c]=solve(f)
微分方程:Dy表示y的一阶导数,D2y表示二阶导
dslove('表达式','初值','求导对象')
命令可以嵌套
- 对于数值进行计算,以有限精度的数字为基本的操作元素
- 数值计算是定义在数值数组的基础上,在计算前要定义变量进行赋值
存在误差,速度较快
数据的表达方式:十进制
- 复数:用特殊的变量 表示
- 变量命名规则同C++
a=m:p:n
生成步长为p的均匀等分行向量,m开头,n结尾 linspace(m,n,s)
(生成m~n中的s个等分的行向量)或 logspace(m,n,s)
(生成 ~ 之间按照对数等分的s个行向量(s默认100)A=[1,2;3,4]
[]
空矩阵、eye(n)
单位矩阵、ones(n,m
n*m的纯1矩阵、zeros(n,m)
纯0矩阵、rand(n,m)
[0,1]随机的矩阵、randn(n,m)
标准正态分布的随机矩阵、randi([imin,imax],n,m)
生成的是[imin,imax]之间的随机矩阵diag
生成对角矩阵、B = repmat(A,m,n)
,指将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。 、reshape
改变形状,比如把8*1换成4*2(一列一列排的)(使用方法是reshape(原矩阵,行数,列数)
)、flipud
以水平中线为对称轴做镜面、fliplr
以垂直中线为对称轴做镜面、rot90
逆时针旋转90°。A(i,j)
表示矩阵A的第i行第j列元素,A(2:3,3:4)
2~3行,3~4列,隔行则为 A(1:2:5,3:4)
,如果是 B(:,[1,2])
这种情况,代表列是第二列(事实上[1,2]可以换成任意[x,2],都一样),如果是A([a,b],,[c,d])
会是与A(a:b,c:d)
类似的结果。 rank
矩阵的秩、ret
矩阵行列式的值、trace
矩阵的对角线元素之和、[V,D]=eig(A)
矩阵的特征值和特征向量(AV=VD)、[R,ci]=rref(A)
阶梯矩阵和行向量。sum
函数:如果 A 是向量,则 sum(A)
返回元素之和。 sum(A)
将返回包含每列总和的行向量。sum(A)
沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。此维度会变为 1,而所有其他维度的大小保持不变。S = sum(A,'all')
计算 A 的所有元素的总和。S = sum(A,dim)
沿维度 dim 返回总和。例如,如果 A 为矩阵,则 sum(A,2)
是包含每一行总和的列向量。(1是形成行向量,2是列向量)mean
函数:指对于一个数组第一个维度不是一的维度做平均std
(标准差)、min
、max
、var
(方差)等。~
,不等于为~=
,其他同c++ int
的情况下,结果可能需要通过vpa
进行约束integral(fun,x_min,x_max)
的情况下,fun需要真的是一个“函数”,即需要使用@句柄定义和使用的“函数”。简单的定义方式如下: cumtrapz
,输入的是一串等间距的函数值,或一个包含了xy的矩阵fminbnd(fun,l,r)
,其中,fun需要是一个“函数”,否则无法通过,同时也需要进行画图判断。fzero(fun,st)
也同样需要将fun化为函数,同时需要作图得到起始点。fminsearch(fun,x0)
的使用方法如下:ode45
函数计算微分方程的解:[t,y] = ode45(odefun,tspan,y0)
其中,tspan是指时间区间,y0为初始条件 conv(a,b)
,注意第一个不能是0,除时使用[p,r]=deconv(a,b)
p是商,r是余数的系数。Ploy2sym(q,’x’)
将多项式系数向量q写成容易读的多项式p=polyfit(x,y,n)
求x,y数组所给数据的n阶拟合多项式系数向量ppk=binopdf(k,N,p)
事件A发生k次的概率Fk=binocdf(k,N,p)
事件A发生次数不大于k次的概率 px=normpdf(x,Mu,Sigma)
服从 分布的随机变量取值x的概率密度Fx=normcdf(x, Mu,Sigma)
服从分布的随机变量取值不大于x的概率密度disttool
概率函数分布工具plot
plot(x)
x是一组向量,x为纵坐标,其下标为横坐标plot(x,y)
x自变量,y函数值,如果y是n*m的矩阵,且x长为n,则以x为自变量,画m条曲线plot(x1,y1,x2,y2)
连着画多条线plot
后可以加入控制线的特征的量:对于颜色/线型/标点类型可以直接标注,例如'r:*'
代表了红色点线*标注;对于标注的特征/线宽等则需要说明,例如'lineWidth',2
和'MarkerSize',10
hold on;
可以保持上一个不被清除,hold off;
才会停止。plot(x,y,'s','线名','线宽'...)
其中's'
是开关必须加上,和设置没关系(如果是上文中的特殊标记是不需要加's'的)subplot
子图分割命令,格式 subplot(m,n,p)
m,n,q分别是行、列、图的编号,编号从左到右从上到下,如果1张图需要多个位置,可以挑选准确的位置然后使用[]
选择,例如[2 4]
。也可以采用定位左下角和右上角的坐标的方法去确定图形位置,图窗的长宽均视为1,并取左下角为点,例如subplot('position',[0.2,0.1,0.6,0.40])
figure(n)
创建窗口函数,n为窗口顺序号,使用的时候要先进行声明在第几个窗口画图。图形标注:
title
标题x(y)label('text',’property','文本属性'...)
轴标注text
在图形上指定位置加标注(这个指定位置的坐标是表上的坐标,不能标到表外)gtext
在图形任意位置加标注,使用方法是gtext('')
,然后进行鼠标选点grid on(off)
打开/关闭网格线legend(string1,string2,...)
文字标注,图例说明,可以用 Location
参数将其放在想要的位置,或者使用Pos
对图例的位置作出设置和调整: legend off
legend({'cos(x)','cos(2x)','cos(3x)','cos(4x)'},'NumColumns',2)
title(lgd,'My Legend Title')
可以为标注添加标题文字的调整:
\bf
:采用的字体加粗。\it
:采用的字体为斜体。\rm
:采用标准形式。\fontname {fontname}
:设置文字的字体。\fontsize {fontsize}
:设置字体的大小。\color {colorname}
:对字体的颜色进行设置
\lineWidth、\lineStyle、\MarkerSize
等
坐标轴调整命令axis([xmin,xmax,ymin,ymax])
manual
/自动auto [自动的轴]
tight
与数据范围完全相等/ equal
每个坐标轴单位长度一样 / image
tight+equal / square
调整单位长度使之成为方形 / vis3d
冻结比例/ normal
还原默认box on(off)
坐标轴封闭/开启命令bar
表示绘制直方图polar
表示绘制极坐标图hist
表示绘制统计直方图stairs
表示绘制阶梯图stem
表示绘制火柴杆图rose
表示绘制统计扇形图comet
表示绘制彗星曲线errorbar
表示绘制误差棒图compass
表示复数向量图(罗盘图)feather
表示复数向量投影图(羽毛图)quiver
表示向量场图area
表示区域图pie
表示饼图convhull
表示凸壳图 scatter
表示离散点图plotmatrix
表示散点图yyaxis
可以画出有两个y轴的图形semilogx
画出来的函数中x是取对数的ginput
命令用于显示鼠标处的坐标点fill
命令用于绘制二维多边形并进行填色,使用方法fill(x,y,'颜色')
plot3
(可查询help graph3d)meshgrid(x,y)
用于生成平面网格点的坐标fill3
与fill
使用方法相同
三维网格图 mesh(z)
z为n*m矩阵,xy坐标为元素下标
meshgrid
surf(x,y,z)
,surfc
带等高线的曲面图contour(Z,n)
绘制n条等高线,如果有返回值就是等高线坐标 Clabel(c)
用于给等高线加标注fsurf(fun,取值范围,'其他要求','')
其中,fun必须是一个“函数”,并且需要注意的是不能是一个inline函数,会报错,需要使用@
色图设定函数 colormap([R,G,B])
,其中有部分预设如下:
- 在图像中还有对其的修饰
- shading interp
根据小方块四角的值差补过度点的值确定颜色
- shading flat
去掉黑色线条,根据小方块的值确定颜色
- 'EdgeColor','none'
是可以将边框颜色去掉的
- hidden on(off)
是开关透视效果的
- view(az,el)
用于调整视角,az是方位角,el是俯视角
>>notebook-setup
在word里面寻找加载项fuction
(如果是脚本则不需要),之后写返回值的变量名=函数名(自变量)
,最后需要加上end
,与C++相类似,如果可以使用全局变量把结果传递出函数,也可以不写返回值是什么变量。nargin
表示所用函数输入变量的个数,可以在函数内部判断输进了几个函数,也可在函数外查询最多能输进去几个函数。nargout
是检测有多少个输出,该函数只能在函数内部使用clear
释放内存global
全局变量的声明,在定义和引用的时候都需要声明,(在函数里面定义了的 global 变量,在外面想引用需要先声明。logical
逻辑运算 A(A>0)=1
可以直接将A中大于0的变成1
for
循环,写成
for index=start:increment:end
...
end
MATLAB 的 for
循环中可以使用矩阵,i=A的话是每次取一列进行循环。
if
语句 (break)也可以使用 if ....
...
else
...
end
switch
语句,同C++echo on
/echo off
显示/隐藏命令(尤其是M文件里面的命令,对调试有帮助)x=input('提示语句')
来输入xpause
暂停用 tic
秒表计时器,会记录下当前时间;toc
秒表停止器,可以得到使用了多长时间;使用方法是st_time=tic; used_time=toc(st_time);
结构数组(结构体)与C++的结构体类似。
cell
单元格数组,需要使用花括号 {}
,里面可以放各种变量类型,类似于变换了的结构体,只是不需要自己定义里面有什么,可以直接使用。
@
标注