数模竞赛 MATLAB 学习笔记

一、基础操作

  1. 向量化编程:arrayfun(@fun,array)
  2. 匿名函数:f = @(x) x.^2
  3. 计时:tic & toc
  4. 随机数控制:rng(‘default’)
% =============================
%1. 生成一串满足a(i) = i^2的数组
a = arrayfun(@(x) x.^2 , 1:10000)

二、方程求解

(1)单一方程

fzero:求函数零点

% =========================
1.解方程
f = @(x) exp(x)+x.^2 + x^sqrt(x)-100
x0 = fzero(f,3)
% =========================
2. 显示表示隐函数,并使其接受向量化输入
y = @(x) fzero(@(y) (exp(y)+x^y)^(1/y)-x^2*y,1)%代入x,求y
Y = @(X) arrayfun(@(xx) y(xx), X)
% =========================
3. 画出隐式方程的三维图像
z = @(x,y) fzero(@(z) exp((x-0.5-exp(-y+z))^2+y^2-z/5+3)
[X,Y] = meshgrid(-1:0.1:1,-1:0.1:1)
Z = arrayfun(@(x,y) z(x,y),X,Y)
surf(X,Y,Z)

(2)方程组求解

fslove:求解非线性方程组
eg.
e − e − ( x 1 + x 2 ) − x 2 ( 1 + x 1 2 ) = 0 x 1 cos ⁡ ( x 2 ) + x 2 sin ⁡ ( x 1 ) 1 2 = 0. \begin{array}{c} {e^{ - {e^{ - ({x_1} + {x_2})}}}} - {x_2}\left( {1 + x_1^2} \right) = 0\\ {x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right) \frac{1}{2} = 0. \end{array} ee(x1+x2)x2(1+x12)=0x1cos(x2)+x2sin(x1)21=0.

function F = root2d(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end
fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0);

三、求积分

  1. 一重积分: integral
    q = integral(fun,xmin,xmax)
    q = integral(fun,xmin,xmax,Name,Value)
% ===============
-1. 广义积分 
q = integral(@(x)exp(-x^2)*log(x)^2, 0,Inf)
  1. 二重积分: integral2
    q = integral2(fun,xmin,xmax,ymin,ymax)
    q = integral2(fun,xmin,xmax,ymin,ymax,Name,Value)
fun = @(x,y) 1./(sqrt(x+y).*(1+x+y).^2)
q = integral2(fun,0,1,0,@(1-x))
  1. 三重积分: integral3
    q = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)
    q = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax,Name,Value)

四、求微分

(1) 常微分方程 (ODE, Ordinary Differential Equation)

定义:未知函数是一元函数
MATLAB求解

  1. dsolve: 符号函数求解
y = dsolve('x * D2y - 3 * Dy = x^2', 'y(1)=0,y(5)=0','x');%ODE求解
f = str2func(['@(X)' vectorize(char(y(1)))]);%把符号解转换为匿名函数
  1. 数值求解:ode45+deval
tspan = [0 20];%求解区间
y0 = [2 0];%初值
sol = ode45(@vdp1, tspan, y0);%ode45求解,sol为结构体
y = @(x) deval(sol,x);%利用插值将数值解表示为函数的形式

NOTE:

  • ode45只适用于非刚性方程(变化较为缓慢).若发现ode45计算较慢,则方程可能为刚性(变化较快),可使用ode15s函数。
  • 若微分方程为隐式方程,则可用ode15i函数。
  • 仅适用于初值问题。若遇到边值问题,则可使用bvp4c函数(25个案例P230)

(2) 偏微分方程 (PDE, Partial Differential Equation)

定义:未知函数是多元函数


五、优化问题(Optimation Problems)

(1)种类

  • 线性规划(LP, Linear Programming)
    目标函数是线性函数,所有约束也是线性函数。MATLAB中linprog可实现。
  • 混合整数线性规划(MILP, Mixed Integer Linear Programming)
    目标函数是线性函数,所有约束也是线性函数,但决策变量中有部分是整数。MATLAB中intlinprog可实现
  • 混合整数规划(MLP, Mixed Linear Programming)
    目标函数或约束含非线性,但决策变量中有整数。常用智能算法解决,如ga.
  • 二次规划(QP, Quadratic Programming)
    目标函数是二次函数,约束条件是线性函数。MATLAB中quadprog可实现

