当前位置:首页 >> 能源/化工 >>

M文件和面向对象编程


5、M文件和面向对象编程 、 文件和面向对象编程 6、符号计算 、 7、数值计算 、

M文件和面向对象编程 文件和面向对象编程

MATLAB的工作模式 的工作模式 1、指令驱动模式 、
窗口输入数据和命令进行计算时, 在matlab窗口输入数据和命令进行计算时,当处理复 窗口输入数据和命令进行计算时 杂问题和大量数据时是不

方便的。 杂问题和大量数据时是不方便的。 命令行方式程序可读性差,而且不能存储, 命令行方式程序可读性差,而且不能存储,对于复杂 方式程序可读性差 的问题,应编写成能存储的程序文件。 的问题,应编写成能存储的程序文件。

2、 M文件模式 、 文件模式
语句构成的程序存储成以m为扩展名的文件 将matlab语句构成的程序存储成以 为扩展名的文件,然 语句构成的程序存储成以 为扩展名的文件, 后再执行该程序文件,这种工作模式称为程序文件模式。 后再执行该程序文件,这种工作模式称为程序文件模式。

M文件的创建 文件的创建
m文件的类型是普通的文本文件,我们可以使用系统认可的 文件的类型是普通的文本文件, 文件的类型是普通的文本文件 文本文件编辑器来建立m文件 文件。 下的m文件编辑 文本文件编辑器来建立 文件。如MATLAB下的 文件编辑 下的 的记事本和 器、windows的记事本和word等。 的记事本 等

注意:所创建的 文件必须纳入 文件必须纳入matlab搜索路径后, 搜索路径后, 注意:所创建的m文件必须纳入 搜索路径后 才能在matlab命令窗口运行。 命令窗口运行。 才能在 命令窗口运行 Matlab搜索路径的设置 搜索路径的设置
matlab7.0 缺省路径是 缺省路径是C:\MATLAB701\work 若创建的M文件放在新创建的目录下,可通过 若创建的 文件放在新创建的目录下,可通过MATLAB菜 文件放在新创建的目录下 菜 单files/add path 进行路径的添加

M文件可以根据调用方式的不同分为两类: 文件可以根据调用方式的不同分为两类: 文件可以根据调用方式的不同分为两类 脚本文件(命令文件 脚本文件 命令文件) (Script File) 命令文件 函数文件(Function File) 函数文件 脚本文件:将原本要在 脚本文件:将原本要在MATLAB环境下直接输入的 环境下直接输入的 多条语句,存放为.m后缀的文件 后缀的文件, 多条语句,存放为 后缀的文件,在命令行键入文 件名,替代多条语句,一次执行成批命令。 件名,替代多条语句,一次执行成批命令。

