MATLAB最基础教程(零):基本数学概念 前言:matlab只是个软件,用来完成机械的计算,而如何安排这些计算,需要用户掌握最基本的数学概念。这篇将介绍工程数学中常用的数学概念,与matlab似乎并不相关,但实则是matlab的基础。 1.数值与符号 如果给工程数学问题分类,最大的两类肯定是数值问题和符号问题,对应matlab的数值运算和符号运算。简而言之,数值运算就是所有的变量的值已知,求解的也是一些具体的值;符号运算则刚好相反,不要求所有的变量都已知,求解的结果也不是变量具体的值,而是变量之间的关系。一个简单的例子是 ①数值问题:求解一元二次方程,ax2+bx+c=0,其中a=b=c=1,所求得的结果一定是x=几点几+几点几i,是个复数,是个具体的数值。 ②符号问题:求解一元二次方程,ax2+bx+c=0,所求的的结果一定是x=求根公式,是abc的函数,是个关系 可见,一个问题是数值问题还是符号问题,很大程度上决定于结果需要求解的是数值还是关系。当然两个问题也可以相互转化,比如数值问题的一元二次方程,我们一般会先转化成符号问题,把abc代入求根公式,求出来变量x的具体数值。但实际中,一般我们并不推荐这样做,原因是matlab的数值和符号是完全不同的两套系统,相互转化不仅需要多余的数值符号转换语言,更可能带来查错的不便。 2.典型数值问题 以下是常见的数值问题,文中提到的解法均可在数值计算、科学计算、数值算法这类书中找到。 2.1代数方程 代数方程又分为线性方程和非线性方程,线性方程一般可以转化为矩阵形式AX=b,对A求逆即可。求逆的数值解法一般有高斯赛德尔迭代,超松弛迭代等。非线性方程一般转化为f(x)=zeros其中x是个向量,右侧的zeros表示f是个多输出函数,数值解法一般是迭代,常见的有牛顿迭代,最速梯度,点斜式等。 2.2常微分方程 常微分方程一般转化为Dy=f(y,t),且y(0)=y0是初始条件,其中y和Dy都是向量,f也是个多输出函数,数值解法有欧拉法,龙格库塔法。 2.3偏微分方程 偏微分方程比较复杂,matlab处理偏微分方程也不专业,我也几乎不用matlab处理这类问题。但工程数学上,偏微分方程的解法有两类,差分法和有限元法。差分法需要采用中心差分,迎风差分等。有限元需要计算刚度矩阵等。 2.4插值和拟合 插值和拟合是完全不同的两个数学概念,虽然很多时候很多人都混淆了。两者的描述都可以归结为:已知函数上的点(x1,y1),(x2,y2)...(xn,yn),求一个已知的x,对应的y的数值。插值常用的多项式插值,三次样条插值。拟合的本质是一个最优化问题,其中最常用的一种拟合是线性拟合,求解方法是最小二乘法。 2.5离散周期傅里叶变换 严格说来,这并不能算一个数学问题,只是一种运算方式,就好像加减乘除一样。特殊性在于这种变换是对于一个向量进行,且运算后的结果依然是个向量。这里提出来是为了强调这种傅里叶变换的限定,要求是离散周期,这也是数值方法能处理的唯一一种傅里叶变换。 2.6最优化问题 最优化问题比较宽泛,一般可以归结为求目标函数f(x)的最大或者最小值,其中f是一个单输出的函数,x是一个向量。其中x需要满足线性约束条件、非线性约束条件、上下界。具体的解法有最速梯度,遗传,蚁群,退火等算法。 2.7数值积分 已知函数上的点(x1,y1),(x2,y2),...(xn,yn),求函数在x1到xn的定积分。常见算法有矩形公式,梯形公式,辛普森公式。类似的问题还有数值求导。 3.典型符号问题 以下是常见的符号问题,需要特别指出的是,无解问题。数值问题中也有一部分无解问题,但大多数工程中是碰不到的。而符号问题恰好相反,绝大部分我们遇到的符号问题都是没有解的,或者准确的说,没有解析解。比如求一元五次方程,我们知道x和这些系数存在关系,但无法写出显式的表达式,也就是说没有解析解。 3.1递推转通项 这个问题可以归结为:已知xn+1=f(xn),求xn,常见于数列的推导。 3.2代数方程 区别于数值问题中的代数方程, 这里的代数方程问题可以描述为:f(x,c)=0,求x=x(c),这里需要求解的其实是x和c的关系。 3.3常微分方程 区别于数值问题中的常微分数方程, 这里的代数方程问题可以描述为:Dy=f(y,t,c),求y=x(t,c),一般无需初值条件。 3.4符号积分 区别于数值问题中的数值积分,这里的符号积分可以描述为:已知函数关系y=f(x),求y的不定积分。同样的问题还有符号求导。 |
414 条回复
本帖最后由 halleyhit 于 2018-4-22 21:04 编辑 matlab最基础教程(一):软件基本概念 前言:①如果你是第一次使用matlab,建议阅读本教程。②以2017a版本为基础,适用于2014a及之后的版本,之前的版本未测试。③结合这两个月在坛子里回答的问题,整理成教程,水平有限,欢迎指正。 1.matlab的界面 左上角,home标签下,找到layout进行设置/复位,可以设置各板块的显示与隐藏。其中有几个部分,请务必要显示 ①Current Folder:中文一般翻译成工作路径,一般设置成一个自己建立的、有读写权限的文件夹,例如我的文档下建立一个matlab文件夹 ②Command Window:字面意思是命令窗口,用来运行代码,所有的代码都是在这里输入 ③Workspace:字面意思是工作空间,其实就是暂存所有运行结果的地方,“暂”的具体含义是:关闭matlab后丢失 2.软件中的基本概念 2.1 函数 matlab之所以强大,就是因为提供大量的函数,你也可以建立自定义函数,方法是:Home->New->function。自定义函数一般保存在工作路径下。函数文件的特征是:扩展名m,内容的第一行以function开头,后续内容是“输出变量=函数名(输入变量)”。且函数名和文件名相同。 每个函数在Command Window中运行,用来完成特定的计算任务,运行方式是输入“输出变量=函数名(输入变量)”,然后按回车。例如有个系统自带的函数是用来求绝对值的,函数名abs,所以在Command Window里输入“a=abs(-1)”,就会显示运算结果为“a=1”。且运算结果会在Workspace里出现一个变量a,双击后可看到a的值是1。 2.2 脚本 可以理解为特殊的函数,这种函数内容的开头没有function那行,因此没有输入、输出变量,也没有函数名。文件扩展名和函数一样是m,也需要在Command Window里运行。脚本都是用户建立的,方法是:Home->New Script。一般保存在工作路径下。脚本的功能就是完成用户需要的、复杂的计算任务,通常脚本里会调用很多函数。 2.3 GUI 一般翻译为界面,就是人机交互界面的意思。写脚本处理问题的方法有点麻烦,让人看起来更像是码农,所以现在很多问题可以通过界面点点鼠标解决。这时候就需要打开界面,打开方法是:在APPS标签里可以找到所有已安装的GUI工具,单击即可。注意右边有个小三角可以点开。和函数一样,用户也可以自己建立自定义GUI,这部分较为复杂,对新手而言有点遥远。 2.4 toolbox 一般翻译成工具箱,matlab将功能相近或者应用上自成体系的一组函数和GUI打包成一个toolbox。正版的matlab在购买时,几乎每一个toolbox都是要单独收费的,所以toolbox也可以理解为matlab产品的模块,一个工具箱就是一个产品/商品。 2.5 simulink 一般用matlab解决问题的过程是:用户自定义脚本,在Command Window里运行脚本。而脚本的运行逻辑是顺序执行,和一般的编程一样。simulink则提供另一种思路,图形化编程,有点像labview,这种方法很适合于物理模型的仿真,因此有时用“matlab编程”和“simulink仿真”强调。使用方法是在home标签下点击simulink。 3.获得帮助 常用的获得帮助有四种方法 ①home标签里,有个Help标志,点开后可以获得各工具箱/产品的完整帮助文档。新版本中默认使用在线,改用本地帮助的办法是在home标签里,Preferences下的matlab/Help里选择installed locally ②cn.mathworks.com官网上找到支持,然后可以获得教程。这种方法获得的帮助文档和第一种方法一样。 ③在Command Window里输入 doc+函数名 来获得帮助。比如输入"doc fft"可以获得离散傅里叶变换函数fft的帮助和范例。这种方法获得的文档是前两种方法文档中的部分。当然,前提是你要知道函数名,才能找到帮助。这种方法适合于获得系统自带函数的使用说明。 ④使用GUI时,通常界面的角落里有Help,点开可以获得帮助。这种方法获得的文档是第一和第二种方法文档中的部分。这种方法适合于获得系统自带GUI的使用说明。 这几种方法中,最常用的是第三种,只要知道自己需要的函数名,就可以用这种方式获得说明和范例。而实际使用中,一般常用的系统自带函数,也并不是非常多,大概几十个?真正需要牢记使用方法的可能就几个,通常都是知道函数名,要用的时候doc一下。 |
本帖最后由 halleyhit 于 2018-4-22 21:32 编辑 matlab最基础教程(二):变量类型与赋值 前言:matlab解决问题的最基本思路是建立脚本文件,那么脚本文件的第一段就是定义一些变量,这和C语言等编程思想是一样的。matlab提供的变量类型很多,最基础的是三种:数值变量、符号变量、字符串,其他的类型还有cell、table等。这里仅说明最基础的变量类型。 1.数值变量 matlab中所有的数值变量都是矩阵,赋值时,以方括号作为开头和结尾,以英文逗号或空格分割同行元素,以英文分号分割各列。例如在Command Window里输入
向量和数字可以视为特殊的矩阵,例如
数值变量的命名要求是英文字母开头,不能包含特殊符号,大小写敏感。这里推荐采用下划线来进行分割,例如value_of_A,这和其他编程语言的命名规则大体相当。 赋值中,有时需要用到等差数列,例如定义一个向量a=[1 2 3],如果比较长,赋值很麻烦,所以matlab提供了一个简单的方法
当然分块矩阵也可以
2.符号变量 总体而言,符号变量比数值变量简单得多,因为变化非常少,常用的赋值命令是
有些变量之间存在依赖关系,此时可以定义
上述方法定义的符号变量是一个数,或者1*1矩阵,matlab中也可以定义符号矩阵,例如
定义符号变量后,workspace中出现相应的变量名,图形不是数值变量的田字形,而是方框里有个立方体,双击后可以看到行列数。 3.字符串 比数值、符号更为简单的就是字符串了,其定义方法是以单引号开头和结尾,例如
当然字符串的值也可以是特殊符号,比如
定义字符串变量后,workspace中出现相应的变量名,图像是方框里写了ch,双击后可以看到行列数。 |
本帖最后由 halleyhit 于 2018-4-26 14:12 编辑 matlab最基础教程(三):常用的系统自带函数,数值变量篇 前言:上一篇说了变量的类型和赋值,这里接着说这些变量的基本运算,捎带一些常用的系统自带的函数,通过这些运算和函数,已经可以完成一些简单的计算了。 1.数值变量的基本运算 数值变量都是矩阵,矩阵之间最基本的运算有加、减、乘(方)、转置,运算符分别是+-*',与数学中的一般表示无异,但仍有一些地方需要注意,以下结合代码进行说明。 1)矩阵加减法只有维度相同的矩阵才能进行,例如
2)矩阵乘法只有第一个矩阵的列数等于第二个矩阵的行数时,才能进行,例如上段代码中的abc,则
3)矩阵与数乘除,由于数也可以看做1*1的矩阵,因此这是一种特殊的矩阵乘除法,和数学上定义一样,比如
4)转置,任何维度的矩阵都可以进行转置,例如
2.数值变量的特殊运算 和其他软件不同,matlab里提供了一些很有意思的运算符,有点乘.*、点除./和点方.^,这些运算符在本身的运算符前加一个点,可以实现很强大的功能,但由于和一般的运算符太像,也造成了很多人混淆。这些运算符有很多叫法,比如.*,一般称为点乘、元素乘、数乘,这些叫法都是为了让这个运算符区别于普通的乘,有时为了强调这种区别,也把通常的乘叫矩阵乘。 简单而言,这些运算的含义是将矩阵作为一般的数来进行运算,比如
于是,什么时候用矩阵乘,什么时候用点乘,其实是看计算的目的,但有些时候,这两种运算符的确是等效的: 1)数字的乘除
2)矩阵与数字的乘除
3.数值变量的常用函数 这里的函数都可以通过doc+函数名查到更详细的帮助,因此仅列出典型用法。
|
本帖最后由 halleyhit 于 2018-4-26 14:13 编辑 matlab最基础教程(四):常用的系统自带函数,符号变量与字符串篇 前言:matlab字面意思是矩阵实验室,软件重点是数值变量的运算。所以在符号变量和字符串的运算上,功能并不强大,我用的也不是很多,因此这篇的内容请多多指正。 1.符号变量的基本运算 符号变量的基本运算与数值变量一样,加减乘之类的,比如
2.符号变量的特殊运算 符号变量的特殊运算也与数值变量一样,但一般而言,符号变量都是1*1矩阵,因此特殊运算与基本运算一般都是等效的。比如
3.符号变量的常用函数 数值变量的常用函数,一般都可以直接用在符号变量上,比如三角函数
但偏偏有些函数非常蛋疼,对符号变量与数值变量都可以进行操作,但操作的含义完全不同,比如diff,diff对于一个数值变量的运算结果是差分,而对于一个符号变量的运算结果则是求导
另外也存在很多函数只能对数值变量操作,比如离散傅里叶变换fft。还有很多函数只能对符号变量操作,比如泰勒展开taylor。因此在matlab使用中,一定要区分变量的类型,其实真的用起来也好区分,因为完成特定的计算任务,要么全部用数值,要么全部用符号,这也符合一般处理问题的原则。 我平时做符号运算比较少,用到的函数,除了exp、sin这类数学运算外,还有: int 求积分,符号运算特有,可以求定积分,也可以求不定积分,但一般不会写+C diff 求导数,符号运算特有 limit 求极限,符号运算特有 ezplot 作图(新版本中,软件推荐使用fplot),类似数值变量运算时的plot 4.字符串的常用函数 matlab中字符串的常用算符就更少了,但都非常有用,这里介绍几个: 1)num2str和str2num:可以实现数值变量和字符串变量的转换,比如
|
本帖最后由 halleyhit 于 2018-4-23 07:12 编辑 matlab最基础教程(五):判断与流程控制 前言:判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。 1.逻辑变量 1.1逻辑变量的赋值 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入
对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用
高级函数的判断,是指系统自带的一些函数,例如
1.2逻辑变量的逻辑运算 逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意: 1)~单独使用表示非运算,要区别于不等于~=的连用 2)如果是高级函数的判断配合非运算,也可以实现判断,例如
1.3逻辑变量的数值运算 matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如
2.流程控制 matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。 2.1if判断 语法是:
2.2switch判断 switch的语法是:
2.3for循环 for循环的语法是:
2.4while循环 while语句的语法是:
|
本帖最后由 halleyhit 于 2018-4-23 07:17 编辑 matlab最基础教程(六):编程习惯 前言:matlab的基本使用方法差不多介绍完了,确定问题类型(数值/符号),编程(函数/脚本)并运行即可。但具体编程过程中,良好的习惯非常重要,一方面便于调试,另一方面便于代码维护和升级。 1.注释 matlab提供两种注释,分别是%%和%。%%一般独占一行,用来分段,两个%%之间的内容称为一段,在程序调试时,可以设置为运行一段代码后暂停,以便查看一段代码的运行结果。使用范例如下:
%常用于一般代码的末尾,用来说明这一行代码的含义,例如
2.分行 无论matlab还是其他程序语言,也无论函数还是脚本,依次逐行运行是基本特征,因此我们一般不希望一行的内容太多,因为这样不方便差错。但如果一定要使用这样一行很长的代码,matlab提供了一种分行的方式。使用方法是在代码中输入三个.,然后回车。这样产生的代码比如:
3.分号 matlab的每一行代码,一般都会在command window里显示运行结果,如果不想显示,可以在代码后面写一个分号;,这样就可以不显示该行的运行结果。需要注意的是:其一,写不写分号不影响程序的运行和结果;其二,显示运行结果是需要占用计算时间的,因此一般的语句都会写上分号;其三,if、for等流程控制语句,这一行不加分号。 4.先定义再使用 虽然matlab中可以直接使用a(2,2)=1这样的语句,而无需先定义a是多大维度的矩阵,但这样可能造成运行变慢。先定义再使用依然是个好习惯,尤其是赋值语句中有讲过zeros和ones这样的语句,先把矩阵的维度定义好,再逐个元素赋值或者局部赋值,有助提高运行效率。 5.特殊运算代替循环 matlab相较于C等语言的强大之处在于用特殊运算代替循环,比如a和b是同纬度矩阵,要将他们对应的元素相乘。在常用运算中,我们讲过,在matlab中可以用点乘.*。在C语言中则需要一个for循环,遍历a和b的每个元素,相乘后赋值给结果矩阵。当然,matlab中也可以用for循环来实现这个操作,但相比特殊运算,for循环的效率实在是差太多。特殊运算代替循环也成为了提高运行效率的主要方法,当然,如果是习惯于C语言的初学者也可以无视这一节。 |
本帖最后由 halleyhit 于 2018-4-23 07:22 编辑 matlab最基础教程(七):编程调试与常见报错 前言:刚写完的脚本,运行时难免出错,此时需要关注报错信息与提示,进行调试。同时,这也是本教程最后一篇。 1.打断点和分段 写完脚本并保存后,在每一行可执行代码前,有一个行号,和一个小横线。报错信息中会有类似“Error in 文件名 (line 行号)”这样的提示,其中的行号就是代码前的这个行号。小横线说明这一行是可执行代码,而不是注释。鼠标左键小横线,此时横线变为红点,说明在这个位置设置了一个断点。脚本运行时,遇到断点会自动暂停,并进入调试模式。此时可以用continue继续执行,也可以step逐行执行,也可以step in进入调用的子函数执行。初学者一般熟悉step即可。 进入调试模式时,可以观察workspace里的变量,看是否和预想一样,也可以在command window里输入其他代码或运行其他脚本/函数。在调试模式中,可以通过左键断点(红点)和小横线来设置新的断点和取消旧的断点。也可以按quit debugging退出调试模式。 分段是类似断点的一种运行方式,参考上一篇中%%注释的说明。当脚本中有多个%%时,%%相当于分段符号,左键run and advance可以实现逐段运行,运行完一段后,相当于进入调试模式,可以在workspace里查看运行结果,但其他的操作一般不建议进行。分段运行的另一种用法,是需要输出多个图像的时候,可以运行一段,截图,再运行一段,再截图。 2.常见报错 运行脚本后,会在command window里出现红色或者黄色的字,就是报错信息与提示。首先,报错信息会给出定位,哪个文件,第几行。有时会在多个位置给出报错,这说明报错那行的调用关系,例如自定义脚本A中n行调用了自定义函数B,而自定义函数B的m行出错了,则报错信息会定位到A的n和B的m,看起来好像是两个地方出错,其实是B的m错了,但实际中也可能是调用B的方式不对。这种情况尤其会出现在调用系统自带函数时,此时一般是调用方式不对,所以要关注A的n。 给出报错定位后,就是看具体的报错信息了,matlab中常见的一些报错信息有: Undefined function or variable '函数/变量名'. 说明使用变量前没有遵循先定义再使用的原则 Inner matrix dimensions must agree. 数值运算中常见错误,参考数值基本运算那篇的矩阵运算部分 Index exceeds matrix dimensions. 超出索引,例如a=[1 2 3],此时当用到a(4)时 虽然定义了a1~3,但没有定义a4,此时却用到了a4,因此报错 本质上,这也是一种未定义先使用的错误 Subscript indices must either be real positive integers or logicals. 参考矩阵赋值中所说的分块赋值,圆括号中表示位置或者序号,当圆括号中出现非自然数时报错 Expression or statement is incorrect--possibly unbalanced (, {, or [. 有开括号而没有关括号,或者有关括号而没有开括号,一般是计算式太长而打错了 Invalid data type. 或者Data must be numeric. 或者Undefined function '函数名' for input arguments of type 'double'. 参考前述的数值运算与符号运算的说明,有些函数只用于数值,有些只用于符号,混用时报错。 3.最后总结 1)doc+函数名,多看帮助多看范例。看到范例,逐行运行看结果 2)分清数值和符号,两种运算两套系统 3)学好数学再学软件(其实基本的数学知识在帮助文档里也有) |
完结,水平有限,欢迎指正 |
你好,请问有没有关于图像处理的教程 |
halleyhit 发表于 2018-4-22 20:40 感谢感谢 ![]() |
b=[a a],您好,请问这个是可以确定b的行列数吗,我是看的您写的最基础教程上的 |
梧凤之鸣 发表于 2018-5-2 09:23 这是一种矩阵分块赋值的方式,只是举个例子 这种赋值方式下,b的行数=a的行数,b的列数=a的列数*2 |
a=123456 b=num2str(a) c=b(1)这句是指取b的第一个字符串吗? d=str2num(c)d是数值变量 |
梧凤之鸣 发表于 2018-5-2 14:25 字符串变量可以视为矩阵,所以例子中,b相当于一个向量 c相当于分块矩阵赋值 d是把字符串再转回数值 |
Powered by Discuz! X3.4
© 2001-2021