第一章 MATLAB建模基础
1.1 简介
通用命令
命令 | 说明 | 命令 | 说明 |
---|---|---|---|
cd | 改变当前目录 | clc | 清除命令行窗口的内容 |
clear | 清除变量 | type | 显示文件内容 |
edit | 打开M文件编辑器 | mkdir | 创建目录 |
what | 显示当前目录下的M文件、MAT和MEX文件 | exit、quit | 关闭MATLAB |
save | 保存变量到磁盘 | load | 从磁盘调入数据变量 |
who | 列出工作空间中的变量名 | whos | 显示变量的详细信息 |
which | 函数或文件的位置 | help | 获取函数的帮助信息 |
pack | 收集内存碎片 | path或genpath | 显示搜索路径 |
clf | 清除图形窗口的内容 | delete | 删除文件 |
标点符号 | 说明 | 标点符号 | 说明 |
---|---|---|---|
: | 多种应用 | ; | 区分矩阵的行或取消运行结果的显示 |
, | 区分矩阵的列 | () | 指定运算的顺序 |
[] | 定义矩阵 | {} | 构造单元数组 |
@ | 构建函数句柄 | . | 小数点或对象的域访问 |
… | 父目录 | … | 续行符号 |
! | 执行DOS命令 | ‘’ | 定义字符串 |
% | 注释 |
键盘按键 | 说明 | 键盘按键 | 说明 |
---|---|---|---|
↑ | 调出前一个命令 | ↓ | 调出后一个命令 |
← | 光标向右移动一个字符 | → | 光标向左移动一个字符 |
ctrl+← | 光标向左一个单词 | ctrl+→ | 光标向右一个单词 |
Home | 光标移动到行首 | End | 光标移动到行尾 |
Del | 清除光标后的字符 | Backspace | 清除光标前的字符 |
Esc | 清除当前行 | Ctrl+C | 中断正在执行的程序 |
1.2 数学建模概述
建模一般步骤
- 模型准备:
了解建模对象的实际背景,明确建模目的,搜集相关信息,掌握对象特征,形成比较清晰的问题,分析实际问题中的各种因素,并用变量表示。
- 模型假设
针对问题的特点和建模目的,做出合理的、简化的假设。对数据资料进行分析计算,找出起主要作用的因素,经过必要的精炼、简化,提出若干符合客观实际的假设。分析上述变量的关系,哪些相互依存,哪些独立,之间的关系。
- 建立模型
用数学的语言、符号描述问题。根据实际问题选用合适的数学框架,并将具体的问题在所选的数学框架中表示出来,然后发挥想象力,使用类比法,尽量采用简单的、适当的数学工具表达各变量之间的关系,建立相应的数学结构。
- 模型求解
利用各种数学方法、数学软件和计算机技术难以得出解析时借助计算机求出数值解。
- 模型分析
选取合适的算法求解所建立的数学模型表述的问题,对模型的结果进行误差分析和模型的稳定性分析。
- 模型检验
使用计算结果解决实际问题,将模型计算结果与实际现象、数据进行比较,检验模型的合理性、适用性和可靠性。
- 模型应用
通过检验,证明所建立的模型与实际应用问题相符后,则可以投入到实际应用当中,解决实际应用问题。
基本原则
- 简化原则
- 可推导原则
- 反映性远则
1.3 数学建模函数及应用
内部常见函数
常数名称 | 含义 | 常数名称 | 含义 |
---|---|---|---|
pi | 圆周率 | I或j | 虚数单位 |
eps | 计算机中的最小数2^(-52) | inf | 无穷大 |
数学运算符
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
.* | 数组乘法 | ./ | 数组左除 |
内部数学函数
函数 | 含义 | 函数 | 含义 |
---|---|---|---|
sqrt | 算数平方根 | abs | 绝对值函数、复数模 |
对数函数 | 实部函数 | real | |
虚部函数 | imag | ||
求复数辐角 | angle | ||
求复数的共轭复数 | conj |
数学建模应用
方法名称 | 具体应用场景 |
---|---|
常规方法 | 数据处理(数据预处理,数值计算,数据拟合)、图形图像绘制、建议预测 |
规划问题解法 | 多约束线性规划、整体规划、整数规划和不太复杂的多约束非线性规划 |
灰色预测 | 数据量较少的情况下预测 |
遗传算法 | 求解多约束规划模型、训练人工神经网络 |
粒子群算法 | 求解无约束多元线性规划模型、训练人工神经网络 |
人工神经网络 | 数学建模中的一切聚类、评价及模式预测的问题 |
蚁群算法 | NP问题、旅行商问题、智能组卷系统 |
小波分析 | 海量数据趋势挖掘、组建小波神经网络 |
模拟退火算法 | 经典TSP问题、背包问题,求解复杂多约束非线性规划模型 |
计算机虚拟 | 动态(动画)展现的数学模型、动态系统仿真、复杂飞翔行规划问题粗略求解 |
1.4 MATLAB外部接口
- 在MATLAB中调用其他的语言编写的代码
- 在其他语言程序中调用MATLAB
数据文件I/O操作函数
函数名 | 含义 |
---|---|
fopen | 打开文件 |
fclose | 关闭文件 |
fgetl | 读文件的行,忽略回行符 |
fgets | 读文件的行,包括回行符 |
fread | 读取二进制文件的数据 |
fscanf | 从文件中读取格式化数据 |
fprintf | 将数据按照指定格式写入文本文件中 |
fwhite | 把二进制数据写到文件中 |
ferror | 查询文件I/O错误状态 |
打开文件
- 使用
fopen
函数打开二进制形式的文件
fid = fopen(filename , permission)
[fid , message] = fopen(filename , permission)
%fid参数表示文件操作的状态及标识已打开的文件,返回值大于0,则说明文件打开成功
%filename表示待打开的数据文件,注意文件名要有扩展名
%message参数用来表示文件操作的相关信息
%permission参数用来表示文件处理方式
当文件以文本形式打开时,需要在上述指定的permission
字符(串)后加字符t,如rt、wt等
%打开sin函数、cos函数以及不存在的sincos函数对应文件
[fid1,message1] = fopen('sin.m','r')
[fid2,message2] = fopen('cos.m','r')
[fid3,message3] = fopen('sincos.m','r')
为了后续操作的顺利进行,程序设计中每次打开文件,都要进行该操作是否正确的判断
[fid,message] = fopen(filename,'r');
if fid == -1
disp(message);
end
关闭文件
status=fclose(fid)
fid
参数即为要关闭文件的文件标识,也是打开该文件时的返回值。成功则返回值为0,否则为-1.
fid = fopen('sin.m','r')
status = fclose(fid)
读取文件
使用fread
函数读取二进制文件的数据,并将文本内容看成一个整数序列,存入矩阵
a = fread(fid)
a = fread(fid,size)
a = fread(fid,size,precision)
%fid参数是打开文件时得到的文件标识
%size参数表示读取整数的个数
%precision参数表示读取的数据类型,默认情况是uchar(即8位字符型)
写入文件
使用fwhite
函数实现将二进制数据写入已打开的文件
count = fwhite(fid,a,precision)
%例
A=[1 2 3;7 8 9;4 5 6];
fid=fopen('example1_4.txt','w');
count=fwrite(fid,A,'int32')
count =
9
>> closestatus=fclose(fid)
closestatus =
0
>> fid=fopen('example1_4.txt','r');
>> A=fread(fid,[3 4],'int32');
>> closestatus=fclose(fid);
>> B=magic(3);
>> C=A*B
C =
26 38 26
116 128 116
71 83 71
普通形式读取文件
使用fgetl
函数和fgets函数实现将文本的某一行读出,并将该行的内容以字符串的形式返回。fgetl
忽略回行符,fgets
保留回行符。
tline=fgetl(fid)
tline=fgets(fid)
>> fid=fopen('sinc.m')
fid =
5
>> while 1
tline=fgetl(fid);
if~ischar(tline)
break;
else
disp(tline)
end
end
function y=sinc(x)
i=find(x==0);
x(i)=1;
y=sin(pi*x)./(pi*x);
y(i)=1;
>> fclose(fid);
>>
假如已知写入时的格式,想要按照写入时的格式将文件内容完整读出,则可以使用fsancf
函数实现已知格式文件的读取,当确定文件的ASCII码格式时,用fsanf
进行精确读取
a=fscanf(fid,format)
a=fscanf(fid,format,size)
[a,count]=fscanf(fid,format,size)
format用于指定读取数据的格式
选项 | 读取数据的格式 |
---|---|
%s | 按字符串进行输入转换 |
%d | 按十进制数据进行转换 |
%f | 按浮点数进行转换 |
fid=fopen('example1_6.m','r');
>> d1=fscanf(fid,'%s',[5 6])
fclose(fid);
fid=fopen('example1_6.m','r');
>> d2=fscanf(fid,'%f',[5 6])
fclose(fid);
fid=fopen('example1_6.m','r');
>> d=fscanf(fid,'%f');
>d3=d'
fclose(fid);
fprintf函数写入文件
将数据按给定格式写入文件
count=fprintf(fid,format,y)
format格式 | 数据格式 |
---|---|
%e | 科学计数格式 |
%f | 固定小数点位置的数据形式 |
%g | 在上述两个中自动选择较短的格式 |
第二章 MATLAB数值与符号计算
基本数据类型(单精度类型、双精度类型、整数类型),字符串,函数句柄,逻辑类型
2.1 数据类型
字符串类型
1.字符串的创建
>> a=135
a =
135
>> class(a)
ans =
'double'
>> size(a)
ans =
1 1
>> b='135'
b =
'135'
>> class(b)
ans =
'char'
>> size(b)
ans =
1 3
>>
字符串的基本操作
1.字符串利用“[ ]
”进行拼接
2.操作函数
函数名 | 说明 |
---|---|
char | 创建字符串,将数值转变为字符串 |
double | 将字符串转变为Unicode数值 |
blanks | 空白字符串的创建 |
deblank | 删除字符串尾部空格 |
ischar | 判断变量是否字符串 |
字符串转换函数
格式化的输入与输出
数值类型
1.基本数值类型
2.整数类型数据运算
3.常量
4.空数组
>> a=reshape(1:20,5,4)
a =
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 15 20
>> %删除第2,3行
>> a([2,3],:)=[]
a =
1 6 11 16
4 9 14 19
5 10 15 20
函数句柄
优点: 可靠性强;效率高;速度快
创建如下:
fhandle=@function_filename
逻辑类型
1.关系运算分为两类:
传统的集合运算:并集、差集和交集
专业的关系运算:选择、投影、连接和除法
2.数据类型
3.逻辑运算
4.运算符优先级
结构类型
1.创建结构
1.直接赋值法:直接使用结构的名称并配合“
.
”操作符和对应的字段名称进行结构的创建。在创建时是直接给字段赋上具体的值。
>> Student.name='Jack';
>> Student.age=18;
>> Student.grade=uint16(1);
>> whos
Name Size Bytes Class Attributes
Student 1x1 546 struct
>> Student
Student =
包含以下字段的 struct:
name: 'Jack'
age: 18
grade: 1
2.使用
struct
函数创建法
struct-name=struct(field1,val1,field2,val2,...)
struct-name=struct(field1,{
val1},field2,{
val2},...)
同时可使用repmat
函数给结构制作副本
>> Student=struct('name','Jack','age',18,'grade',uint16(1))
Student =
包含以下字段的 struct:
name: 'Jack'
age: 18
grade: 1
>> Student=struct('name',{
'Jack','Mike'},'age',{
18,16},'grade',{
4,2})
Student =
包含以下字段的 1×2 struct 数组:
name
age
grade
>> whos
Name Size Bytes Class Attributes
Student 1x2 912 struct
>> clear
>> clc
>> Student=repmat(struct('name','Jack','age',18,'grade',uint16(1)),1,2)
Student =
包含以下字段的 1×2 struct 数组:
name
age
grade
>> Student=repmat(struct('name','Jack','age',18,'grade',uint16(1)),1,3)
Student =
包含以下字段的 1×3 struct 数组:
name
age
grade
>> Student(1)
ans =
包含以下字段的 struct:
name: 'Jack'
age: 18
grade: 1
2.基本操作
细胞数组类型
内容 | 细胞数组对象 | 结构数组对象 |
---|---|---|
基本元素 | 细胞 | 结构 |
基本索引 | 全下标方式、单下标方式 | 全下标方式、单下标方式 |
包含的数据类型 | 任何数据类型 | 任何数据类型 |
数据的存储 | 细胞 | 字段 |
访问元素的方法 | 花括号和索引 | 圆括号、索引和字段名 |
1.创建细胞数组
1.对不同类型和尺寸的数据可以使用运算符“
{}
”进行组合,以此构成细胞数组。
2.将数组中的每个元素使用“{}
”括起来,接着使用数组创建符号“[]
”进行组合,以此构成细胞数组。
3.使用“{}
”创建一个细胞数组,MATLAB可自动扩展数组尺寸,若没有赋值,则可以作为空细胞数组存在。
4.使用cell
函数创建细胞数组,该函数可以创建一维、二维或者多维细胞数组,但都为空细胞数组。
>> A={
zeros(3,3,3),'A';1.23,1:10}
A =
2×2 cell 数组
{
3×3×3 double} {
'A' }
{
[ 1.2300]} {
1×10 double}
>> B=[{
zeros(2,2,2)},{
'B'};{
1.23},{
1:10}]
B =
2×2 cell 数组
{
2×2×2 double} {
'B' }
{
[ 1.2300]} {
1×10 double}
>> C={
3}
C =
1×1 cell 数组
{
[3]}
>> D=cell(2,3)
D =
2×3 cell 数组
{
0×0 double} {
0×0 double} {
0×0 double}
{
0×0 double} {
0×0 double} {
0×0 double}
2.细胞数组的基本操作
1.访问细胞数组:获得细胞数组数据,使用“
()
”;获得字符串数据,使用“{}
”。
a=[{
zeros(3,3,3)},{
'Jack'};{
1.23},{
1:10}]
a =
2×2 cell 数组
{
3×3×3 double} {
'Jack' }
{
[ 1.2300]} {
1×10 double}
>> d=a{
1,2}(4)
d =
'k'
>> e=a{
2,2}(6:end)
e =
6 7 8 9 10
>> class(e)
ans =
'double'
>> whos
Name Size Bytes Class Attributes
a 2x2 760 cell
ans 1x6 12 char
d 1x1 2 char
e 1x5 40 double
2.扩充细胞数组
>> a=[{
zeros(