type
status
date
slug
summary
tags
category
Property
Mar 29, 2024 12:29 PM
icon
password
属性
属性 1
描述
Origin
URL
 

Matlab基础用法

界面

notion image
Matlab软件界面主要可分为几大块:
  • 菜单和工具栏,不多说
  • 编写程序窗口:在这里编辑程序文件(注意程序中绿色的字体是注释文本,是不被程序执行的);
  • 文件夹窗口:显示当前所处的文件夹以及文件夹下面的所有文件(你要运行一个程序文件,此文件一定要在当前文件夹下面,不然需要切换到该程序文件所在文件夹);
  • 变量窗口:会展示并列出运行程序过程中产生的变量(这些变量有时候对于调试检查程序的正确性具有至关重要的作用!);
  • 命令行窗口:可以在>>后面任意输入matlab指令,再按回车,立刻出执行结果。

基础指令

+,-,×,÷四个运算符在Matlab中分别对应+,-,*,/四个符号
  • Matlab中是pi
  • 乘方是^
  • 开根号是sqrt
  • 绝对值是abs
  • 三角函数写法不变
  • 如,计算复杂算式
解方程方程用solve或者roots或者fsolve或者fzero等指令,甚至你可以把方程的函数图像画出来,然后直接找函数值为0的点!例如,求解一元二次方程 ,用指令solve(该指令可以求解一些不是很复杂的方程或者方程组,得到准确解!但是对复杂的方程无能为力)求解得到:
注意,solve指令求解符号方程,需要首先利用syms定义一个符号变量 。
用指令roots(该指令专门求解多项式的根,N阶多项式可以求出N个根)求解得到:
指令fsolvefzero是相对高级的求解方程的函数,可以求解非常复杂的方程还有方程组,理论上说不管多么复杂都可以求解(是基于一些迭代算法,因此得到的是数值解而不是精确解)。
画二维函数图像,用指令plot或者ezplot或者fplot。例如,绘制函数  的图像,用fplot,
 
notion image
其中,grid on指令是为图像加网格。
plot指令,首先要取点,再计算每个点处的函数值,最后"描点画图",如下
notion image
你也可以仅仅“描点”,如
其中,'rp'中的r表示颜色为红色,p表示标注点为五角星(还有各种形状可选)。得到
notion image
绘制复杂的函数
其中,c--指定颜色为cyan,线型为虚线,得到
notion image

有趣的指令

peaks指令,
notion image
xpklein指令,画出克莱因瓶(克莱因瓶只有一个面,无所谓内无所谓外也)
notion image
makevase指令,顾名思义,“制作花瓶”,鼠标点击得到花瓶的外形
notion image
鼠标右键得到“花瓶”
notion image
vibes指令,得到L形鼓膜振动图,动感十足(这里没有显示动图,可以自己去命令行输入命令感受)
notion image
lorenz指令,展示洛伦兹吸引子(蝴蝶效应)的动态图
notion image
 

常用指令

函数与表达式

用符号表达式定义函数(符号表达式在运算时是绝对的解析解,没有任何数值误差!)例如
notion image
若要知道某个自变量对应的函数值,可以使用subs指令并结合vpa指令,如
我们也可以将函数中的变量用另外的变量或者表达式代替(即换元):
若要化简函数表达式,使用expand,展开表达式:
或者simplify,化简表达式:
还有一个很好用的指令:pretty,该指令可以使得复杂的符号表达式用比较‘人性化’的方式显示在屏幕,例如
针对符号表达式运算,还有许多有用的指令,例如因式分解factor,合并同类项collect,分式通分numden等等,且不必细说。
匿名函数,通常定义格式为f=@(x,y,...)表达式,例如
notion image
  • 值得说明的是,匿名函数定义函数快捷方便,运算结果是高精度的数值结果,在后面将要介绍的数值积分微分方程数值解等方面都会用到。
 
  • 符号表达式转化为匿名函数,将要隆重介绍一个指令matlabFunction,该指令可以将任意的符号表达式转化为相应的匿名函数,对复杂表达式求值具有很重要的简化作用。例如,你想求一个具有多个变量的复杂表达式在指定点处的函数值,不嫌麻烦你可以嵌套使用subs指令,如
这里存在3个自变量x,y,z就需要嵌套使用subs指令3次。
 
下面用转化匿名函数的方法,有
  • 可以看到,matlabFnction指令将原来的符号表达式转化为了具有3个自变量的函数句柄ff,直接调用它就可以高效地计算函数值!
 
  • 利用函数文件定义函数需要指出,Matlab文件分为两类,
  • 第一类为程序脚本文件,也就是可以直接运行的程序文件;
  • 第二类是函数文件,不能被直接运行(只能被脚本文件调用),以关键词function 开头,函数名和文件名必须保持一致(许多初学者往往会忽略这一点,会导致很多简单的运行错误)。例如,定义函数名称为myfun