力学题1:设目标相对于射点的高度为 给定初速, 力学题 :设目标相对于射点的高度为yf,给定初速,试计 算物体在真空中飞行的时间和距离
clear; y0 = 0; x0 = 0; % 初始位置 vMag = input('输入初始速度 (m/s): '); % 输入初始速度 输入初始速度 vDir = input(' 输入初速方向 度):'); 输入初速方向(度 % 输入目标高度 yf = input('输入目标高度 米):'); 输入目标高度(米 输入目标高度 vx0 = vMag*cos(vDir* (pi/180)); % 计算x,y方向的初始速度 计算 方向的初始速度 vy0 = vMag*sin(vDir* (pi/180)); % wy = -9.81; wx = 0; % 重力加速度 (m/s^2) tf=roots([wy/2,vy0,y0-yf]); % 解方程 解方程wy*t^2/2+vy0*t+y0=yh,计算落点 , tf tf=max(tf); % 去除落点时间 中的庸解 去除落点时间tf中的庸解 t=[0:0.1:tf,tf]; % 设定时间数组,因tf不大可能被 整除,必须加一个tf 设定时间数组, 不大可能被0.1整除,必须加一个 不大可能被 整除 点 y = y0 + vy0*t + wy*t.^2/2; % 计算轨迹 x = x0 + vx0*t + wx*t.^2/2; % 计算射程,画出轨迹 计算射程, xf = max(x),plot(x,y),grid

M文件可以根据调用方式的不同分为两类: 文件可以根据调用方式的不同分为两类: 文件可以根据调用方式的不同分为两类 脚本文件(命令文件 脚本文件 命令文件) (Script File) 命令文件 函数文件(Function File) 函数文件 脚本文件:将原本要在 脚本文件:将原本要在MATLAB环境下直接输入的 环境下直接输入的 多条语句,存放为.m后缀的文件 后缀的文件, 多条语句,存放为 后缀的文件,在命令行键入文 件名,替代多条语句,一次执行成批命令。 件名,替代多条语句,一次执行成批命令。

函数文件:以固定格式书写的程序代码, 函数文件:以固定格式书写的程序代码,第一行是 函数定义行。 语言, 等语言程序一样。 函数定义行。和C语言,Fortran等语言程序一样。 语言 等语言程序一样

matlab函数文件 函数文件
(1) matlab自定义的函数文件称内置函数文件 自定义的函数文件称内置函数文件 拥有大量内置数学函数 函数——用type指令显示其 文件内容 指令显示其m文件内容 例:sin.m函数 函数 用 指令显示其 type sin.m (2). 用户定义函数 文件 用户定义函数m文件 — 需要输入变量,返回输出变量 需要输入变量, 函数m文件的格式: 函数 文件的格式: 文件的格式 function [返回变量 = 函数名 输入变量 返回变量] 输入变量) 返回变量 函数名(输入变量 % 注释说明语句段 程序语句段

编写函数文件求半径为r的圆的面积和周长 的圆的面积和周长。 例、 编写函数文件求半径为 的圆的面积和周长。 function [s,p]=fcircle(r) % calculate the area and perimeter of a % circle of radii r % r ,s ,p分别为圆的半径、面积以及周长 分别为圆的半径、 分别为圆的半径 % 2009年11月18日编 年 月 日编 s=pi*r*r; p=2*pi*r;

特定规则: 特定规则:
1. 函数m文件第一行必须以单词 作为引导词, 函数 文件第一行必须以单词function作为引导词,表 文件第一行必须以单词 作为引导词 示该M文件是一个函数文件 必须遵循如下形式: 文件是一个函数文件, 示该 文件是一个函数文件,必须遵循如下形式: function [因变量 = 函数名 (自变量 因变量] 自变量) 因变量 自变量 函数名的命名规则与变量名相同, 文件的文件名必须 函数名的命名规则与变量名相同,m文件的文件名必须 函数名.m。 是 函数名 。 输入形参为函数的输入参数, 输入形参为函数的输入参数,输出形参为函数的输出参 当输出形参多于一个时,则应该用方括号括起来。 数。当输出形参多于一个时,则应该用方括号括起来。 程序中的变量均为局部变量,不保存在工作空间中。 程序中的变量均为局部变量,不保存在工作空间中。 其变量只在函数运行期间有效。 其变量只在函数运行期间有效。

2.

3.

4.

(4). 函数 文件的调用 函数m文件的调用
一般格式: 一般格式: [输出实参表 函数名 输入实参表 输出实参表]=函数名 输入实参表) 输出实参表 函数名(输入实参表
函数调用时,先将实参传递给相应的形参, 函数调用时,先将实参传递给相应的形参,从而实 现参数传递,然后再执行函数的功能。 现参数传递,然后再执行函数的功能。 注意: 函数调用时各实参出现的顺序、个数, 注意 函数调用时各实参出现的顺序、个数,应与函数 定义时形参的顺序、个数一致,否则会出错。 定义时形参的顺序、个数一致,否则会出错。 MATLAB中,函数可以嵌套调用,即一个函数可以调用 中 函数可以嵌套调用, 别的函数,甚至调用它自身。 别的函数,甚至调用它自身。一个函数调用它自身称为 函数的递归调用。 函数的递归调用。

编写函数文件求半径为r的圆的面积和周长 的圆的面积和周长。 例、 编写函数文件求半径为 的圆的面积和周长。 function [s,p]=fcircle(r) % calculate the area and perimeter of a % circle of radii r % r ,s ,p分别为圆的半径、面积以及周长 分别为圆的半径、 分别为圆的半径 % 2009年11月18日编 年 月 日编 s=pi*r*r; p=2*pi*r;

保存成: 保存成:fcircle.m

调用: 调用:fcircle(30)

利用函数文件实现直角坐标(x,y)与极坐标 ρ,θ 与极坐标(ρ,θ 例、 利用函数文件实现直角坐标 与极坐标 ρ,θ) 之间的转换。 之间的转换。 1、建立函数文件 、 function [rho,theta]=tran(x,y) rho=sqrt(x*x+y*y); theta=atan(y/x); 2、保存为 tran.m 、 3、编写命令文件调用tran.m 、编写命令文件调用 x=input('Please input x=:'); y=input('Please input y=:'); [rho,theta]=tran(x,y);

保存为: 保存为:main1.m 运行: 运行:main1

(5). 函数文件的其他相关概念
(I) 局部变量和全局变量: 局部变量和全局变量:
局部变量只存在于单个函数工作空间, 局部变量只存在于单个函数工作空间, 全局变量通过global定义,格式为 global 变量名。 定义, 变量名。 全局变量通过 定义 可穿行于不同函数工作空间, 可穿行于不同函数工作空间,包括基本工作空间 workspace。 。 值得指出的是:程序设计中,全局变量固然可带来某些 值得指出的是:程序设计中, 方便,但却破坏了函数对变量的封装 破坏了函数对变量的封装, 方便,但却破坏了函数对变量的封装,降低了程序的可 读性和可靠性; 读性和可靠性;

当设计程序较大,子函数较多时, 当设计程序较大,子函数较多时,全局变量给程序调试 和维护带来不便,如果一定要用全局变量, 和维护带来不便,如果一定要用全局变量,要起一个特 别的名字, 别的名字,以免误被修改

(II) 函数参数的可调性
在调用函数时, 用两个永久变量nargin和nargout分 在调用函数时,MATLAB用两个永久变量 用两个永久变量 和 分 别记录调用该函数时的输入实参和输出实参的个数。 别记录调用该函数时的输入实参和输出实参的个数。 只要在函数文件中包含这两个变量, 只要在函数文件中包含这两个变量,就可以准确地知道该函数 文件被调用时的输入输出参数个数,从而决定函数如何进行处理。 文件被调用时的输入输出参数个数,从而决定函数如何进行处理。 nargin用法示例 用法示例 函数文件charray.m: 函数文件 : function fout=charray(a,b,c) if nargin==1 fout=a; elseif nargin==2 fout=a+b; elseif nargin==3 fout=(a*b*c)/2; end

>> x=[1:3]; >> y=[1;2;3]; >> charray(x) >> charray(x,y') >> charray(x,y,3)

程序控制结构:选择结构、 程序控制结构:选择结构、循环结构
1.if语句 . 语句
if 条件 条件1 语句组1 语句组 elseif 条件 条件2 语句组2 语句组 …… elseif 条件 条件n 语句组n 语句组 else 语句组n+1 语句组 end
否 条件1 条件1 否 条件2 条件2 是 否 条件n 条件n 是 是 语句组1 语句组 语句组2 语句组 语句组n 语句组
语句组 n+1

2.switch语句 . 语句
switch 表达式 case 表达式 表达式1 语句组1 语句组 case 表达式 表达式2 语句组2 语句组 …… case 表达式 表达式m 语句组m 语句组 otherwise 语句组n 语句组 end
当表达式的值等于表达式1的值 当表达式的值等于表达式 的值 执行语句组1, 时,执行语句组 , 当表达式的值等于表达式2的值 当表达式的值等于表达式 的值 时,执行语句组2, 执行语句组 , …, , 当表达式的值等于表达式m的值 当表达式的值等于表达式 的值 执行语句组m, 时,执行语句组 , 当表达式的值不等于case所列的 所列的 当表达式的值不等于 表达式的值时,执行语句组n。 表达式的值时,执行语句组 。 注:当任意一个分支的语句执行 完后,直接执行switch语句的下 完后,直接执行 语句的下 一句。 一句。

例、某商场对顾客所购买的商品实行打折销售,标准如下(商品价 某商场对顾客所购买的商品实行打折销售,标准如下 商品价 格用price来表示 程序如下: 来表示): 格用 来表示 程序如下: : price=input('请输入商品价格 请输入商品价格'); 请输入商品价格 price<200 没有折扣 switch fix(price/100) 200≤price<500 3%折扣 折扣 case {0,1} %价格小于 价格小于200 价格小于 500≤price<1000 5%折扣 折扣 rate=0; 1000≤price<2500 8%折扣 折扣 case {2,3,4} %大于等于 大于等于200但小于 但小于500 大于等于 但小于 rate=3/100; 2500≤price<5000 10%折扣 折扣 case num2cell(5:9) %大于等于 大于等于500但小于 但小于1k 大于等于 但小于 5000≤price 14%折扣 折扣 rate=5/100; 输入所售商品的价格,求其实际销售价格。 输入所售商品的价格,求其实际销售价格。 case num2cell(10:24) %大于等于 但小于 大于等于1k但小于 大于等于 但小于2.5k rate=8/100; case num2cell(25:49) %大于等于 大于等于2.5k但小于 但小于5k 大于等于 但小于 rate=10/100; otherwise %大于等于 大于等于5k 大于等于 rate=14/100; end price=price*(1-rate) %输出商品实际销售价格 输出商品实际销售价格

程序控制结构: 程序控制结构:循环结构
1.for语句 . 语句
for 循环变量 表达式 表达式 表达式 循环变量=表达式 表达式2:表达式 表达式1:表达式 表达式3 循环体语句 end
表达式1的值为循环变量的初值, 表达式 的值为循环变量的初值, 的值为循环变量的初值 表达式2的值为步长 步长为1时可省略 的值为步长, 时可省略, 表达式 的值为步长,步长为 时可省略 表达式3的值为循环变量的终值 的值为循环变量的终值。 表达式 的值为循环变量的终值。

2.while语句 . 语句
while (条件 条件) 条件 循环体语句 end
若条件成立,则执行循环体语句, 若条件成立,则执行循环体语句, 执行后再判断条件是否成立, 执行后再判断条件是否成立,如果 不成立则跳出循环。 不成立则跳出循环。

3.循环的嵌套 / 多重循环结构 .
如果一个循环结构的循环体又包括一个循环结构。 如果一个循环结构的循环体又包括一个循环结构。

例、

当n=100时,求 y = ∑ 时
1

n

1 2n ?1

的值。 的值。

程序如下: 程序如下 y=0; for i=1:100 y=y+1/(2*i-1); end y=0;i=1; while i<=100 y=y+1/(2*i-1); i=i+1; end

n=100; i=1:2:2*n-1; y=sum(1./i);

程序流控制
(1) break语句和 语句和continue语句 语句和 语句
与循环结构相关的语句还有break语句和 与循环结构相关的语句还有 语句和continue语句。一 语句。 语句和 语句 般与if语句配合使用。 般与 语句配合使用。 语句配合使用 break语句用于终止循环的执行。当在循环体内执行到该语 语句用于终止循环的执行。 语句用于终止循环的执行 句时,程序将跳出循环,继续执行循环语句的下一语句。 句时,程序将跳出循环,继续执行循环语句的下一语句。 continue语句控制跳过循环体中的某些语句。当在循环体 语句控制跳过循环体中的某些语句。 语句控制跳过循环体中的某些语句 内执行到该语句时,程序将跳过循环体中所有剩下的语句, 内执行到该语句时,程序将跳过循环体中所有剩下的语句,继 续下一次循环。 续下一次循环。

(2) 程序的暂停 pause(n) % n: 延迟秒数 pause %暂停程序,直到用户按任一键后继续执行 暂停程序, 暂停程序 若要强行中止程序的运行可使用Ctrl+C命令。 命令。 若要强行中止程序的运行可使用 命令

程序调试
一般来说,应用程序的错误有两类: 一般来说,应用程序的错误有两类: 语法错误, 一类是语法错误 语法错误包括词法或文法的错误, 一类是语法错误,语法错误包括词法或文法的错误, 例如函数名的拼写错、表达式书写错等。 例如函数名的拼写错、表达式书写错等。 另一类是运行时的错误 指程序的运行结果有错误, 运行时的错误。 另一类是运行时的错误。指程序的运行结果有错误, 这类错误也称为程序逻辑错误。 这类错误也称为程序逻辑错误。

在包含函数调用的MATLAB 程序运行时,当发生运行错 程序运行时, 在包含函数调用的 误时,不会显示出错信息, 在执行结束或出错时, 误时,不会显示出错信息,而在执行结束或出错时,我们 只能看到基本工作空间(即主程序执行空间 中的变量, 即主程序执行空间)中的变量 只能看到基本工作空间 即主程序执行空间 中的变量,各 个函数工作空间已关闭,因此无法检测各个局部变量。 个函数工作空间已关闭,因此无法检测各个局部变量。 调试技术来查找问题 为此,应采用调试技术来查找问题。 为此,应采用调试技术来查找问题。

为查找运行错误,可采用下列技术: 为查找运行错误,可采用下列技术:
在可能发生错误的M 文件中,删去某些语句行末的分号, ◆ 在可能发生错误的 文件中,删去某些语句行末的分号, 显示其运行中间结果,从中可发现一些问题; 使显示其运行中间结果,从中可发现一些问题; 命令, 文件的适当位置上加上keyboard 命令,使在执行时 ◆ 在M 文件的适当位置上加上 在此暂停,从而检查局部工作空间中变量的内容, 在此暂停,从而检查局部工作空间中变量的内容,从中找 到出错的线索,利用return 命令可恢复程序的执行; 命令可恢复程序的执行; 到出错的线索,利用 注释掉M 函数文件的函数定义行, ◆ 注释掉 函数文件的函数定义行,使函数文件转变成命令 文件,这样在程序运行出错时,可查看M 文件,这样在程序运行出错时,可查看 文件产生的中间 变量;注意,局部变量之间应避免冲突; 变量;注意,局部变量之间应避免冲突; 使用MATLAB 提供的 提供的Debugger,Debugger 为我们提供 ◆ 使用 , 了下列功能: 了下列功能: 设置/清除断点; ? 设置/清除断点; ? 单步执行; 单步执行; 继续执行; ? 继续执行;

MATLAB 的调试技术大体要经过以下步骤: 的调试技术大体要经过以下步骤:
第一步: 第一步 分段设置断点 一开始并不能肯定问题所在, 一开始并不能肯定问题所在,我们总是按照执行 顺序分段执行,以期望能够找到出错的程序段。 顺序分段执行,以期望能够找到出错的程序段。为 此在程序中设置断点,并执行程序: 此在程序中设置断点,并执行程序: 第二步: 第二步:清除断点 第三步: 第三步:调试嵌套函数 第四步: 第四步:单步执行 第五步: 第五步:修改并重新执行 找到了问题所在,修改源程序并重新执行, 找到了问题所在,修改源程序并重新执行,如仍有 问题,继续上述过程进行调试,直到程序执行正确。 问题,继续上述过程进行调试,直到程序执行正确。

设置/取消 设置 取消 断点

进入函数 取消所 有断点 跳出函数

单步运行

继续运 行

退出调试

调试命令
除了采用调试器调试程序外,MATLAB还提供了一 除了采用调试器调试程序外, 还提供了一 些命令用于程序调试。 些命令用于程序调试。命令的功能和调试器菜单命 令类似
? ? ? ? ? ? ? ? ? ? ? dbstop - Set breakpoint. dbclear - Remove breakpoint. dbcont - Resume execution. dbdown - Change local workspace context. dbmex - Enable MEX-file debugging. dbstack - List who called whom. dbstatus - List all breakpoints. dbstep - Execute one or more lines. dbtype - List M-file with line numbers. dbup - Change local workspace context. dbquit - Quit debug mode.

力学题1:设目标相对于射点的高度为 给定初速, 力学题 :设目标相对于射点的高度为yf,给定初速,试计 算物体在真空中飞行的时间和距离
clear; y0 = 0; x0 = 0; % 初始位置 vMag = input('输入初始速度 (m/s): '); % 输入初始速度 输入初始速度 要求: 要求: vDir = input(' 输入初速方向 度):'); 输入初速方向(度 1、从键盘输入初始位置,发射速度,角度,目标高度 、从键盘输入初始位置,发射速度,角度, % 输入目标高度 yf = input('输入目标高度 米):'); 输入目标高度(米 输入目标高度 2、编写计算飞行时间和距离的函数方向的初始速度 、编写计算飞行时间和距离的函数M文件 文件 vx0 = vMag*cos(vDir* (pi/180)); % 计算x,y方向的初始速度 计算 vy0 = vMag*sin(vDir* (pi/180)); % 3、判断是否能射中目标 、 wy = -9.81; wx = 0; % 重力加速度 (m/s^2) 4、如果不行,重新输入速度,并给出提示, 、如果不行,重新输入速度, tf=roots([wy/2,vy0,y0-yf]); % 解方程 并给出提示,如加快速度 解方程wy*t^2/2+vy0*t+y0=yh,计算落点 , tf 5、如果可以射中,显示飞行时间和距离,然后提示按任 、如果可以射中,显示飞行时间和距离, tf=max(tf); % 去除落点时间 中的庸解 去除落点时间tf中的庸解 意键显示飞行轨迹图, 意键显示飞行轨迹图,再提示按任意键显示飞行动态图 t=[0:0.1:tf,tf]; % 设定时间数组,因tf不大可能被 整除,必须加一个tf 设定时间数组, 不大可能被0.1整除,必须加一个 不大可能被 整除 点 y = y0 + vy0*t + wy*t.^2/2; % 计算轨迹 x = x0 + vx0*t + wx*t.^2/2; % 计算射程,画出轨迹 计算射程, xf = max(x),plot(x,y),grid

符号计算
MathWorks公司以 公司以Maple的内核作为符号计算引擎,依 的内核作为符号计算引擎, 公司以 的内核作为符号计算引擎 赖Maple已有的函数库,开发了实现符号计算的两个工 已有的函数库, 已有的函数库 具箱:基本符号工具箱和扩展符号工具箱。 具箱:基本符号工具箱和扩展符号工具箱。

符号运算重点用于解决自然科学理论中,各种公 符号运算重点用于解决自然科学理论中, 式、表达式以及相应的推导问题
与数值运算的区别: 与数值运算的区别 数值运算中必须先对变量赋值,然后才能参与运算。 ※ 数值运算中必须先对变量赋值,然后才能参与运算。 符号运算无须事先对独立变量赋值, ※ 符号运算无须事先对独立变量赋值,运算结果以标 准的符号形式表达。 准的符号形式表达。

符号变量要先定义,后引用: 符号变量要先定义,后引用:sym,syms ,
syms x y z % x,y,z为符号变量 为符号变量
例:>>syms x y >>f=sin(x)+exp(y)

s=sym('a')

% a可以是数字,表达式等 可以是数字, 可以是数字
A= [ a, 2*b] 0] [3*a,

例:>> A = sym('[a , 2*b ; 3*a , 0]')

注意:符号矩阵的每一行的两端都有方括号, 注意:符号矩阵的每一行的两端都有方括号,这 数值矩阵的一个重要区别。 是与 matlab数值矩阵的一个重要区别。 数值矩阵的一个重要区别

指令修改: 指令修改 R=subs(S, old, new)

A1=subs(A,'b',10)

任意精度的数学运算
中有三种不同的算术运算: 在symbolic中有三种不同的算术运算: 中有三种不同的算术运算 数值类型 有理数类型 vpa类型 类型
Example: r=8

matlab的浮点算术运算 的浮点算术运算 maple的精确符号运算 的精确符号运算 maple的任意精度算术运算 的任意精度算术运算

任意精度算术运算 digits(n) % 设置可变精度 缺省 位 设置可变精度,缺省 缺省16位 k=sym(8) % 定义符号变量 vpa(x,n) % 显示可变精度计算

% 定义数值变量
digits(25) s3=vpa(s1) % 在digits指定精度下, 指定精度下, 指定精度下 给出结果 s3 = . 2.828427124746190097603378

>> s1=sqrt(k) s1 = 2*2^(1/2) >>s2= sqrt(r) s2 = 2.8284

符号与数值之间的转换
数值型符 号结果 vpa digits(n) vpa 符号常数 double 数值 sym double 符号量(表达式 符号量 表达式) 表达式 char sym

str2num str2double sscanf 字符串 表达式) 字符串(表达式 表达式 int2str num2str mat2str spintf double char

>> A=[1/3,2.5;1/0.7,2/5] s3 = A= . 2.828427124746190097603378 码 0.3333 2.5000 ASCII码 >>s4=double(s3) 1.4286 0.4000 >>s5=sym(s4) >> double(B) >> B=sym(A) s5 = ans= B= sqrt(8) 0.3333 2.5000 [ 1/3, 5/2] 1.4286 0.4000 [10/7, 2/5]

符号矩阵运算
关于矩阵代数运算、 关于矩阵代数运算、数值运算和符号运算几乎相同 1、符号矩阵的四则运算 、 符号矩阵的四则运算与幂运算可直接用: 符号矩阵的四则运算与幂运算可直接用: +、-、 、.*、/、./、\、.\、^、.^ 、-、*、 、 、 、 、 、 、 、-、 2、符号矩阵的其他运算 、
>> B=sym('[a,b;c,d]'); %求转置共轭 求转置共轭 (1) 转置运算:transpose(A) >> B' 转置运算: ans= (2) 行列式运算:det 行列式运算: [ conj(a), conj(c)] [ conj(b), conj(d)] (3) 求逆:inv(A) 或 A^(-1) 求逆: >> transpose(B) %求转置 求转置 ans= (4) 求秩:rank(A) 求秩: [ a, c] (5) 求特征值:[V,D]=eig(A) 求特征值: [ b, d]

符号微积分运算: 符号微积分运算: 极限问题的解析解
1、单变量函数的极限 、

L = lim f (x)
x→a

L= limit( f, x, a) L=limit(f, x, a, 'left') L=limit(f, x, a, 'right')

L = lim? f (x)
x→a

L = lim+ f (x)
x→a

2、多变量函数的极限 、

L = lim f (x, y)
x→x0 y→y0

L1=limit(limit(f, x, x0), y, y0) 或 L1=limit(limit(f ,y, y0), x, x0)

如果x0 或y0不是确定的值,而是另一个变量的函数, 如果 不是确定的值,而是另一个变量的函数, 如x->g(y),则上述的极限求取顺序不能交换。 ,则上述的极限求取顺序不能交换。

b ? a? f1 = lim x?1+ ? sin x→∞ x ? x?

x

>> limit( f1, x, inf ) ans= exp(a)*b

e ?1 f2 = lim+ x→0 1? cos x ? sin x
x3

>> limit(f2, x, 0, 'right' ) ans= 12
x+a2 y2

f3 = lim e
1 x→ / y y→∞

?

1 x +y
2 2

sin 2 x ? 1 ? ?1+ 2 ? 2 ? x ? y ? ?

>> limit(limit(f3, x, 1/sqrt(y)), y, inf) ans= exp(a^2)

符号表达式中变量的确定
若用户没有指定变量参数,则使用 函数默认的 若用户没有指定变量参数,则使用findsym函数默认的 函数 变量作为函数的变量参数。事实上,MATLAB按离字符 ' 按离字符' 变量作为函数的变量参数。事实上,MATLAB按离字符'x' 最近原则确定缺省变量。 最近原则确定缺省变量。 findsym可以帮助用户查找一个符号表达式中的的符号 可以帮助用户查找一个符号表达式中的的符号 变量。 变量。 findsym(f,n) 说明: 为用户定义的符号函数 为用户定义的符号函数, 说明:f为用户定义的符号函数, n为正整数,表示查询变量的个数。 为正整数, 为正整数 表示查询变量的个数。 n=i,表示查询 个系统默认变量。 表示查询i个系统默认变量 表示查询 个系统默认变量。 若没有指定n,则返回S中的全部符号变量 中的全部符号变量。 若没有指定 ,则返回 中的全部符号变量。 可用findsym(f,1)查找系统的缺省变量 查找系统的缺省变量 可用

函数的导数和高阶导数
dn f (x) n dx
diff(f,x,n) % (默认为 阶) 默认为1阶 默认为

多元函数的偏导: 多元函数的偏导:

?n?m f (x, y) n m ?x ?y
sin x f4 = 2 x + 4x + 3

diff(diff(f,x,n),y,m) 或 diff(diff(f,y,m),x,n)

f5 = (x ? 2x)e
2

? x2 ?xy

符号表达式的操作
simplify(EXPR) factor(EXPR) expand(EXPR) collect(EXPR) collect(EXPR,V) % 应用函数规则进行化简 % 对S分解因式 分解因式 % 对S进行展开 进行展开 % 对S合并同类项 合并同类项 % 对S按变量 合并同类项 按变量v合并同类项 按变量

horner(EXPR) % 用嵌套形式表示,即用多层括号的形式表示。 用嵌套形式表示,即用多层括号的形式表示。

simple(EXPR)

% 调用 调用MATLAB的其他函数对表达式 的其他函数对表达式 进行综合化简,并显示化简过程。 进行综合化简,并显示化简过程。 综合化简

Example s=(x^2+y^2)^2+(x^2-y^2)^2

隐函数的偏导数
已知隐函数

f (x1, x2 ,..., xn ) = 0



? f (x1, x2 ,..., xn ) ?x j ?xi =? ? ?x j f (x1, x2 ,..., xn ) ?xi

格式: 格式:F=-diff(f,xj)/diff(f,xi)

已知

f5 = (x ? 2x)e
2

? x2 ?xy

?y 求 ?x

积 分
不定积分: 不定积分:

∫ f (x)dx
定积分: 定积分

int(f,x)

无穷积分: 无穷积分
int(f,x,a,b)



b

a

f (x)dx


2

+∞

?∞

f (x)dx int(f,x,-inf,inf)

多重积分: 多重积分: int(int(f,x),x)
已知 f6 = ?4ze 求
? x2 y ? z 2

[(1?10x y + 4x y ) cos(x y) + (4x y ?1)sin( x y)]
4 2 2 4 2 2

f6dx2dydz ∫∫∫

符号级数运算
1、 级数的符号求和 symsum(s,v,a,b) 、 级数的符号求和:
符号表达式S中的变量 从a到b的有限和 符号表达式 中的变量v从 到 的有限和 中的变量
1 ∑ n2 n=1


>> n=sym('n'); >> s1=symsum(1/n^2,n,1,inf) s1 = 1/6*pi^2

2、函数的泰勒级数: taylor(f,v,n,a) 、函数的泰勒级数
将函数f在自变量 将函数 在自变量v=a处展开为泰勒级数,展开到第n项(即变 处展开为泰勒级数,展开到第 项 即变 在自变量 处展开为泰勒级数 次幂)为止 的缺省值为6, 的缺省值是 的缺省值是0。 量v的n-1次幂 为止,n的缺省值为 ,a的缺省值是 。 的 次幂 为止, 的缺省值为 >> x=sym('x'); >> f2=sqrt(1-2*x+x^3)-(1-3*x+x^2)^(1/3); >> taylor(f2,6) %求泰勒展开式 求泰勒展开式 ans=1/6*x^2+x^3+119/72*x^4+239/72*x^5

符号方程和符号微分方程的求解
1、符号代数方程的符号求解 solve 、
solve('eqn1','eqn2',…,'eqnN','var1,var2,…,varN') eqni: 符号表达式或不带符号的字符串;var: 自变量 符号表达式或不带符号的字符串;
S=solve(…) %S构架数组,显示结果须用S.v1,…,S.vn 构架数组,显示结果须用 构架数组

[v1,v2,…,vn]=solve(‘eq1’,…‘eqn’,’v1’,’v2’,…,’vn’) , , * 变量顺序一致 ? 在得不到“封闭型” 解析解时,给出数值解 在得不到“封闭型” 解析解时,
?1 1 ? x3 + y3 = 28 ? ? 1 1 ? + =4 ? x y ?

[x y]=solve('1/x^3+1/y^3=28','1/x+1/y=4','x,y')

2. 常微分方程的符号求解 dsolve

输 入 格 式 dsolve('Dy=f(x,y)','x') dsolve('Dy=f(x,y)','y(0)=a','x') dsolve('D2y=f(x,y,Dy)', 'y(0)=a','Dy(0)=b','x')





求一阶微分方程 y' = f (x, y) 的通解 求一阶微分方程 y' = f (x, y), y(0) = a 的特解 求二阶微分方程 y' ' = f (x, y, y' ), y(0) = a, y' (0) = b 的特解

在求解微分方程中,用 Dy 表示 y',D2y表示 在求解微分方程中, 表示

y

''

求以下微分方程: 求以下微分方程: (1) y' = 3xy + xy2 (2) (1? x2 ) y′′ ? xy′ = 0 (3) y′′ ? y = 4xex , y(0) = 0, y' (0) = 1

调 用 Maple
R=maple(MapleStatement) %运行 运行Maple格式的语句 运行 格式的语句 R=maple(fun,arg1,arg2,…) %运行以 运行以arg1等为输入的 运行以 等为输入的 Maple的fun函数 的 函数 [R,S]=maple(…) % maple运行结果由输出宗量返回 运行结果由输出宗量返回 注:R是字符串型而不是符号型 是字符串型而不是符号型 求 f(n)=-3*f(n-1)-2*f(n-2) 的通解 rsolve: 求递推方程 Gs1=maple('rsolve', 'f(n)=-3*f(n-1)-2*f(n-2) ', ' f(k)')

符号分析可视化
函数绘图的简捷指令 ez(easy to) ezplot(F, [a,b]) % 作函数 F 在[a,b]上的图 上的图
>> syms x >> y=x^2+exp(x); >> ezplot(y,[0,10])

x +e
2

x

在[0,10]间的曲线 , 间的曲线

* ezplot不允许指定线型、色彩,不能同时绘制多条曲线 不允许指定线型、 不允许指定线型 色彩,
ezplot3 %画三维曲线 画三维曲线 ezmesh %画网线图 画网线图 ezcontour %画等位线 画等位线 ezsurf %画曲面图 画曲面图 ezpolar %画极坐标曲线 画极坐标曲线 ezmeshc %画带等位线的网线图 画带等位线的网线图 ezcontourf %画填色等位线 画填色等位线 ezsurfc %画带等位线的曲面图 画带等位线的曲面图

数值计算
1、积分的数值求解 、
基本原理: 基本原理 求解定积分的数值方法多种多样,如简单的梯形 求解定积分的数值方法多种多样,如简单的梯形 欧拉法、 法、欧拉法、辛普生(Simpson)法、牛顿-柯特斯 法 牛顿- (Newton-Cotes)法等 法等 基本思想都是将整个积分区间[a,b]分成 个子区间 分成n个子区间 基本思想都是将整个积分区间 分成 [xi,xi+1],i=1,2,…,n,其中 1=a,xn+1=b。这样求 , ,其中x , 。 定积分问题就分解为求和问题。 定积分问题就分解为求和问题。

单变量数值积分: 单变量数值积分:
变步长辛普生法) 变步长辛普生法 y=quad(Fun,a,b, ε) (变步长辛普生法 y=quadl(Fun,a,b, ε) (Lobbato算法 函数算法更精, 算法)%函数算法更精 算法 函数算法更精, 限定精度的定积分求解, 精度更高%限定精度的定积分求解 默认精度为10 精度更高 限定精度的定积分求解,默认精度为 -6。

1、被积函数的描述 、
第一种:一般函数方法(M函数 函数) 第一种:一般函数方法 函数

erf (x) =

2

∫e π
0

x

?t 2

dt

第二种: 第二种:inline 函数

第三种:匿名函数 第三种:匿名函数(MATLAB 7.0)

二重定积分的数值求解

I=∫

y1 x1

y0 x0



f (x, y)dxdy

dblquad(f,x0,x1,y0,y1,ε) ε
求f(x,y)在[x0,x1]×[y0,y1]区域上的二重定积分 在 × 区域上的二重定积分

J = ∫ ∫e
?1?2

1 2

x2 ? 2

sin (x + y)dxdy
2

(1) 定义被积函数 f=@(x,y)exp(-x.^2/2).*sin(x.^2+y); (2) 调用 调用dblquad函数求解 J=dblquad(f,-2,2,-1,1) 函数求解

三重定积分的数值求解

I=∫

z1 y1 x1

z0 y0 x0

∫∫

f (x, y)dxdydz

triplequad(Fun,x0,x1,y0,y1,z0,z1,ε,@quadl) ε

J = ∫∫∫ 4xze
0 0 0

2π π

? x2 y ? z 2

dxdydz

(1) 定义被积函数 f=@(x,y,z)4*x.*z.*exp(-x.^2.*y-z.^2); (2) 调用 调用triplequad函数求解 函数求解 J=triplequad(f,0,pi,0,pi,0,2,1e-7,@quadl)

2、常微分方程的数值求解 、
格式1: 格式 : 直接求解 [t,x]=ode45(Fun, [t0,tf], x0) 格式2: 格式 : 带有控制参数 [t,x]=ode45(Fun, [t0,tf], x0,options) , 格式3: 格式 : 带有附加参数 [t,x]=ode45(Fun, [t0,tf], x0, options, p1, p2,…) [t0,tf]求解区间, x0初值问题的初始状态变量。 求解区间, 初值问题的初始状态变量。 求解区间
options唯一结构体变量,odeset( )获得初始设置。 唯一结构体变量, 获得初始设置。 唯一结构体变量 获得初始设置 options=odeset(‘RelTol’,1e-7); options= odeset; options. RelTol= 1e-7;

描述需要求解的微分方程组: 描述需要求解的微分方程组: 不需附加变量的格式 function xd=funname(t,x) 可以使用附加变量 function xd=funname(t,x,flag,p1,p2,…) 是时间变量或自变量(必须给 % t是时间变量或自变量 必须给 是时间变量或自变量 必须给), x为状态向量, 为状态向量, 为状态向量 xd为返回状态向量的导数 为返回状态向量的导数, 为返回状态向量的导数 flag用来控制求解过程,指定初值,即使初值不用 用来控制求解过程,指定初值, 用来控制求解过程 指定,也必须有该变量占位。 指定,也必须有该变量占位。 f1=@(t,x,p1,p1,...)[...;...]; f2=inline(['[…;…;…]'],'t','x', 'flag', 'p1', 'p2',…);

& ?x(t) = ?βx(t) + y(t)z(t) 例:求 ?y(t) = ρ(z(t) ? y(t)) ?& ?z(t) = ?x(t) y(t) +σy(t) ? z(t) ?&

x(0) = y(0) = 0, z(0) = 10?10 初值: 初值:
8 ( 参数: ) 参数: 1 β = 3,ρ =10,σ = 28 ( )β = 2,ρ = 5,σ = 20 2

自变函数 function xdot = lorenzeq(t,x,flag,beta,rho,sigma) % flag变量是不能省略的 变量是不能省略的 xdot=[-beta*x+y*z; rho*(z-y);-x*y+sigma*y-z]; f=@(t,x,beta,rho,sigma)[-beta*x(1)+x(2)*x(3); rho*x(2)+rho*x(3);-x(1)*x(2)+sigma*x(2)-x(3)];

>> t_final=100; %设定终止时间 设定终止时间 >> x0=[0;0;1e-10]; %初始值 初始值 >> b1=8/3; r1=10; s1=28; %第一组参数 第一组参数 >> b2=2; r2=5; s2=20; %第二组参数 第二组参数 >> [t1,x1]=ode45(f,[0,t_final],x0,[],b1,r1,s1); >> [t2,x2]=ode45(f,[0,t_final],x0,[],b2,r2,s2); 位置为[ %options位置为 ],表示不需修改控制选项 位置为 ,
50 40 30 20 30 z 20 x 10 10 0 -10 -20 -30 20 10 0 -10 -10 0 10 20 30 40 50 t 60 70 80 90 100 y -20 -20 0 x 40 20 60

0

高阶常微分方程处理方法

y

(n)

& = f (t, y, y,..., y
(n?1)

(n?1)

)

& 初始值: 初始值: y(0), y(0),..., y

(0)

转化为一阶常微分方程组: 转化为一阶常微分方程组:

& x1 = y, x2 = y,..., xn = y(n?1)
& ?x1 = x2 ?x = x ? &2 3 ? ?M ?xn = f (t, x1, x2 ,L, xn ) ?&
& x1(0) = y(0), x2 (0) = y(0),..., xn (0) = y(n?1) (0)

d2θ 例、单摆方程 + ω2 sin( θ ) = 0 dt 2

& 初始条件: 初始条件:θ (0) = 0,θ (0) = 0.2

& 转化为一阶常微分方程组: 转化为一阶常微分方程组: x1 = θ , x2 = θ

& ?x1 = x2 ? x2 = ?ω2 sin( x1) ?&

>> f=@(t,x,omega)[x(2);-omega^2*sin(x(1))] >> t_final=50; >> theta0=[0;0.2]; omega=2/3; >> [t,theta]=ode45(f,[0,t_final],theta0,[],omega);

? 学好计算机的唯一途径是

? 你的编程能力与你在计算机上投入的 时间成
30字学习准则 高等应用数学问题的 字学习准则(高等应用数学问题的 求解) 字学习准则 高等应用数学问题的matlab求解 求解

带着问题学,活学活用,学用结合, 带着问题学,活学活用,学用结合, 急用先学,立竿见影, 急用先学,立竿见影, 在用字上狠下功夫


相关文章:
M文件和面向对象编程
8 M 文件和面向对象编程假如读者想灵活运用 MATLAB 去解决实际问题,想充分调动 MATLAB——科学技术 资源,想理解 MATLAB 版本升级所依仗的基础,那么本章内容将十分有...
07M文件和面向对象编程
第七章 M 文件和面向对象编程 假如读者想灵活运用 MATLAB 去解决实际问题,想充分调动 MATLAB——科学技术 资源,想理解 MATLAB 版本升级所依仗的基础,那么本章内容...
第六部分 M文件和面向对象编程
第六部分 M文件和面向对象编程第六部分 M文件和面向对象编程隐藏>> 第六部分 M 文件和面向对象编程假如读者想灵活运用 MATLAB 去解决实际问题, 想充分调动 MATLAB...
实验六 M文件和面向对象编程
M文件和面向对象编程M文件和面向对象编程隐藏>> 实验六 M 文件和面向对象编程假如读者想灵活运用 MATLAB 去解决实际问题,想充分调动 MATLAB——科学技术 资源,想理...
【Matlab 简易教程】第八章 M文件和面向对象编程
【Matlab 简易教程】第八章 M文件和面向对象编程_工学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 【Matlab 简易教程】第八章 M文件和面向对象编程...
面向对象程序设计
面向对象程序设计_计算机软件及应用_IT/计算机_专业...int m,n; //矩阵的行数和列数 Datatype *p; /...(0)必须要加的头文件 #include<stdio.h> #...
《面向对象程序设计》答案
面向对象程序设计》答案_工学_高等教育_教育专区。熟悉VC++IDE开发环境 实验...(m),day(d) {year=2005;} Date∷Date(int m):month(m) { day=1; ...
面向对象程序设计
面向对象程序设计_教学案例/设计_教学研究_教育专区...文件对话框的使用,文件操作的基本方法,数据读写的...(parent instanceof String) m = new JMenu((...
c++面向对象程序设计试题和答案(经典题目)
下列特性中不是面向对象程序设计语言所特有的是( D...文件夹下的工程 proj1,此工程包含一个源程序文件 ...(6,7); m1.print(); m2.print(); m3....
面向对象程序设计文本编辑器
面向对象程序设计文本编辑器_计算机软件及应用_IT/计算机_专业资料。实训报告 题目...(m_edit,strlen(m_edit)); out.close(); AfxMessageBox("文件保存 OK ",...
更多相关标签:
js面向对象编程 | 面向对象编程 | 面向对象的编程语言 | java面向对象编程题 | java面向对象编程 | js面向对象编程实例 | 面向对象的编程 | 面向对象编程思想 |