MATLAB建模与仿真(第一章基础--第四章画图)

本文详细介绍了MATLAB建模基础,包括建模步骤、函数应用、数据I/O和外部接口。接着深入探讨了MATLAB的数值与符号计算,涵盖数据类型、数组、矩阵运算、多项式和符号运算。此外,还讲解了MATLAB的程序设计,如M文件分类、函数类型、控制结构和调试。最后,介绍了MATLAB的二维和三维图形绘制,包括基本绘图函数和特殊图形。
摘要由CSDN通过智能技术生成

第一章 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. 模型准备:

了解建模对象的实际背景,明确建模目的,搜集相关信息,掌握对象特征,形成比较清晰的问题,分析实际问题中的各种因素,并用变量表示。

  1. 模型假设

针对问题的特点和建模目的,做出合理的、简化的假设。对数据资料进行分析计算,找出起主要作用的因素,经过必要的精炼、简化,提出若干符合客观实际的假设。分析上述变量的关系,哪些相互依存,哪些独立,之间的关系。

  1. 建立模型

用数学的语言、符号描述问题。根据实际问题选用合适的数学框架,并将具体的问题在所选的数学框架中表示出来,然后发挥想象力,使用类比法,尽量采用简单的、适当的数学工具表达各变量之间的关系,建立相应的数学结构。

  1. 模型求解

利用各种数学方法、数学软件和计算机技术难以得出解析时借助计算机求出数值解。

  1. 模型分析

选取合适的算法求解所建立的数学模型表述的问题,对模型的结果进行误差分析和模型的稳定性分析。

  1. 模型检验

使用计算结果解决实际问题,将模型计算结果与实际现象、数据进行比较,检验模型的合理性、适用性和可靠性。

  1. 模型应用

通过检验,证明所建立的模型与实际应用问题相符后,则可以投入到实际应用当中,解决实际应用问题。

基本原则

  • 简化原则
  • 可推导原则
  • 反映性远则

1.3 数学建模函数及应用

内部常见函数

常数名称 含义 常数名称 含义
pi 圆周率 I或j 虚数单位
eps 计算机中的最小数2^(-52) inf 无穷大

数学运算符

运算符 含义 运算符 含义
.* 数组乘法 ./ 数组左除

内部数学函数

函数 含义 函数 含义
sqrt 算数平方根 abs 绝对值函数、复数模
对数函数 实部函数 real
虚部函数 imag
求复数辐角 angle
求复数的共轭复数 conj

数学建模应用

方法名称 具体应用场景
常规方法 数据处理(数据预处理,数值计算,数据拟合)、图形图像绘制、建议预测
规划问题解法 多约束线性规划、整体规划、整数规划和不太复杂的多约束非线性规划
灰色预测 数据量较少的情况下预测
遗传算法 求解多约束规划模型、训练人工神经网络
粒子群算法 求解无约束多元线性规划模型、训练人工神经网络
人工神经网络 数学建模中的一切聚类、评价及模式预测的问题
蚁群算法 NP问题、旅行商问题、智能组卷系统
小波分析 海量数据趋势挖掘、组建小波神经网络
模拟退火算法 经典TSP问题、背包问题,求解复杂多约束非线性规划模型
计算机虚拟 动态(动画)展现的数学模型、动态系统仿真、复杂飞翔行规划问题粗略求解

1.4 MATLAB外部接口

  1. 在MATLAB中调用其他的语言编写的代码
  2. 在其他语言程序中调用MATLAB

数据文件I/O操作函数

函数名 含义
fopen 打开文件
fclose 关闭文件
fgetl 读文件的行,忽略回行符
fgets 读文件的行,包括回行符
fread 读取二进制文件的数据
fscanf 从文件中读取格式化数据
fprintf 将数据按照指定格式写入文本文件中
fwhite 把二进制数据写到文件中
ferror 查询文件I/O错误状态

打开文件

  1. 使用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(
  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值