notion image
然后Ctrl+s保存文件,会发现当前文件夹下出现名为myfun的函数文件
而后,我们就可以在命令行窗口或者程序脚本文件中调用该函数,例如
在各种需要定义复杂函数表达式的问题中都需要利用函数脚本文件来定义函数。

函数图像

对于绘制二维函数图像,上一篇中已经介绍了几个常用的指令:plotezplot以及fplot. 可以简要总结为
notion image
下面介绍极坐标曲线的绘图指令polarezpolar,以及如何显示轨迹(“轨迹”一词立马让我想起高中数学圆锥曲线压轴题,很快啊)。

polar

  • polar指令可以由极坐标的数据点绘制极坐标曲线图,下面绘制半径为2的圆
notion image
其中,0:0.1:2*pi是一种数组的生成方式,表示从0开始到2*pi结束,步长为0.1
ones(size(theta))指令是生成与theta等长度的全1数组,使得每一个theta值对应的极径r都为2. polar指令中的b表示图线颜色设置为蓝色。
下面绘制心型线
notion image
 

ezpolar

ezpolar指令快速绘制符号表达式极坐标图,例如,绘制螺旋线方程,
notion image
显示2维曲线的轨迹图用指令comet(3维曲线轨迹用comet3),该指令可以运用在高中物理中天体运动以及带电粒子运动轨迹可视化等方面。例如,螺旋线轨迹
notion image
甚至可以利用comet指令来画简笔画
notion image

符号表达式

利用符号表达式可以定义一个函数表达式,所有的符号表达式定义都从syms指令开始,比如你的表达式包含x,y两个变量,那么你要首先定义两个符号变量: 紧接着就可以写出你的符号表达式,例如想画一个双曲面三维图,
notion image
其中fsurf指令可以快速绘制符号表达式的三维曲面图,你只要指定函数表达式,调用该函数就可以很快绘制曲面图,不需要指定任何数据信息。这和之前介绍过的快速绘制符号表达式的二维曲线图的指令fplot用法类似。(以后我们专门讲绘图指令时会再提。)

expand

我们可以利用符号表达式来进行简单的公式推演,例如
其中expand指令是把乘积结果展开。
我们也可以对符号表达式进行化简,例如

simplify

函数求极限

微积分中求极限是最基本的操作。在matlab中求极限的指令为limit(f,var,a),即求
的值。例如,我们求下面这个常见的极限
 
完全正确!对于高等数学中所有的求极限题目都可以一网打尽!

泰勒展开

Matlab中求一个函数f的某个自变量x某点x0处截断的泰勒展开利用指令taylor(f,x,x0),其中x0若是缺失则默认在0处展开,例如求函数在0处的前几阶泰勒展开:
(若没有指定展开到多少阶,默认最高只展开到6阶)我们可以指定展开到n阶,利用taylor(f,x,x0,'order',n).例如展开到13阶
我们也可以对二元函数进行泰勒展开(这是高等数学下册所学,不要求掌握的内容),例如求函数的前13阶展开:

函数求导

微积分中求导是第二基本操作。在matlab中求导的指令为diff(f,var,n),即对函数f的某个变量varn阶导数。例如,我们求函数的一阶导数,有
我们也可以求偏导数,例如对如下函数求x偏导

求不定积分

微积分中求积分是第三基本操作。在matlab中求不定积分的指令为int(f,var),即对函数f的某个变量var求积分。例如,我们求积分两边积分
我们可以求多元函数关于某一变量的积分(其他的变量当成常数对待),例如求

求定积分

定积分就是在不定积分基础上加上积分上下限,有多种方法。
  • 方法一,符号表达式利用int(f,x0,x1)求函数fx0x1区间的积分。例如,求积分
  • (还记得高等数学教材中是如何求此积分的吗?上册教材利用“夹逼定理”,即先求圆域积分再求正方形域积分,最后取极限;下册是利用二元函数极坐标系求积分,最后取极限)在matlab中只需要两三行程序:
方法二,匿名函数(前面说过匿名函数怎么定义)情况下利用integral(f,x0,x1)求函数fx0x1区间的积分。例如,依然求上面的积分,则有
注意这里面得到的是数值结果(除了符号表达式下得到的是精确的解析解外,其他情况下都是数值解!)
integral指令求一元函数的定积分可以说是非常强大!任何复杂的一元函数都可以利用该指令求出数值积分!后面我们将会讲到对应的二重积分和三重积分求积指令分别为integral2integral3.
 