(2)常用函数

  1. fminunc: 无约束条件求最小值(Find MINimum of UNConstrained multivariable function)
  • 输入导数可以使算法更快,更稳定。此时’SpecifyObjectiveGradient’参数需要设置成’true’,‘Algorithm’可设置成’trust-region’
  1. fmincon: 带约束条件求最小值(Find MINimum of CONstrained multivariable function)
  • 目标函数及其一阶导数必须连续
  • 若目标函数或约束函数需要传递额外参数,可使用匿名函数
  1. ga:遗传算法(Genetic Algorithm)
  • Intcon参数含义:若 Intcon=1:5, 则表示第1到5个变量为整数。当Intcon非空时,ga不可有等式约束,只能有不等式约束(等式约束可以用两个不等式来实现,最好设置一定的误差范围
  • 杂交函数选项(hybrid function options):用ga的结果作为初始值其他优化算法的初始值(不可有Intcon, 因为在matlab中没有其他算法可以实现非线性整数规划,可把整数约束转换为两个不等式约束
FitnessFcn = @dejong2fcn;
numberOfVariables = 2;
rng('default')
fminuncOptions = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');
options = optimoptions(options,'HybridFcn',{@fminunc, fminuncOptions});
[x,fval] = ga(FitnessFcn,numberOfVariables,[],[],[],[],[],[],[],options)

六、统计分析

(1) 数据预处理

  • 对时间序列:数据平滑(smooth,smooths,medfilt1)
  • 归一化:方差归一化和极差归一化

(2) 基本统计量

  • 均值、方差、偏度、峰度、相关系数等

(3) 参数估计

  • 正态分布:mle函数
  • 自定义分布:mle函数,需要定义概率密度函数

(4) 假设检验

1) 均值检验

  • U检验(ztest): 标准差已知时
  • t检验(ttest):标准差未知时

2) 方差检验:

  • 卡方检验(vartest):均值未知时

3) 比较检验(两个样本有无显著性差异)

  • 均值有无差异?t检验(ttest)
  • 方差有无差异?F检验(vartest2vartestn)
  • 中值有无差异?
    • 符号检验: signtest
    • Wilcoxon检验:signrank
    • Mann-Whitney检验ranksum,可比较两个分布的形状是否相同

4) 随机性检验

  • 游程检验(runstest):检验某一参数的出现是否具有随机性

5) 分布检验(某一样本是否服从某一分布)

  • 卡方拟合优度检验(chi2gof):除了正态分布也可检验
  • Jarque - Bera 检验(jbtest):基于峰度和偏度检验分布的正态性,受异常值影响较大
  • 单样本 Kolmogorov - Smirnov 检验(kstest): 检验某一样本是否服从某一已知分布
  • 双样本 Kolmogorov - Smirnov 检验(kstest2): 检验两个样本是否服从相同的分布
  • Lilliefors 检验(lillietest):提出用样本均值和标准差代替总体的均值和标准差,然后用 Kolmogorov - Smirnov 检验。指定的分布参数是未知的.常用

(5) 方差分析(ANOVA, ANalysis Of VAriance)

NOTE:

检验某些因素对一些变量的影响。一般要求样本服从正态分布,并且满足方差齐次性

一般流程:

  1. 正态性检验。利用lillietest,检验样本是否服从正态分布
  2. 方差齐次性检验。利用vartestn,检验不同组的样本是否具有相同的方差
  3. 方差分析。利用anoval、分析不同因素对变量的影响。
  4. 多重比较。利用multcompare,分析哪些主效应具有显著性影响,哪些交互效应具有显著性影响。

分类:

  • 单因素一元方差分析:分析一个因素对一个变量的影响(anova1)
  • 多因素一元方差分析:分析多个因素对一个变量的影响(anovan)
  • 单因素多元方差分析:分析一个因素对多个变量的影响(manova1)
  • 非参数方差分析:适用于样本不服从正态分布,不满足方差齐次性。常使用Kruskal - Wallis 检验,函数名为kruskalwallis

七、回归分析(Regression Analysis)

(1) 种类

  • 线性回归模型(Linear Regression Model):可调用LinearModel类。
  • 非线性回归模型 :可调用NonLinearModel类。
  • 多项式回归:可调用polyfit函数。

(2) 回归诊断

1) 查找异常点和强影响点

  • 异常点查找:
    • 标准化残差:LinearModel.Standardized
    • 学生化残差:LinearModel.Studentized
  • 强影响点查找:
    • Cook 距离:~.plotDiagnostics(‘cookd’)
    • Covratio 统计量:~.plotDiagnostics(‘covratio’)
    • Dffits 统计量:~.plotDiagnostics(‘Dffits’)
    • 杠杆值:~.plotDiagnostics(‘leverage’)

2) 残差分析

  • 置信区间:~.coefCI(alpha)’,.predict(xnew.‘Prediction’,‘observation’);
  • 残差值序列图:~.plotResiduals(‘caseorder’)
  • 残差与拟合值图:~.plotResiduals(‘fitted’)
  • 残差与自变量图:~.Residuals.Raw
  • 残差直方图:~.plotResiduals(‘histogram’)
  • 残差正态概率图:~.plotResiduals(‘probability’)
  • 残差与滞后残差图:~.plotResiduals(‘lagged’)

3) 多重共线性诊断

诊断自变量间有无线性关系

  • 利用方差膨胀因子VIFi,当VIFi < 5 时,认为不存在共线性;当VIFi > 10 时,认为xi与其他自变量线性相关。VIFi等于自变量相关系数矩阵的逆矩阵的对角线上的第i个元素
Rx = corrcoef(X);
VIF = diag(inv(Rx));
  • 若发现VIFi过大,则可以在model.fit函数中设置model参数,如不要第2项和第5项,mdl = LinearModel.fit(x,y,‘poly10101’,‘Exclude’,id)

