type
status
date
slug
summary
tags
category
Property
Mar 29, 2024 12:29 PM
icon
password
属性
属性 1
描述
Origin
URL
Matlab基础用法 界面 基础指令有趣的指令常用指令函数与表达式函数图像polarezpolar符号表达式expandsimplify函数求极限泰勒展开函数求导求不定积分求定积分例题积分绘图解方程求偏导数二重积分三重积分级数求和解常微分方程线代数组的定义与生成参考资料
Matlab基础用法
界面
Matlab
软件界面主要可分为几大块:- 菜单和工具栏,不多说
- 编写程序窗口:在这里编辑程序文件(注意程序中绿色的字体是注释文本,是不被程序执行的);
- 文件夹窗口:显示当前所处的文件夹以及文件夹下面的所有文件(你要运行一个程序文件,此文件一定要在当前文件夹下面,不然需要切换到该程序文件所在文件夹);
- 变量窗口:会展示并列出运行程序过程中产生的变量(这些变量有时候对于调试检查程序的正确性具有至关重要的作用!);
- 命令行窗口:可以在
>>
后面任意输入matlab
指令,再按回车,立刻出执行结果。
基础指令
+,-,×,÷
四个运算符在Matlab
中分别对应+,-,*,/
四个符号- 在
Matlab
中是pi
;
- 乘方是
^
;
- 开根号是
sqrt
;
- 绝对值是
abs
;
- 三角函数写法不变
- 如,计算复杂算式
解方程方程用
solve
或者roots
或者fsolve
或者fzero
等指令,甚至你可以把方程的函数图像画出来,然后直接找函数值为0的点!例如,求解一元二次方程 ,用指令solve
(该指令可以求解一些不是很复杂的方程或者方程组,得到准确解!但是对复杂的方程无能为力)求解得到:注意,
solve
指令求解符号方程,需要首先利用syms
定义一个符号变量 。用指令
roots
(该指令专门求解多项式的根,N阶多项式可以求出N个根)求解得到:指令
fsolve
和fzero
是相对高级的求解方程的函数,可以求解非常复杂的方程还有方程组,理论上说不管多么复杂都可以求解(是基于一些迭代算法,因此得到的是数值解而不是精确解)。画二维函数图像,用指令
plot
或者ezplot
或者fplot
。例如,绘制函数 的图像,用fplot
,其中,
grid on
指令是为图像加网格。用
plot
指令,首先要取点,再计算每个点处的函数值,最后"描点画图",如下你也可以仅仅“描点”,如
其中,
'rp'
中的r
表示颜色为红色,p
表示标注点为五角星(还有各种形状可选)。得到绘制复杂的函数
其中,
c--
指定颜色为cyan,线型为虚线,得到有趣的指令
peaks
指令,xpklein
指令,画出克莱因瓶(克莱因瓶只有一个面,无所谓内无所谓外也)makevase
指令,顾名思义,“制作花瓶”,鼠标点击得到花瓶的外形鼠标右键得到“花瓶”
vibes
指令,得到L
形鼓膜振动图,动感十足(这里没有显示动图,可以自己去命令行输入命令感受)lorenz
指令,展示洛伦兹吸引子(蝴蝶效应)的动态图常用指令
函数与表达式
用符号表达式定义函数(符号表达式在运算时是绝对的解析解,没有任何数值误差!)例如
若要知道某个自变量对应的函数值,可以使用
subs
指令并结合vpa
指令,如我们也可以将函数中的变量用另外的变量或者表达式代替(即换元):
若要化简函数表达式,使用
expand
,展开表达式:或者
simplify
,化简表达式:还有一个很好用的指令:
pretty
,该指令可以使得复杂的符号表达式用比较‘人性化’的方式显示在屏幕,例如针对符号表达式运算,还有许多有用的指令,例如因式分解
factor
,合并同类项collect
,分式通分numden
等等,且不必细说。匿名函数,通常定义格式为
f=@(x,y,...)表达式
,例如- 值得说明的是,匿名函数定义函数快捷方便,运算结果是高精度的数值结果,在后面将要介绍的数值积分和微分方程数值解等方面都会用到。
- 符号表达式转化为匿名函数,将要隆重介绍一个指令
matlabFunction
,该指令可以将任意的符号表达式转化为相应的匿名函数,对复杂表达式求值具有很重要的简化作用。例如,你想求一个具有多个变量的复杂表达式在指定点处的函数值,不嫌麻烦你可以嵌套使用subs
指令,如
这里存在3个自变量
x,y,z
就需要嵌套使用subs
指令3次。下面用转化匿名函数的方法,有
- 可以看到,
matlabFnction
指令将原来的符号表达式转化为了具有3个自变量的函数句柄ff
,直接调用它就可以高效地计算函数值!
- 利用函数文件定义函数需要指出,
Matlab
文件分为两类,
- 第一类为程序脚本文件,也就是可以直接运行的程序文件;
- 第二类是函数文件,不能被直接运行(只能被脚本文件调用),以关键词
function
开头,函数名和文件名必须保持一致(许多初学者往往会忽略这一点,会导致很多简单的运行错误)。例如,定义函数名称为myfun
然后
Ctrl+s
保存文件,会发现当前文件夹下出现名为myfun
的函数文件而后,我们就可以在命令行窗口或者程序脚本文件中调用该函数,例如
在各种需要定义复杂函数表达式的问题中都需要利用函数脚本文件来定义函数。
函数图像
对于绘制二维函数图像,上一篇中已经介绍了几个常用的指令:
plot
ezplot
以及fplot
. 可以简要总结为下面介绍极坐标曲线的绘图指令
polar
和ezpolar
,以及如何显示轨迹(“轨迹”一词立马让我想起高中数学圆锥曲线压轴题,很快啊)。polar
polar
指令可以由极坐标的数据点绘制极坐标曲线图,下面绘制半径为2的圆
其中,
0:0.1:2*pi
是一种数组的生成方式,表示从0
开始到2*pi
结束,步长为0.1
,而
ones(size(theta))
指令是生成与theta
等长度的全1数组,使得每一个theta
值对应的极径r
都为2. polar
指令中的b
表示图线颜色设置为蓝色。下面绘制心型线
ezpolar
ezpolar
指令快速绘制符号表达式极坐标图,例如,绘制螺旋线方程,显示2维曲线的轨迹图用指令
comet
(3维曲线轨迹用comet3
),该指令可以运用在高中物理中天体运动以及带电粒子运动轨迹可视化等方面。例如,螺旋线轨迹甚至可以利用
comet
指令来画简笔画符号表达式
利用符号表达式可以定义一个函数表达式,所有的符号表达式定义都从
syms
指令开始,比如你的表达式包含x,y
两个变量,那么你要首先定义两个符号变量:
紧接着就可以写出你的符号表达式,例如想画一个双曲面三维图,其中
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
的某个变量var
求n
阶导数。例如,我们求函数的一阶导数,有我们也可以求偏导数,例如对如下函数求
x
偏导
求不定积分
微积分中求积分是第三基本操作。在
matlab
中求不定积分的指令为int(f,var)
,即对函数f
的某个变量var
求积分。例如,我们求积分两边积分我们可以求多元函数关于某一变量的积分(其他的变量当成常数对待),例如求
求定积分
定积分就是在不定积分基础上加上积分上下限,有多种方法。
- 方法一,符号表达式利用
int(f,x0,x1)
求函数f
在x0
到x1
区间的积分。例如,求积分
- (还记得高等数学教材中是如何求此积分的吗?上册教材利用“夹逼定理”,即先求圆域积分再求正方形域积分,最后取极限;下册是利用二元函数极坐标系求积分,最后取极限)在
matlab
中只需要两三行程序:
注意这里面得到的是数值结果(除了符号表达式下得到的是精确的解析解外,其他情况下都是数值解!)
integral
指令求一元函数的定积分可以说是非常强大!任何复杂的一元函数都可以利用该指令求出数值积分!后面我们将会讲到对应的二重积分和三重积分求积指令分别为integral2
和integral3
.方法三,各种数值积分。例如
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
函数计算积分)得到例题
积分
绘图
和的交线
其中,用到绘制符号三维曲面的函数
fsurf
和fmesh
.得到:
这恰是空间中的一个椭圆。解方程
解代数方程(组)的求解是个永恒的话题,线性方程组很好解,直接利用线性代数理论即可。对于非线性方程组,在
matlab
里面可以利用solve
指令求解符号方程组(可以得到绝对的解析解,但是只对一些不太复杂的方程组有效),复杂的非线性方程组可以利用fzero
和fsolve
求解数值解。例如,我们求解方程组:
可以看出,求出三组解,一组实数解,两组复数解。
有时候我们不想要复数解,只想求实数解,这时候就需要用到一个很厉害的指令:
assume(var,conditions)
,即:假定变量var具有condition条件,这些条件可以有real
(实数),positive
(正数),integer
(整数)等等。例如,对上面的问题,我们只要加上两句指令:
求偏导数
求偏导数是多元函数微积分最基本操作。求偏导还是用一元函数求导指令
diff
,只是需要嵌套使用。以2021年考研数学一第20大题为例,演示
matlab
在复杂符号函数求偏导数方面的威力。该题计算,其中:
能不能利用格林公式需要判断是否成立:
遇到复杂表达式一定要想到
simplify
可以来帮忙!
二重积分
首先,大家需要知道,解方程或者计算积分,都存在两种方法:
- 符号表达式,可以求精确的解析解,但是只适用一些较简单的情形;
- 数值计算,求出数值解,适用范围很广。
首先,对于符号表达积分,之前已经介绍过一元函数积分
int(f,x,a,b)
指令,对于二重积分,只需要嵌套使用。例如,我们求积分
则只要三行指令:
(任何符号表达式运算都需要首先利用
syms
定义变量!)其中int
指令进行了一次嵌套使用,
对于复杂的积分,例如计算:
注意其中积分变量
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
.例如,我们求下面的四面体的体积,
利用三重积分表达为
利用
int
嵌套来求符号表达式积分,利用
integral3
来求数值解,注意需要将不是常数的积分上限ymax=1-x,zmax=1-x-y
用函数句柄的形式定义出来,级数求和
Matlab
中级数求和用symsum
指令,基本用法为symsum(f,k,a,b)
,表示对表达式f
中的k
从a
到b
求和.例如,求级数
(在高等数学中我们已经知道,此级数可以通过傅里叶级数展开的方法求得,值为).
我们需要定义符号表达式,再利用
symsum
求和,Exactly what we expect !
我们也可以利用
symsum
求无穷级数的和函数,例如,求:(显然,这是函数的展开式).利用下面的程序:
解常微分方程
同积分的计算一样,解微分方程也可以分为利用符号表达式的解析方法和各种丰富的数值方法.
Matlab
中常微分方程的符号表达式解法利用dsolve(equations,conditions)
指令,即在conditions
条件下,求解方程equations
.若没有
condition
条件限制,我们可以得到带有常系数的通解.例如,我们要求解微分方程:
这正是上述方程的通解形式。
若要求解带有边界条件的微分方程,例如,求解:
线代
数组的定义与生成
首先,要知道数组是
Matlab
中数据的基本存储与操作格式,一维数组就是线性代数中的向量,二维数组就是线性代数中的矩阵.向量的表现形式为一列数据(列向量)或者一行数据(行向量),而矩阵的表现形式为m
行n
列的数据.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)
:生成一个m
行n
列的全零矩阵,例如:f=zeros(1,length(e))
% 生成一个与e具有相同长度的全零向量
得到一个和行向量e
相同长度的全零向量:其中,length(e)
函数可以获得向量e
的长度。值得注意的是,在编程时提前生成一个用来存放计算结果的全零向量,可以避免在循环语句中向量的长度一直在变化,从而减少计算时间,提高效率,这有点类似C
语言中提前指定变量以分配内存的思想。ones(m,n)
:生成一个m
行n
列的全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
得到:即为对应元素相乘的结果。
参考资料
- 作者:Conor
- 链接:https://www.xzhh.top/article/matlab0324
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。