方法三,各种数值积分。例如quad(f,a,b)利用复化辛普森求积算法计算积分(精度比较高),trapz(x,y)利用梯形公式计算积分(精度最低)。例如,依然计算上面的积分,利用quad函数有
(注意quad中的上下限不能出现无穷符号inf,所以如果你的求积区间存在无穷大,要使用quad指令,可以把无穷大用一个相对较大的数值取代,例如这里我把无穷大取代为1000)
integral的结果一致。(有人可能会问把无穷替换为一个相对较大的数,积分出来结果能不能反映真实值?很显然,如果一个函数在0到无穷大的区间内积分收敛,即积分结果是一个定值,那么你取0到1000和0到10000积分得到的结果应该很接近,如果说你取了两种相对较大的区间,发现积分结果差别比较大,可能存在两种原因,第一,被积函数在无穷范围内积分不收敛!第二,你取的“相对较大”的数还不够大!)
 
我们再利用trapz函数来求此积分,(先把0到1000离散成很多个点x,显然我也不可能取0到无穷大的离散点,所以就取一个相对较大的数1000。再计算每个离散点处被积函数的值f.然后调用trapz函数计算积分)得到

例题

积分

绘图

的交线
其中,用到绘制符号三维曲面的函数fsurffmesh.得到: 这恰是空间中的一个椭圆。
notion image
notion image
 

解方程

解代数方程(组)的求解是个永恒的话题,线性方程组很好解,直接利用线性代数理论即可。对于非线性方程组,在matlab里面可以利用solve指令求解符号方程组(可以得到绝对的解析解,但是只对一些不太复杂的方程组有效),复杂的非线性方程组可以利用fzerofsolve求解数值解。
例如,我们求解方程组:
notion image
可以看出,求出三组解,一组实数解,两组复数解。
有时候我们不想要复数解,只想求实数解,这时候就需要用到一个很厉害的指令:assume(var,conditions),即:假定变量var具有condition条件,这些条件可以有real(实数),positive(正数),integer(整数)等等。
例如,对上面的问题,我们只要加上两句指令:
notion image

求偏导数

求偏导数是多元函数微积分最基本操作。求偏导还是用一元函数求导指令diff,只是需要嵌套使用。
2021年考研数学一第20大题为例,演示matlab在复杂符号函数求偏导数方面的威力。
该题计算,其中:
notion image
能不能利用格林公式需要判断是否成立:
遇到复杂表达式一定要想到simplify可以来帮忙!

二重积分

首先,大家需要知道,解方程或者计算积分,都存在两种方法:
  • 符号表达式,可以求精确的解析解,但是只适用一些较简单的情形;
  • 数值计算,求出数值解,适用范围很广。
首先,对于符号表达积分,之前已经介绍过一元函数积分int(f,x,a,b)指令,对于二重积分,只需要嵌套使用。
例如,我们求积分
notion image
则只要三行指令:
(任何符号表达式运算都需要首先利用syms定义变量!)其中int指令进行了一次嵌套使用,
对于复杂的积分,例如计算:
notion image
注意其中积分变量y的下限是x的函数.
如果我们依然利用符号表达式积分,有:
显然得不到想要的结果。
如果我们想要看这个积分的值到底是多少,可以利用数值积分指令
integral2(fun,xmin,xmax,ymin,ymax),其中xmin,xmax一定要是常数,而ymin=ymin(x),ymax=ymax(x)可以是x的函数。
对于上面的积分,有:
 

三重积分

对于三重积分,和二重类似,可以利用int的嵌套使用来求绝对精确的符号表达式积分,但是大多数情况下我们需要借助Matlab函数integral3(f,xmin,xmax,ymin,ymax,zmin,zmax)来求数值积分.
需要注意的是,x变量的上下限一定是常数!
y变量的上下限可以是x变量的函数,即ymin=ymin(x),ymax=ymax(x).
z变量的上下限可以是x、y两个变量的函数,即zmin=zmin(x,y),zmax=zmax(x,y).
因此,再果使用integral3计算三重积分时,如果你的x变量的上下限不是常数,要先进行转化,把上下限是常数的积分变量当成x,其余两个上下限不是常数的变量分别当成y,z.
例如,我们求下面的四面体的体积,
notion image
利用三重积分表达为
notion image
利用int嵌套来求符号表达式积分,
利用integral3来求数值解,注意需要将不是常数的积分上限ymax=1-x,zmax=1-x-y用函数句柄的形式定义出来,
 

级数求和

Matlab中级数求和用symsum指令,基本用法为symsum(f,k,a,b),表示对表达式f中的kab求和.
例如,求级数
notion image
(在高等数学中我们已经知道,此级数可以通过傅里叶级数展开的方法求得,值为).
我们需要定义符号表达式,再利用symsum求和,
Exactly what we expect !
我们也可以利用symsum求无穷级数的和函数,例如,求:
notion image
(显然,这是函数的展开式).利用下面的程序:

解常微分方程