(3) 提高回归结果可靠性的方法

回归结果主要受异常点和回归模型的影响

  • 排除异常点:在 fit 函数中增加’ Exclude’ 参数.eg. ~.fit(x,y,‘Exclude’,id)
  • 稳健回归(加权最小二乘法估计):在 fit 函数中增加 ‘RobustOpts’ 参数。eg. ~.fit(x,y,‘RobustOpts’,‘on’)

八、聚类分析

(1) 系统聚类法

思想:把每个样本当成独立的个体,每次只合并两类,把合并后的新类作为一个新的个体,再次参与聚类。
评价:用不一致系数(inconstant)进行评价。若不一致系数在某一次分类中增幅较大,则表示这一次并类效果较差而上一次并类效果较好
常用函数

  1. 一步聚类:clusterdata
T = clusterdata(X, 'linkage', 'average', 'maxclust', 3)
%% 等价于
Y = pdist(X,'euclid');%得到距离向量(距离矩阵的下三角向量化后的样子);
Z = linkage(Y, 'average');%创建系统目录树
T = cluster(Z,'maxclust', 3);%根据系统目录树创建
  1. 分布聚类:pdist、linkage、dendogram、inconsistent
Y = pdist(X,'euclid');%得到距离向量(距离矩阵的下三角向量化后的样子);
Z = linkage(Y, 'single');%创建系统目录树
H = dendogram(Z,0,'orientation','right','labels',label);%绘制聚类树形图
inc = inconsistent(Z,40);%依据系统目录树计算不一致系数,来确定最终分类树

(2) kmeans聚类

思想:以重心表示聚类中心,以最小距离的原则将样本分给相应的类;如此往复
评价:利用轮廓值(Silhouette Value)判读聚类效果好坏。轮廓值越大,分类效果越好。轮廓值也适用于其他聚类方法
常用函数

  1. kmeans
  2. silhouette

(3) 模糊C均值聚类

思想:计算每一个样本属于每一类的隶属度,基于此进行分类
函数fcm


九、判别分析

使用Classification Learner APP

十、灰色系统(Gray System)

(1) 用途及其理论

用途:

  • 序列数据的预测
  • 数据融合:综合多个观测值,给出最合适的估计值(P184)
  • 分析关联紧密程度(P186)

预测模型:

  • GM(1,1):用于具有较强指数规律的序列,只能描述单调的变化过程
  • Verhulst:适合非单调的摆动发展序列或具有饱和状态的S形序列
    具体看链接

图论

(1) 最短路径问题

目的:求两个村庄之间的最短距离
常用算法

  • 求两点间的最短距离:Dijkstra算法
  • 求任意两点之间的最短距离:Floyd算法

MATLAB函数:

  • graphallshortestpaths:使用Johnson’s algorithm计算
  • graphshortestpath:可使用Dijkstra、BFS、Bellman-Ford、Acyclic等算法

(2) 最小生成树问题

目的:用最短的路连接所有的村庄
常用算法

  • kruskal
  • prim

MATLAB函数:

  • graphminspantree:使用

(3) 网络最大流问题

目的:计算整个路网可承载的最大货运量
MATLAB函数:

  • graphmaxflow:使用

(4) 偶图匹配问题

目的:将两个集合中的元素进行最优匹配
常用算法

  • 匈牙利算法
  • Kuhn–Munkres算法

(5) 中国邮政问题(CPP)

目的:在加权连通图中求经过每条边至少一次的权和最小的回
路,即中国邮路

(6) 旅行推销商问题(TSP)

目的:在加权连通图中求经过每个点至少一次的权和最小的
回路,即推销商回路(TSP 回路)

排队论

(1) 基本组成

输入过程

  • 分类:确定型和随机型
  • 单位时间内到客数λ
  • 顾客到达间隔时间分布:泊松、负指数…

排队规则

  • 等待制:人来了就排队
  • 损失制:人来了,看见无空闲窗口马上走
  • 混合制:两者混合

服务机构

  • 分类:确定型和随机型
  • 服务时间分布:负指数…

(2) 命名规则

现代常用的分类方法是英国数学家D.G.肯德尔提出的分类方法,即用肯德尔记号 X/Y/Z进行分类。

  • X处填写相继到达间隔时间的分布;
  • Y处填写服务时间分布;
  • Z处填写并列的服务台数目。

各种分布符号有:M-负指数分布;D-确定型; Ek-k阶埃尔朗分布;GI-一般相互独立分布;G-一般随机分布等。

  • M/M/1:表示顾客相继到达的间隔时间为负指数分布、服务时间为负指数分布和个服务台的模型。
  • M/M/S:表示顾客相继到达的间隔时间为负指数分布、服务时间为负指数分布和个服务台的模型。

(3) 求解

  • https://wiki.mbalib.com/wiki/%E6%8E%92%E9%98%9F%E8%AE%BA
  • https://blog.csdn.net/COCO56/article/details/99714313

你可能感兴趣的:(数模竞赛 MATLAB 学习笔记)