微信公众号:数学的情怀
点击上方,选择星标或置顶,每天给你送干货!
该排版使用了md2All,是markdown排版神器,可同时在微信公众号、博客园、掘金、csdn等平台正确显示当前预览的效果
写在前面
还有半个来月美赛,八一便写篇maltab全教程,本文适用于完全没有任何matlab基础的学生看,但同时也可以给那些曾对matlab熟悉的同学进行回忆。。。一般常用的数学软件有Maple,Mathematica,Matlab
等;常用的大型统计软件有SAS,SPSS,hadoop
等。下面我主要介绍一些Matlab的教程。
Matlab有五大通用功能:数值计算(Numeric),符号运算(Symbolic),数据可视化(Graphic),数据图形文字统一处理(Notebook)和建模仿真可视化(Simulink)。它在线性代数,矩阵分析,数值计算及优化问题,还包括数理统计和随机信号分析,电路与系统,建模和仿真等众多领域的理论研究和工程设计中得到了广泛应用。它是1984年由美国Mathworks 公司推向市场。该软件有三大特点:一是功能强大;二是界面友善,语言自然;三是开放性强。Matlab的版本目前是Matlab2018。
matlab简介介绍
首先我们要认识下什么m文件,有三点:(1)如果我们想灵活应用matlab去解决实际问题,充分调用matlab的科学技术资源,就需要编辑m文件;(2)包含matlab语言代码的文件称为m文件,其扩展名为m;(3)编辑m文件可使用各种文本编辑器。然后将matlab语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。一般m文件的语法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,matlab是解释性的编程语言。
m文件有两类
- 独立的m文件 — 称命令文件:实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。
命令文件包括两部分:注释文件和程序文件
%RANK Number of linearly independent rows or columns.
% K = RANK(X) is the number of singular values of X
% that are larger than MAX(SIZE(X)) * NORM(X) * EPS.
% K = RANK(X,tol) is the number of singular values of X that
% are larger than tol.
% Copyright (c) 1984-94 by The MathWorks, Inc.
- 调用m文件 — 称函数文件:matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数——用type sin查不到。调用格式:y=sin(2*x) 实际应用中:
x=0:2*pi/180:2*pi;
y=sin(2*x)
plot(x,y)
matlab的程序结构与运算符
matlab语言的程序结构与其它高级语言是一致的,分为顺序结构,循环结构,分支结构。
- 顺序结构—— 依次顺序执行程序的各条语句;
- 循环结构 —— 被重复执行的一组语句,循环是计算机解决问题的主要手段。 循环语句主要有:(1)for -end(中间为可执行语句);(2)while -end;(3)分支结构(if — else — end语句有3种形式,用elseif可替代一般高级语言中的switch-case-end语句)
在条件表达式中,通常都是由
- 关系操作符 >, < ,<=, >=, = =, ~= 等
- 逻辑操作符 &,| , ~等
- 逻辑函数:isequal —— 若是相等则为真;isempty ——若是空矩阵则为真;isstr —— 若是字符串则为真。
Matlab 运算符分五类:数学、关系,逻辑、位、集合
数学运算符:是进行各种数学运算,按其优先级别依次为
- 转置.’、共轭转置’、幂次.、矩阵幂次^
- 正、负号+、-
- 乘法.、矩阵乘法、元素左右除.\、./、矩阵左右除\、/
- 加减法+、-
- 冒号:在同一优先级中,运算自左至右完成,对运算顺序不确定时,最好以 “()” 实现强制运算顺序.
对于矩阵,右除A/B,相当于XB=A 的解矩阵,左除A\B,相当于AX=B 的解矩阵
关系运算符:有六种关系运算符==,~=,>,>=,<,<=
关系运算符总是以矩阵内元素对元素做运算,若满足关系,则返回 1,不满足则返回 0
逻辑运算符:有三种:&(与),|(或),~(非)
相关命令还有:all(),any()。当所有向量元素为 “真”,all 返回 1,而当任意元素为 “真”,any 即返回 1
位运算符:对非负整数的逻辑运算,主要函数如下
- bitand():位对位 AND
- bitor():位对位 OR
- bitxor():位对位异或
- bitset():设定某位
- bitget():取得某位
- bitcmp():位对位取反
- bitshift():位移(左移)
集合运算符:仅限于向量运算,此时 matlab 将向量视为集合来进行各种集合运算,常用命令如下
- Union():并集
- intersect():交集
- setdiff():差集
- setxor():异或
- unique():最小等效集合
- ismember():元素是否属于集合
matlab自定义函数
首先我们来在命令窗口敲写一段代码,创建好脚本之后,按快捷键F5运行,可以得到
for i = 1 : 10
x = linspace(0,10,101);
plot(x,sin(x + i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
在熟练matlab过程我们需要掌握的几个常用的快捷键:
- %:单行注释
- ctrl + r:多行注释
- ctrl + t:取消多行注释
- ctrl + i:智能缩进
- %%:指定节
- ctrl + enter:执行节
- f5:运行程序
然后举个LMS算法例子来创建第一个Matlab function,来看
matlab绘图
强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作。这类操作将图形的每个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每个对象分配一个句柄,可以通过句柄对该图形元素进行操作,而不影响其他部分。
绘图语法
plot(X,Y) %创建 Y 中数据对 X 中对应值的二维线图。
plot(X,Y,LineSpec) %设置线型、标记符号和颜色。
plot(X1,Y1,…,Xn,Yn) %绘制多个 X、Y 对组的图,所有线条都使用相同的坐标区。
plot(X1,Y1,LineSpec1,…,Xn,Yn,LineSpecn) %设置每个线条的线型、标记符号和颜色。
plot(Y) %创建 Y 中数据对每个值索引的二维线图。
plot(Y,LineSpec) %设置线型、标记符号和颜色。
plot(_,Name,Value) %使用一个或多个 Name,Value 对组参数指定线条属性。
plot(ax,_) %将在由ax指定的坐标区中,而不是在当前坐标区 (gca) 中创建线条。
h = plot(_) %回由图形线条对象组成的列向量。
- 1.创建线图
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
- 2.绘制多个线条
x = linspace(-2*pi,2*pi);
y1 = sin(x);
y2 = cos(x);
figure
plot(x,y1,x,y2)
- 3.指定线型
x = 0:pi/100:2*pi;
y1 = sin(x);
y2 = sin(x-0.25);
y3 = sin(x-0.5);
figure
plot(x,y1,x,y2,'–',x,y3,':')
- 4.指定线型、颜色和标记
x = 0:pi/10:2*pi;
y1 = sin(x);
y2 = sin(x-0.25);
y3 = sin(x-0.5);
figure
plot(x,y1,'g',x,y2,'b–o',x,y3,'c*')
- 5.指定线宽、标记大小和标记颜色
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));
figure
plot(x,y,'–gs',…
‘LineWidth’,2,…
‘MarkerSize’,10,…
‘MarkerEdgeColor’,’b’,…
‘MarkerFaceColor’,[0.5,0.5,0.5])
- 6.添加标题和轴标签
x = linspace(0,10,150);
y = cos(5*x);
figure
plot(x,y,'Color',[0,0.7,0.9])
title(‘2-D Line Plot’)
xlabel('x')
ylabel('cos(5x)')
- 7.创建并修改线条
x = linspace(-2*pi,2*pi);
y1 = sin(x);
y2 = cos(x);
p = plot(x,y1,x,y2);
。。。。省略若干
matlab在数学建模的应用
一.人口预测模型
例1:下表1-4是某地区1971一2000年的人口数据,试给出该地区人口增长的数学模型。根据表中的数据做出其散点图,从可以看出,人口随时间的变化呈非线性过程,而且存在一个与横坐标轴平行的渐近线,故可以用Logistic曲线模型进行拟合。
建立个population.m文件,由于logistic曲线模型形式为y=1/(a+be^-t),所以这里我们只要假设y*=1/y,x*=e^-t,就可以将其转化直线模型y*=a+bx*,即可编写拟合程序如下。
clear
clc
% 读入人口数据(1971-2000年)
Y=[33815 33981 34004 34165 34212 34327 34344 34458 34498 34476 34483 34488 34513 34497 34511 34520 34507 34509 34521 34513 34515 34517 34519 34519 34521 34521 34523 34525 34525 34527]
% 读入时间变量数据(t=年份-1970)
T=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
% 线性化处理
for t = 1:30,
x(t)=exp(-t);
y(t)=1/Y(t);
end
% 计算,并输出回归系数B
c=zeros(30,1)+1;
X=[c,x'];
B=inv(X'*X)*X'*y'
for i=1:30,
% 计算回归拟合值
z(i)=B(1,1)+B(2,1)*x(i);
% 计算离差
s(i)=y(i)-sum(y)/30;
% 计算误差
w(i)=z(i)-y(i);
end
% 计算离差平方和S
S=s*s';
% 回归误差平方和Q
Q=w*w';
% 计算回归平方和U
U=S-Q;
% 计算,并输出F检验值
F=28*U/Q
% 计算非线性回归模型的拟合值
for j=1:30,
Y(j)=1/(B(1,1)+B(2,1)*exp(-j));
end
% 输出非线性回归模型的拟合曲线(Logisic曲线)
plot(T,Y)
二.灰色预测模型
例2:下面以某公司收入预测问题为例介绍灰色预测的MATLAB实现过程。
已知某公司1999-2008年的利润为(单位:元/年):[89677,99215,109655,120333,135823,
159878,182321,209407,246619,300670]
现在要预测该公司未来几年的利润情况。
分析:首先说明下,在建立灰色预测模型之前,需先对原始时间序列进行数据处理,经过数据处理后的时间序列即称为生成列。灰色系统常用的数据处理方式有累加和累减两种。其实灰色预测的思路非常简单,就是通过一组数据序列进行累加建立的线性微分方程,其中系数便为发展系数与灰色作用量,那么只需要求参便可以预测未来值,这里采用了对累加数据进行均值生成矩阵向量,采用最小二乘法即可,且最后作残差处理,便可建立,具体程序见如下:
clear
syms a b;
c=[a b]';
A=[89677,99215,109655,120333,135823,159878,182321,209407,246619,300670];
B=cumsum(A); % 原始数据累加
n=length(A);
for i=1:(n-1)
C(i)=(B(i)+B(i+1))/2; % 生成累加矩阵
end
% 计算待定参数的值
D=A;D(1)=[];
D=D';
E=[-C;ones(1,n-1)];
c=inv(E*E')*E*D;
c=c';
a=c(1);b=c(2);
% 预测后续数据
F=[];F(1)=A(1);
for i=2:(n+10)
F(i)=(A(1)-b/a)/exp(a*(i-1))+b/a ;
end
G=[];G(1)=A(1);
for i=2:(n+10)
G(i)=F(i)-F(i-1); %得到预测出来的数据
end
t1=1999:2008;
t2=1999:2018;
G
plot(t1,A,'o',t2,G) %原始数据与预测数据的比较
xlabel('年份')
ylabel('利润')
模型太多,八一不多说,自己参考相关书籍
matlab参考书籍
- 《MATLAB R2016a完全自学一本通》
- 《MATLAB宝典》
- 《MATLAB数值计算》
- 《MATLAB揭秘》
- 《MATLAB在数学建模中的应用》
- 《MATLAB从入门到精通》
- 《MATLAB函数速查手册》