最近一段时间大概学习了一下matlab,在这里做一下总结,有不对的地方真心希望大佬指教,本人小白一枚。
matlab作为一款集计算,统计,代数,矩阵,方程,各种算法,还有强大的绘图功能于一身,确实相比其他软件要好用,大多数情况下只要调用函数便可实现我们想得到的结果,matlab对已有的算法和功能的使用确实比较强,但是对于比较高级和创新型的算法自我感觉还是不到java或者是c++。
一.强大的计算功能
1.线性方程组的一个解
1>Ax=b,x=pinv(A)*b
若线性方程组有一个解,则matlab给出该解;若线性方程组无解,则matlab给出最小二乘解,即|Ax-b|^2最小;若线性方程组有许多解,则给出最小范解;
2>若给定条件xa=b,则x=solve(x*a==b),但是自我感觉还是pinv()函数好用;
2.线性方程组的通解
[R,lie]=rref(a),返回值R是矩阵a的行最简式,lie是a的列向量组的最大无关组的标号,a是线性方程组的未知量的系数和和右端数值的大小组成的矩阵;
3.非线性方程的零点
1>a=roots(p),p是该非线性多项式的次数前面的系数,如x^6-5x^5+3x^2+7=0,则p=[1,-5,0,0,3,0,7],a为这个多项式所得到的全部解;
2>fzero 可以求出给定初值附近的一个数值解,a=fzero(x,y),其中x是该多项式,y是给定的初值,a是所求出的数值解;
4.非线性方程组的符号解
s=solve([X1,X2,X3......],var),[X1,X2,X3......]为所给的方程组,var为符号变量,s为求得的符号解;
5.非线性方程组的数值解
s=fsolve(fun,x0,var),其中fun是定义方程的函数,x0是初值,var是优化参数的设置;
6.矛盾方程组的最小二乘解(何谓矛盾方程解,通俗点说,就是方程的个数大于未知量的数目)
1>用刚才提到的pinv函数可以求得,调用的形式也相同;
2>x=lsqnonlin(fun,x0),其中fun是方程组匿名函数的返回值,x0是初始值;
7.常微分方程组的符号解
a=dsolve(fun,x0),fun为符号微分方程,x0是初值或者边界,在matlab中求导数的函数是diff函数diff(x,2)指x的二阶导数
8.常微分方程组的数值解
[t,y]=obe45(fun,qujian,y0],其中fun是M函数或者是匿名函数定义的f(t,y),qujian指一个区间[to,tfinal],to必须是初始条件中自变量的取值,tfinal可大可小,y0是初值,t是matlab自动离散化的[to,tfinal]上的点,y是点t所对应的值
9.高阶微分方程组的数值解
在matlab中没有求解高阶微分方程特定的函数,我们需要把它化为一阶,然后再调用函数,其中主要用到diff函数
10.矩阵运算
在这里,我就不啰嗦特殊矩阵的命名函数,说一下矩阵中元素或者块的常用操作
1>a([i1:i2],:)=[],删除a的i1~i2行;
2>a=(:,[i2:-1:i1])以逆序提出矩阵i1~i2列
3>diag(a,k)抽取矩阵 a的第 k 条对角线元素向量(主对角线编号为 0,上方的 编号依次加 1,下方的编号依次减 1); 若 a为向量,生成一个以 a 为第 k 对角线元素的方阵
4>tril(a,k)抽取矩阵 a的第 k 条对角线下面的部分
5>triu(a,k)抽取矩阵 a 的第 k 条对角线下面的部分
6>flipud(a)矩阵a进行上下翻转
7>fliplr(a)矩阵a进行左右翻转 8>inv(a)求矩阵a的逆 9>det(a)矩阵a的行向量 10>rank(a)矩阵a的秩
11>eig(a)求矩阵a的特征值及特征向量 12>var(a)求矩阵的列方差(std(a)---标准差) 13>cov(a)矩阵列的协方差矩阵
总结:1>在方程求解的过程中,matlab不用再编写程序,直接按格式调用函数即可;
2>为什么会有符号解和数值解两种情况呢?
其实微分方程等不一定有精确解,也就是符号解,或者叫解析解,所以要把它转化成数值解来输出,通俗点说,数值解是在方程组在无解的情况下的一种补救措施;
3>在求解过程中,我们一定要把方程和矩阵联系起来,很多时候,它们似乎是一一对应的关系,例如可以通过矩阵和增广矩阵的秩来判断线性方程组是否有解,把系数组成的矩阵化成最简矩阵,可以很容易求得其解;
4>遇到复杂的方程组,我们可以通过转化组成为以上几种方程形式,然后再调用相应的函数。
二.多维的绘图功能
1.简单的plot(x,y,'color-style-marker')函数
2.一个窗口分成多个子窗口subplot(m,n,y)分成m*n个窗口,并且将该图化在第y个子窗口中
3.fplot(fun,limit,tol,miaoshu),fun指函数,limit限制了范围,tol指相对误差,描述是指对线条的修饰
4.三维绘图命令
plot3(x,y,z)分别指横坐标,纵坐标,竖坐标
mesh(x,y,z)画网格曲面,x是m维的向量,y是n维的向量,z是m*n的矩阵
surf(x,y,z)画三维表面图
ezsurf(fun,qujian)在指定的区间内画函数f
ezmesh(fun,qujian)在指定的区域内画出二元符号函数网格图f(x,y)
5.四维空间绘图
cplxgrid(m)构建一个极坐标的复数数据网格,产生一个(m+1)*(2*m+1)的极坐标下的复数数据网格,最大半径为1的圆
cplxmap对复变函数(四维)做图,其方法是三维空间坐标再加上颜色cplxmap(z,f(z)),它在作图时,以xy平面表示自变量所在的复平面,以z轴表示复变函数的实步,以颜色表示虚部
绘图的修饰功能:
坐标轴显示:axis('auto')将坐标轴设置返回默认状态;axis('off/on')不显示/显示坐标轴 axis('square')将坐标轴设置为正方形
axis('equal')将两个坐标轴刻度设置为相等
坐标轴范围:axis[x1,x2,y1,y2]
grid off/on(不)显示网格线
绘制叠加图形:hold (off)on(不)启动图形保持功能
增加图例:legend('s1','s2') 增加标注:text(x,y,'s')在二维图形指定位置(x,y)处增加标注s
增加箭头:annotation('arrow',x,y)添加从点(x(1),y(1))到(x(2),y(2))的箭头
产生网格数据:meshgrid(t,s)(二维)(生成极坐标的网络数据)
三:高效处理统计学中概率问题
1.概率分布
- 离散型随机分布:
- 二项分布binopdf(k,n,p)n:实验总次数,p:每次所发生的概率,k:事件发生k次
-
二项分布累计概率值:binocdf(k,n,p)n:实验总次数,p:每次所发生的概率,k:事件发生k次
-
概率和累计概率差别:相当于发生一次和至少发生一次的差别
-
泊松分布:poisspdf(k,o)k:事件发生次数,o是参数/条件:1>事件相互独立 2>事件概率相同 3>求事件发生x次的概率
-
泊松分布累计概率值:poisscdf(k,o)k:事件发生次数,o是参数
-
超几何分布:hygpdf(k,n,m,t)k:抽的次品数,n产品总数,m次品总数,t抽的次数(不放回抽取)
-
超几何分布累计概率值:hygcdf(k,n,m,t)k:抽的次品数,n产品总数,m次品总数,t抽的次数
-
连续型随机分布:
-
均匀分布:unifpdf(x,a,b)表示(a,b)上均匀分布概率密度在x处的函数值
-
指数分布:exppdf(x,o)参数为o的指数密度函数
-
正态分布:normpdf(x,a,b)参数为a,b的正态分布概率密度函数
-
分布函数是专用函数计算累计函数概率的函数值
-
分布函数所调用的函数只是将上边的函数中的pdf改为cdf
2.数字特征
离散型:
1>数学期望:sum(x)-----x是向量,sum(x)是所有数的和/x是矩阵,sum(x)是各列元素之和,返回一个行向量
2>均值函数:mean(x)------x的不同形式导致的不同数值与sum相似
3>方差:由公式可得,方差的计算是dx=sum(x.^2*p)-(EX).^2
连续型:
1>数学期望,方差都可以根据数学期望来计算dx=e^2(x)-e(x^2)
但是matlab在统计工具箱中给了很多现成函数,只需要把随机分布函数中后边的pdf或者cdf改为stat
注明:该图像来自于百度
3.统计直方图
1>hist(z,n)直角坐标系下的统计图,n表示直方图的区间数
2>rose(z,n)极坐标下角度直方图,n是[0,2]范围内所分区域数,z为指定的弧度数据
4.参数估计
1>点估计
mean(x)----均值估计 median(x)-----中位数 var(x)-------方差 std(x)-------标准差 skewness-------偏差
注明:该图像来自于百度
5.假设检验
1>单个正态总体方差知道,对期望的假设检验-----z检验方法
x=ztest(X,a,b)X是样本,a是期望值,b是正态总体标准差----若x=0,则接受原假设,若x=1,则拒绝原假设
2>单个正态总体方差未知,对期望的假设检验-----t检验法
x=ttest(X,,m,n)X是样本,m是期望值,n是所代表的水平----若x=0,则接受原假设,若x=1,则拒绝原假设
3>两个正态总体均差值的检验-----t检验
[h,sig,ci]=ttext(x,y),sig为观察值的概率,ci为置信区间
注意:在matlab中还有很多与c++相同的地方,比如循环体,赋值语句,变量,常量,运算符.......我们可以通过类比来学习,达到事半功倍的效果。
有关与matlab中算法相关的知识点,比如求最短路的floyd算法,排队论中的poisson过程......,有时间再更新,今天有点肝不动了。。。。