同积分的计算一样,解微分方程也可以分为利用符号表达式的解析方法和各种丰富的数值方法.
Matlab中常微分方程的符号表达式解法利用dsolve(equations,conditions)指令,即在conditions条件下,求解方程equations.
若没有condition条件限制,我们可以得到带有常系数的通解.
例如,我们要求解微分方程:
notion image
这正是上述方程的通解形式。
若要求解带有边界条件的微分方程,例如,求解:
notion image
 

线代

数组的定义与生成

首先,要知道数组Matlab中数据的基本存储与操作格式,一维数组就是线性代数中的向量二维数组就是线性代数中的矩阵.向量的表现形式为一列数据(列向量)或者一行数据(行向量),而矩阵的表现形式为mn列的数据.
Matlab中生成一个数组可以有多种方法:
  • 直接输入,并利用中括号[]将数据括起来,例如a=[1,2,3,4] % 行向量b=[1;2;3;4] % 列向量得到行向量和列向量:要注意的是,相同行的数据之间用**逗号,隔开;不同行的数据之间用分号*隔开。
 
  • 利用冒号:生成等距间隔的数据,格式为a:h:b,即:a到b且间隔步长h的向量.例如,列出20以内的奇数,则有:c=1:2:20 % 1到20,间隔2得到:想要得到列向量怎么办?很简单,转置就好了,Matlab转置是加单引号.例如:d=(1:2:20)' % 转置得到列向量得到列向量:
  • 利用内置函数生成数组,包括:
    • linspace(a,b,n):生成一个从a到b的具有n个数的等距向量,例如:e=linspace(0,1,6) % 0到1,共6个数的行向量
    • zeros(m,n):生成一个mn列的全零矩阵,例如:f=zeros(1,length(e)) % 生成一个与e具有相同长度的全零向量得到一个和行向量e相同长度的全零向量:其中,length(e)函数可以获得向量e的长度。值得注意的是,在编程时提前生成一个用来存放计算结果的全零向量,可以避免在循环语句中向量的长度一直在变化,从而减少计算时间,提高效率,这有点类似C语言中提前指定变量以分配内存的思想。
    • ones(m,n):生成一个mn列的全1矩阵,例如:g=ones(size(f)) % 生成一个与f具有相同维度的全1向量得到一个和行向量f相同长度的全1向量:其中,size(f)函数得到数组f的维度,f此时是1行6列的向量,因此返回[1,6],再利用ones可以得到一个和f维度相同的全1向量g.
    • eye(m,n):生成m行n列的单位矩阵(即对角元素为1,其他元素为0).例如:E=eye(3,3) % 3阶单位矩阵得到单位矩阵:
    • magic(n):生成n行n列的**“魔方”矩阵**(每一行之和、每一列之和、每一斜对角之和都相等的矩阵!)例如:M=magic(4) % 4阶数魔方矩阵得到:读者可以验证是否满足“魔方”矩阵的性质。
    • rand(m,n):生成m行n列0到1的随机分布矩阵,例如:h=rand(2,3) % 2乘以3的随机矩阵得到随机矩阵:
    • randi(Nmax,[m,n]):生成一个m行n列的整数随机矩阵,且整数的最大值为Nmax.例如,k=randi(10,[2,3]) % 2乘以3的整数随机矩阵,最大值为10
    • randn(m,n):生成m行n列的正态分布矩阵。例如:n=randn(1,5) % 1行5列的正态分布矩阵得到:
  • 利用已有的数组进行整体运算与赋值得到新的数组。例如,在二维函数绘图中,我们首先定义离散坐标x向量,再由函数表达式得到对应的y向量,紧接着用y关于x绘图。例如,下面绘制心形线:首先我们要定义个向量来表示角度,紧接着利用写出每个角度处对应的x坐标和y坐标,它们应当和角度向量具有相同维度!最后用y关于x绘图。t=linspace(0,2*pi,100); % 角度离散点x=(1-sin(t)).*cos(t); % x坐标y=(1-sin(t)).*sin(t); % y坐标fplot(x,y,'r-*')得到:注意我们利用了.*运算符号,该运算符可以说是Matlab中最重要的几个运算符号之一!.*运算符号表示的是两个相同维度的数组对应位置的元素相乘,和通常的矩阵乘法规则完全是两个概念。例如,A=[1 2 3];B=[1 1 1];A.*B得到:即为对应元素相乘的结果。
notion image
 

参考资料

Notion数学公式使用初级钣金件模型
  • Twikoo
  • Waline
  • Giscus
  • Cusdis
  • Utterance
Conor
Conor
一个野生的技术宅
公告
type
status
date
slug
summary
tags
category
Property
Nov 25, 2023 06:32 AM
icon
password
属性
属性 1
描述
Origin
URL
🎉持续更新中🎉