终端调用
在Mac OS X下用Terminal使用MATLAB
开个终端,vim ~/.profile 添加两行
export PATH=$PATH:/Applications/MATLAB_R2012b.app/bin/
alias matlab='matlab -nodesktop'
之后在终端输入source ~/.profile
使用的时候,在Terminal中键入:matlab -nodesktop
---
1.在终端下运行matlab,开个终端,vim ~/.profile 添加两行
export PATH=$PATH:/Applications/MATLAB_R2014b.app/bin/
alias matlab='matlab -nodesktop'
之后在终端输入source ~/.profile就好了,以后要用matlab终端输入matlab回车就好了,之后想要运行.m文件,直接输入文件名回车就可以
其他参数请参考http://www.mathworks.com/help/techdoc/ref/matlabunix.html
2.在Mac OS 终端上运行Matlab,其实非常简单。笔者以Mac OS 10.10.3, Matlab 2014b为例,讲述一下过程。
首先,找到Matlab这个程序,笔者的Matlab程序在:/Applications/ MATLAB_R2014b.app /bin / matlab, 然后在terminal 或者X11 中敲入:
/Applications/MATLAB_R2014b.app/bin/matlab -nodesktop -nosplash
其中nodesktop是指不要显示Matlab的界面,nosplash是指启动时不要显示Matlab的启动界面。
为了方便起见,我们可以编写一个SHELL脚本 matlab
#/bin/bash
/Applications/MATLAB_R2014b.app/bin/matlab -nodesktop -nosplash
为了能够执行,需要增加文件权限:
chomod u+x matlab
再将matalb脚本拷贝至$PATH中的任意目录即可。
下次直接在终端敲入matlab 即可。
REF 1&2 ; 参考(等于reference)
----
所需要的材料:Macbook、Xcode、Matlab2014R、libsvm-3.21、optsPatch10.8.patch、xcode7_mexopts
https://blog.csdn.net/u013515273/article/details/51276184
Mac OS环境下的libsvm在Matlab中安装
https://www.jianshu.com/p/e0275a380803
Mac上Matlab库libsvm安装指南
https://blog.51cto.com/apinetree/1560254
LIBSVM在matlab下的使用安装
https://ww2.mathworks.cn/matlabcentral/answers/246507-why-can-t-mex-find-a-supported-compiler-in-matlab-r2015b-after-i-upgraded-to-xcode-7-0
官网
画图
m.m文件
%幂函数
x = linspace(-4,4,200);
f1 = 10.^x;
f2 = exp(x);
f3 = 2.^x;
plot(x, f1, 'r', x, f2, 'b', x, f3, 'g', 'LineWidth', 2);
axis([-4, 4, -0.5, 8])
text('Interpreter','latex','String','$10^x$', 'Position', [1, 7.5],'fontsize', 16)
text('Interpreter','latex','String','$e^x$', 'Position', [2.2, 7.5],'fontsize', 16)
text('Interpreter','latex','String','$2^x$', 'Position', [3.2, 7.5],'fontsize', 16)
Matlab内部资料
(内部资料)
一、基本概念、命令、语句格式、程序结构
\1. MATLAB是一种用于科学工程计算的高级语言,其基本的数据单位是矩阵,它的命令表达式与数学、工程中常用的习惯表达形式十分相似;
\2. MATLAB高效方便的矩阵和数组运算,使之在数字信号处理、建模、系统识别、自动控制、优化等领域的问题时,显得十分简洁、高交,具有其他高级语言不可比拟的优势;
\3. MATLAB的典型应用包括以下几个方面:数学计算、算法设计、建模与仿真、数据分析与可视化、科学及工程绘图和应用开发;
\4. MATLAB最显著的特点是其基本数据是不需要定义大小的数组;
\5. MATLAB语言是以矩阵和向量为基本数据单位,包括控制流程语句、函数、数据结构、输入输出及面向对象等特点的高级语言;
\6. MATLAB的工作空间指运行MATLAB的所有变量和MATLAB提供的常量构成的空间;
\7. 在命令窗口中键入who和whos命令可以看到目前工作空间里的所有变量,命令clear可以删除工作空间里的变量;
\8. MATLAB用“%”实现注释功能;可以把多条命令放在同一行,只要中间用逗号或分号隔开,逗号告诉MATLAB显示结果;分号说明除了这一条命令外还有下一条命令等待输入,MATLAB这时将不会给出运行的中间结果;
\9. MATLAB的“类”目录名都以@符为引导,其上存放“类构造”函数和“重载”函数;
\10. 用path命令扩展的搜索路径仅在当前MATLAB环境下有效;
\11. MATLAB有两种最常用的创建数组的方式:“冒号表示形式”直接定义数据点之间的增量而不是数据点;linspace直接定义数据点数,而不是数据点之间的增量;
\12. MATLAB数组中以空格或逗号分隔的元素指定的是不同列的元素,而以分号分隔的元素指定了不同行的元素;另:MATLAB的数组存储,也表现在绝对索引上,是按从上到下、从左到右的顺序进行的。
\13. 点乘符号.*对数组c和d施加元素对元素的乘法运算,不带点的乘号表示矩阵乘法;
\14. 数组除法同时使用了正斜杠和反斜杠两种定义:两种情况下,斜杠下的数组都被斜杠上的数组所除;
\15. B.\A表示对应元素相除;
\16. reshape函数用于在总元素不变的前提下,改变数组的“行数”、“列数”;
\17. 为了生成比较复杂的数组,MATLAB提供了诸如反转、插入、提取、收缩、重组等对数组和矩阵的操作方式;
\18. 函数find用于返回数组或矩阵中满足某关系表达式的那些元素的位置或下标;
\19. 可用命令class和ischar来查看变量是否为字符数组;
\20. 采用输入数值矩阵的方法输入字符矩阵时,应保证矩阵的每行字符串的长度相同;
\21. 函数cellstr可把字符矩阵转换成元胞数组;
\22. 函数mat2str把数值数组组转换为字符串,用eval函数又可把这种字符串转换成数值数组;
\23. 元胞数组的每一个元素可为类型不同、维数不同的矩阵、向量、标量或多维数组,所有元素用大括号括起来;
\24. 中括号对“[ ]”用来形成矩阵,大括号对“{ }”是元胞数组的标志。两者不同之处在于,大括号可以嵌套,而中括号不可;
\25. 函数celldisp用来显示元胞数组的每个元素的值,函数cellplot将画出元胞数组的每个元素的结构图;
\26. 当给已经定义的元胞数组下标范围外的元素赋值时,MATLAB自动扩维,对于没有赋值的元素,赋值为空矩阵;
\27. 在赋值语句中,每次只能给元胞数组的一个元素赋值,采用形如“a{1,:}=…”的赋值语句是不合法的;
\28. 结合使用冒号运算和大括号可以方便地引用元胞数组中的多个元素,并把引用的元素分为不同的变量;
\29. 数据不能直存放于结构体,而只能存放在域中。结构体的域可以存放任何类型、任何大小的数组;
\30. 在矩阵下标的表达式里使用冒号表示矩阵的一部分,如A(:,j)表示矩阵A的第j列的所有元素。由于有了冒号运算符,在MATLAB里编程变得特别简便、快捷;
\31. 在MATLAB里,可通过把矩阵的列或行赋值为空矩阵来删除某行或某列;
\32. A(1:2:5)表示删除下标为1、3、5的三个元素;
\33. 在MATLAB里,当行向量乘以列向量时为标量积(内积),当列向量乘以行向量时为向量积(外积);
\34. 函数cond(A)计算矩阵的条件数;
\35. [V,D]=eig(A)求特征值与特征向量;
\36. det(A)计算行列式;
\37. Inv(A)求矩阵的逆;
\38. poly(A)求特征多项式;
\39. 函数polyfit从最小二乘的意义上,拟合出所给数据的多项式系数;
\40. x(any(isnan(x)’),:) =[ ]作用是删除所有包含NaN的行;
\41. any(x)的功能是:如果在一个向量x中,任何元素是非零,返回1;
\42. all(x)的功能是:如果在一个向量x中,所有元素非零,返回1;
\43. 函数工作空间变量nargin包含输入参量个数,函数工作空间变量nargout包含输出参量个数;
\44. 局部(local)变量是存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身;
\45. 全局(global)变量是在不同的工作空间以及基本工作空间中可以被共享的变量;
\46. 私有函数只能被private目录的直接父目录上的M函数文件所调用;
\47. 数值数组的预定维一般采用zeros函数,元胞数组预定维采用cell函数,结构型数组用struct函数预定维;
\48. clear命令从内存中删除变量;
\49. pack命令把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量;
\50. 在MATLAB里,对象是用结构体数组来存储的;
\51. 函数figure 可建立新的图形窗口,并把新建的窗口指定为当前窗口用于输出图形;
\52. 命令subplot可以把多个图形绘在一个图形窗口中;
\53. 命令what列出当前目录或文件夹下的所有M文件和MAT文件;
\54. help、lookfor等命令都不能提供关于私有函数的任何帮助信息;
\55. MATLAB还提供了两种演算函数来提高计算的灵活性:一种是串演算函数eval,另一种是函数句柄演算函数feval;
\56. 编程时,把循环向量化,不但能缩短程序的长度,更能提高程序的执行效率;
\57. 在MATLAB里运行C语言的可执行文件,应在文件名前加上感叹号“!”;
\58. 函数meshgrid(x,y)对y中行的每一行复制x,同样也对x中列的每一列复制y;
\59. MATLAB提供了一个称为fplot的巧妙的绘图函数,该函数细致地计算要绘图的函数,并且确保在输出的图形中表示出所有的奇异点;
\60. 在图形窗口里,legend、zoom、ginput都响应鼠标的单击。
二、MATLAB矩阵运算基础
创建行矢量:在一对方括号中输入元素,并用空格或是逗号分隔开。创建列矢量:使用分号分割开。
转置运算符(’),若数组中包含复数元素,那么产生复共轭转置。可以使用点转置运输符(.’),所有元素是实数,它们的运算结果相同。
数组索引:行号总是列在前面。V(:,2:4)表示矩阵中第二列,到第五列的所有元素。通过让矩阵的某些行或列赋值空数组,就可以删除相应的行或列。A([1 4], :)=[];删除矩阵A的第1行和第4行。
多维数组前二维是行和列,较高维称为页。创建三维数组的一个方法是使用cat命令。C=cat(3,A,B),可以任务C由两层数组构成,第一层是A,第二层是B。
1 在MATLAB中如何建立矩阵 ,并将其赋予变量a?
>> a=[5 7 3;4 9 1]
2 有几种建立矩阵的方法?各有什么优点?
可以用四种方法建立矩阵:
①直接输入法,如a=[2 5 7 3],优点是输入方法方便简捷;
②通过M文件建立矩阵,该方法适用于建立尺寸较大的矩阵,并且易于修改;
③由函数建立,如y=sin(x),可以由MATLAB的内部函数建立一些特殊矩阵;
④通过数据文件建立,该方法可以调用由其他软件产生数据。
3 在进行算术运算时,数组运算和矩阵运算各有什么要求?
进行数组运算的两个数组必须有相同的尺寸。进行矩阵运算的两个矩阵必须满足矩阵运算规则,如矩阵a与b相乘(a*b)时必须满足a的列数等于b的行数。
4 数组运算和矩阵运算的运算符有什么区别?
在加、减运算时数组运算与矩阵运算的运算符相同,乘、除和乘方运算时,在矩阵运算的运算符前加一个点即为数组运算,如ab为矩阵乘,a.b为数组乘。
5 计算矩阵 与 之和。
>> a=[5 3 5;3 7 4;7 9 8];
>> b=[2 4 2;6 7 9;8 3 6];
>> a+b
ans =
7 7 7
9 14 13
15 12 14
6 求 的共轭转置。
>> x=[4+8i 3+5i 2-7i 1+4i 7-5i;3+2i 7-6i 9+4i 3-9i 4+4i];
>> x’
ans =
4.0000 - 8.0000i 3.0000 - 2.0000i
3.0000 - 5.0000i 7.0000 + 6.0000i
2.0000 + 7.0000i 9.0000 - 4.0000i
1.0000 - 4.0000i 3.0000 + 9.0000i
7.0000 + 5.0000i 4.0000 - 4.0000i
7 计算 与 的数组乘积。
>> a=[6 9 3;2 7 5];
>> b=[2 4 1;4 6 8];
>> a.*b
ans =
12 36 3
8 42 40
8 “左除”与“右除”有什么区别?
在通常情况下,左除x=a\b是ax=b的解,右除x=b/a是xa=b的解,一般情况下,a\bb/a。
9 对于 ,如果 , ,求解X。
>> A=[4 9 2;7 6 4;3 5 7];
>> B=[37 26 28]’;
>> X=A\B
X =
-0.5118
4.0427
1.3318
10 已知: ,分别计算a的数组平方和矩阵平方,并观察其结果。
>> a=[1 2 3;4 5 6;7 8 9];
>> a.^2
ans =
1 4 9
16 25 36
49 64 81
>> a^2
ans =
30 36 42
66 81 96
102 126 150
11 , ,观察a与b之间的六种关系运算的结果。
>> a=[1 2 3;4 5 6];
>> b=[8 –7 4;3 6 2];
>> a>b
ans =
0 1 0
1 0 1
>> a>=b
ans =
0 1 0
1 0 1
>> a<b
ans =
1 0 1
0 1 0
>> a<=b
ans =
1 0 1
0 1 0
>> a==b
ans =
0 0 0
0 0 0
>> a~=b
ans =
1 1 1
1 1 1
12 ,在进行逻辑运算时,a相当于什么样的逻辑量。
相当于a=[1 1 0 1 1]。
13 在sin(x)运算中,x是角度还是弧度?
在sin(x)运算中,x是弧度,MATLAB规定所有的三角函数运算都是按弧度进行运算。
14 角度 ,求x的正弦、余弦、正切和余切。
>> x=[30 45 60];
>> x1=x/180*pi;
>> sin(x1)
ans =
0.5000 0.7071 0.8660
>> cos(x1)
ans =
0.8660 0.7071 0.5000
>> tan(x1)
ans =
0.5774 1.0000 1.7321
>> cot(x1)
ans =
1.7321 1.0000 0.5774
15 用四舍五入的方法将数组[2.4568 6.3982 3.9375 8.5042]取整。
>> b=[2.4568 6.3982 3.9375 8.5042];
>> round(b)
ans =
2 6 4 9
16 将矩阵 、 和 组合成两个新矩阵:
(1)组合成一个43的矩阵,第一列为按列顺序排列的a矩阵元素,第二列为按列顺序排列的b矩阵元素,第三列为按列顺序排列的c矩阵元素,即 ;
(2)按照a、b、c的列顺序组合成一个行矢量,即
>> a=[4 2;5 7];
>> b=[7 1;8 3];
>> c=[5 9;6 2];
% (1)
>> d=[a(:) b(:) c(:)]
d =
4 7 5
5 8 6
2 1 9
7 3 2
% (2)
>> e=[a(:);b(:);c(:)]’
e =
4 5 2 7 7 8 1 3 5 6 9 2
或利用(1)中产生的d
>> e=reshape(d,1,12)
ans =
4 5 2 7 7 8 1 3 5 6 9 2
三、重要函数/命令/变量
clc 清空命令窗口
clear 从工作空间(计算机内存)中删除变量
close all 关闭(删除)全部图形窗口
load 从磁盘中调入数据变量
save 把内存变量存入磁盘
function 函数文件头
global 定义全局变量
input 提示键盘输入
format 格式化显示命令窗口输出信息
cumsum 阵列累计和
diag 方阵的对角线;创建对角阵
dot 两向量的点积
end 阵列最后项的指针
find 满足逻辑表达式的阵列索引和阵列值
length 向量长度
size 阵列的阶次或长度
min 确定阵列中的最小值
max 确定阵列中的最大值
rank 确定矩阵线性无关的行或列值
eig 矩阵特征方程的特征值和特征向量
det 方阵行列式
inv 方阵的逆
poly 特征多项式
plot 应用线型坐标绘制平面曲线
mesh 绘三维网线图
sum 计算阵列元素的和值
mean 计算阵列元素的均值
var 计算阵列元素的方差
std 计算阵列元素的标准差
corrcoef 相关系数矩阵
sym 定义基本符号对象
syms 定义基本符号对象
! 执行外部应用程序
基本矩阵(Elementary matrices)
eye 单位矩阵
ones 所有元素全为1的矩阵
zeros 所有元素全为0的矩阵
rand 均匀分布随机阵
randn 正态分布随机阵
compan 伴随矩阵
magic 创建任意行和列的和值相等的方阵
meshgrid 用于三维曲面的分格线坐标
linspace 线性等分向量
logspace 对数等分向量
repmat 铺放模块数组
信息显示(Message display)
disp 显示矩阵和文字内容
display 显示矩阵和文字内容的重载函数
error 显示错误信息
fprintf 把格式化数据写到文件或屏幕
sprintf 按格式把数字转换为串
控制语句(Control flow)
break 终止最内循环
case 同switch一起使用
catch 同try一起使用
continue 将控制转交给外层的for或while循环
else 同if一起使用
elseif 同if一起使用
end 结束for,while,if语句
for 按规定次数重复执行语句
if 条件执行语句
otherwise 可同switch一起使用
return 返回
switch 多个条件分支
try try-cathch结构
while 不确定次数重复执行语句
特殊变量
ans 用于结果的缺省变量名
pi 圆周率
eps 计算机的最小数,当和1相加就产生一个比1大的数
flops 浮点运算数
inf 无穷大,如1/0
NaN 不定量,如0/0
i,j i=j=
nargin 所用函数的输入变量数目
nargout 所用函数的输出变量数目
realmin 最小可用正实数
realmax 最大可用正实数
时间和日期(Time and dates)
clock 时钟
cputme MATLAB占用CPU 时间
date 日期
etime 用CLOCK 计算的时间
now 当前时钟和日期
pause 暂停
tic 计时开始
toc 计时终止和显示
符串操作(String operations)
ischar 若是字符串则为真
isletter 串中是字母则为真
isspace 串中是空格则为真
isempty 若是空矩阵则为真
isequal 若对应元素相等则为1
islogical 若是逻辑数则为真
isnumeric 若是数值则为真
int2str 将整数转换为字符串
str2num 将字符串转换为数值
lower 把字符串变成小写
upper 把字符串变成大写
MATLAB取整和求余函数(Rounding and remainder)
ceil 朝正无穷大方向取整
fix 朝零方向取整
floor 朝负无穷大方向取整
mod 模数求余
rem 求余数
round 四舍五入取整
sign 符号函数
文件输入/输出(File input/output)
fopen 打开文件
fclose 关闭文件
fread 从文件中读取二进制数据
fwrite 把二进制数据写到文件里
fscanf 从文件中读入格式化数据
fprintf 把规格化数据写到文件或屏幕
fgetl 读文件的行,忽略回车符
fgets 读文件的行,包括回车符
exist 检查文件是否存在
ferror 查询文件I/O的错误状态
feof 测试文件是否结束
fseek 设置文件位置指示符
ftell 获取文件位置指示符
frewind 返回到文件开始
delete 删除磁盘文件
微积分(Calculus)
diff 求导数
limit 求极限
int 计算积分
jacobian Jacobian矩阵
symsum 符号序列的求和
trylor Trylor级数
方程求解(Solution of Equation)
dsolve 求解符号常微分方程
finverse 求反函数
fminunc 拟牛顿法求多元函数极值点
fsolve 解非线性方程组
lsqnonlin 解非线性最小二乘问题
solve 求解方程组
四、M文件编程
1 命令文件与函数文件的主要区别是什么?
(1)命令文件是一系列命令的组合,函数文件的第一行必须用function说明;
(2)命令文件没有输入参数,也不用返回参数,函数文件可以接受输入参数,也可以返回参数;
(3)命令文件处理的变量为工作空间变量,函数文件处理的变量为函数内部的局部变量,也可以处理全局变量。
2 如何定义全局变量?
用关键字global可以把一个变量定义为全局变量,在M文件中定义全局变量时,如果在当前工作空间已经存在了相同的变量,系统将会给出警告,说明由于将该变量定义为全局变量,可能会使变量的值发生改变,为避免发生这种情况,应该在使用变量前先将其定义为全局变量。
3 如果x是一个结构型数组,如何观察其中的内容?
结果数组用于存储一组相关的数据元素(域),这些元素可以是不同类型、不同尺寸的,结构数组不能用数组编辑器观察和修改其中的元素。对于明为x的结构型数组,可以直接键入x以观察其中所包含的域名及内容,也可以键入x.域名观察指定域名的内容,例如
>>x
x =
name: ‘line’
color: ‘red’
data: [1 2.7000 3 5.9000 8.4000 12.2000 16.6000 18.8000 26.2000]
>> x.color
ans =
red
4 if语句有几种表现形式?
(1)if 表达式
语句体
end
(2)if 表达式
语句体1
else
语句体2
end
(3)if 表达式1
语句体1
elseif 表达式2
语句体2
end
(4)if 表达式1
语句体1
elseif 表达式2
语句体2
else
语句体3
end
5 说明break语句和return语句的用法。
break语句用于终止for循环和while循环的执行。如果遇到break语句,则退出循环体,继续执行循环体外的下一行语句。在嵌套循环中,break只存在于最内层的循环中。
return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止keyboad方式,在MATLAB中,被调用的函数运行结束后会自动返回调用函数,使用return语句时将return插入被调用函数的某一位置,根据某种条件迫使被调用函数提前结束并返回调用函数。
6 有一周期为4的正弦波上叠加了方差为0.1的正态分布的随机噪声的信号,用循环结构编制一个三点线性滑动平均的程序。(提示:①用0.1*randn(1,n)产生方差为0.1的正态分布的随机噪声;②三点线性滑动平均就是依次取每三个相邻数的平均值作为新的数据,如x1(2)=(x(1)+x(2)+x(3))/3,x1(3)=( x(2)+x(3)+x(4))/3……)
t=0:pi/50:4*pi;
n=length(t);
y=sin(t)+0.1*randn(1,n);
ya(1)=y(1);
for i=2:n-1
ya(i)=sum(y(i-1:i+1))/3;
end
ya(n)=y(n);
plot(t,y,’c’,t,ya,’r’,’linewidth’,2)
7 编制一个解数论问题的函数文件:取任意整数,若是偶数,则用2除,否则乘3加1,重复此过程,直到整数变为1。
function c=collatz(n)
% collatz
% Classic “3n+1” Ploblem from number theory
c=n;
while n>1
if rem(n,2)==0
n=n/2;
else
n=3*n+1;
end
c=[c n];
end
8 有一组学生的考试成绩(见表),根据规定,成绩在100分时为满分,成绩在90~99之间时为优秀,成绩在80~89分之间时为良好,成绩在60~79分之间为及格,成绩在60分以下时为不及格,编制一个根据成绩划分等级的程序。
学生姓名 王 张 刘 李 陈 杨 于 黄 郭 赵
成 绩 72 83 56 94 100 88 96 68 54 65
Name=[‘王’,’张’,’刘’,’李’,’陈’,’杨’,’于’,’黄’,’郭’,’赵’];
Marks=[72,83,56,94,100,88,96,68,54,65];
% 划分区域:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
n=length(Marks);
for i=1:n
a{i}=89+i;
b{i}=79+i;
c{i}=69+i;
d{i}=59+i;
end;
c=[d,c];
% 根据学生的分数,求出相应的等级。
for i=1:n
switch Marks(i)
case 100 %得分为100时
Rank(i,:)=’ 满分’;
case a %得分在90~99之间
Rank(i,:)=’ 优秀’;
case b %得分在80~89之间
Rank(i,:)=’ 良好’;
case c %得分在60~79之间
Rank(i,:)=’ 及格’;
otherwise %得分低于60。
Rank(i,:)=’不及格’;
end
end
% 将学生姓名,得分,级等信息打印出来。
disp(‘ ‘)
disp([‘学生姓名 ‘,’ 得分 ‘,’ 等级’]);
disp(‘————————–’)
for i=1:10;
disp([’ ‘,Name(i),’ ‘,num2str(Marks(i)),’ ‘,Rank(i,:)]);
end
学生姓名 得分 等级
-—————————————-
王 72 及格
张 83 良好
刘 56 不及格
李 94 优秀
陈 100 满分
杨 88 良好
于 96 优秀
黄 68 及格
郭 54 不及格
赵 65 及格
9 编写一段程序,能够把输入的摄氏温度转化成华氏温度,也能把华氏温度转换成摄氏温度。
k=input(‘选择转换方式(1–摄氏转换为华氏,2–华氏转换为摄氏):’);
if k~=1 & k~=2
disp(‘请指定转换方式’)
break
end
tin=input(‘输入待转变的温度(允许输入数组):’);
if k==1
tout=tin*9/5+32; % 摄氏转换为华氏
k1=2;
elseif k==2
tout=(tin-32)*5/9; % 华氏转换为摄氏
k1=1;
end
str=[’ C’;’ F’];
disp([‘转换前的温度’, ‘ ‘, ‘转换后的温度’])
disp([’ ‘,num2str(tin),str(k,:), ‘ ‘, num2str(tout),str(k1,:)])
10 keyboard命令的作用是什么?当在函数中使用keyboard命令时,是否可以在工作空间浏览器中观察和修改函数中的局部变量?退出keyboard状态的命令是什么?编一个函数文件,在其中设置keyboard,观察变量情况。
当运行中的程序遇到keyboard命令时会暂时停止运行,将控制权交给键盘,这时命令窗口的提示符变为K»,可以在命令窗口或工作空间浏览器中观察和修改变量内容,如果keyboard命令设置在函数中,则可以观察和修改函数中的局部变量,检查或修改完成后,键入return命令,退出keyboard状态,控制权交还给系统,程序将继续运行。
\11. 函数M文件
当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规定好的。函数工作空间变量nargin包含输入参量个数;函数工作空间变量nargout包含输出参量个数。事实上,这些变量常用来设置缺省输入变量,并决定用户所希望的输出变量。例如,考虑MATLAB函数linspace:
function y=linspace(d1,d2,n)
% LINSPACELinearlyspacedvector.
% LINSPACE(x1,x2)generatesarowvectorof100linearly
% equallyspacedpointsbetweenx1andx2.
% LINSPACE(x1,x2,N)generatesNpointsbetweenx1andx2.
% SeealsoLOGSPACE,
% Copyright(c)1984-94byTheMathWorks,Inc.
if nargin==2
n=100;
end
y=[d1+(0:n-2)*(d2-d1)/(n-1)d2];
这里,如果用户只用两个输入参量调用linspace,例如linspace(0,10),linspace产生100个数据点。相反,如果输入参量的个数是3,例如,linspace(0,10,50),第三个参量决定数据点的个数。
五、MATLAB的符号运算功能
1.求和
symsum(S) 对通项S求和,其中k为变量。且从0变到k-1。
symsum(S,v) 对通项S求和,指定其中v为变量。且v从0变到v-1。
symsum(S,a,b) 对通项S求和,其中k为变量。且从a变到b。
symsum(S,v,a,b) 对通项S求和,指定其中v为变量。且v从a变到b。
例:键入k=sym(‘k’);symsum(k) 得
ans =
1/2k^2-1/2k
又例如:键入 symsum(k^2,0,10)得
ans =
385
又例如:键入symsum(‘x’^k/sym(‘k!’),k,0,inf)得
ans =
exp(x)
这最后的一个例子是无穷项求和。
2.求导数
diff(S,v) 求表达式S对变量v的一阶导数。
diff(S,v,n) 求表达式S对变量v的n阶导数。
例如:键入命令
A=sym(‘[1/(1+a),(b+x)/cos(x);1,exp(x^2)]’);
diff(A,’x’) 得
ans =
[ 0, 1/cos(x)+(b+x)/cos(x)^2*sin(x)]
[ 0, 2xexp(x^2)]
又如求sin(x)+ex的三阶导数,键入命令
diff(‘sin(x)+x*exp(x)’,3) 得
ans =
-cos(x)+3exp(x)+xexp(x)
再如:求
A =
[ x*sin(y), x^n+y]
[ 1/x/y, exp(ixy)]
的先对x再对y的混合偏导数。
可键入命令:
S=sym(‘[xsin(y),x^n+y;1/x/y,exp(ix*y)]’);
dsdxdy=diff(diff(S,’x’),’y’) 得
dsdxdy =
[ cos(y), 0]
[ 1/x^2/y^2, iexp(ixy)-yxexp(ix*y)]
求y=(lnx)x的导数
可键入命令:
p=’(log(x))^x’;
p1=diff(p,’x’) 得
p1 =
log(x)^x*(log(log(x))+1/log(x))
求y=xf(x2)的导数,可键入命令:
p=’x*f(x^2)’;
p1=diff(p,’x’) 得
p1 =
f(x^2)+2x^2D(f)(x^2)
求xy=ex+y的导数,可键入命令:
p=’x*y(x)-exp(x+y(x))’;
p1=diff(p,’x’)
p1 =
y(x)+xdiff(y(x),x)-(1+diff(y(x),x))exp(x+y(x))
p2=’y+xdy-(1+dy)exp(x+y)=0’;
dy=solve(p2,’dy’) %把dy作为变量解方程 得
dy=
-(y-exp(x+y))/(x-exp(x+y))
3.求极限
limit(P) 表达式P中自变量趋于零时的极限。
limit(P,a) 表达式P中自变量趋于a时的极限。
limit(P,x,a,’left’) 表达式P中自变量x趋于a时的左极限。
limit(P,x,a,’right’)表达式P中自变量x趋于a时的右极限。
例如:键入
P=sym(‘sin(x)/x’);
limit(P) 得
ans =
1
键入
P=sym(‘1/x’);
limit(P,x,0,’right’) 得
ans =
inf
键入
P=sym(‘(sin(x+h)-sin(x))/h’);h=sym(‘h’);
limit(P,h,0) 得
ans =
cos(x)
键入
v=sym(‘[(1+a/x)^x,exp(-x)]’);
limit(v,x,inf,’left’) 得
ans =
[ exp(a), 0]
4.求积分
int(P) 对表达式P进行不定积分。
int(P,v) 以v为积分变量对P进行不定积分。
int(P,v,a,b) 以v为积分变量,以a为下限,b为上限对P进行定积分。
例如:键入int(‘-2*x/(1+x^2)^2’) 得
ans =
1/(1+x^2)
键入int(‘x/(1+z^2)’,’z’) 得
ans =
atan(z)*x
键入int(‘x*log(1+x)’,0,1) 得
ans =
1/4
定积分的上下限可以是(符号)函数。例如,键入:
int(‘2*x’,’sin(t)’,’log(t)’) 得
ans =
log(t)^2-sin(t)^2
可以对(符号)矩阵进行积分,例如输入
int(‘[exp(t),exp(a*t)]’) 得
ans =
[ exp(t), 1/aexp(at)]
5.求符号方程的解
(1)线性方程组的求解
线性方程组的形式为A*X=B;其中A至少行满秩。
X=linsolve(A,B) 输出方程的特解X。
例如:键入
A=sym(‘[cos(t),sin(t);sin(t),cos(t)]’);
B=sym(‘[1;1]’);
c=linsolve(A,B)
c =
[ 1/(sin(t)+cos(t))]
[ 1/(sin(t)+cos(t))]
例如:键入
a=sym(‘[2,7,3,1;3,5,2,2;9,4,1,7]’);b=sym(‘[6;4;2]’);
X=linsolve(a,b)
Warning: System is rank deficient. Solution is not unique.
X =
[ 0]
[ 0]
[ 2]
[ 0]
(2)代数方程的求解
solve(P,v) 对方程P中的指定变量v求解。
solve(p1,P2,…,Pn,v1,v2,…,vn) 对方程P1,P2,…,Pn中的指定变量
v1,v2,…,vn求解。
例:要求解方程p+sin(x)=r,可输入
solve(‘p+sin(x)=r’) 得:
ans =
-asin(p-r)
又例:要求解方程组 ,可输入:
P1=’x^2+xy+y=3’; P2=’x^2-4x+3=0’;
[x,y]=solve(P1,P2) 得:
x =
[ 1]
[ 3]
y =
[ 1]
[ -3/2]
再例:要求解方程组 ,可输入:
P1=’a+u^2+v^2=0’; P2=’u-v=1’;
[u,v]=solve(P1,P2,’u’,’v’) 得:
u =
[1/2+1/2(-1-2a)^(1/2)]
[1/2-1/2(-1-2a)^(1/2)]
v =
[ -1/2+1/2(-1-2a)^(1/2)]
[ -1/2-1/2(-1-2a)^(1/2)]
对于有些无法求出解析解的非线性方程组,MATLAB只给出一个数值解。这一点可以从表示解的数字不被方括号括住而确定。例如:键入:
[x,y]=solve(‘sin(x+y)-exp(x)*y=0’,’x^2-y=2’) 得:
x =
-6.0173272500593065641097297117905
y =
34.208227234306296508646214438330
由于这两个数字没有被[ ]括住,所以它们是数值解。另外,可利用solve来解线性方程组的通解。例如:键入
P1=’2x1+7x2+3*x3+x4=6’;
P2=’3x1+5x2+2x3+2x4=4’;
P3=’9x1+4x2+x3+7*x4=2’;
u=solve(P1,P2,P3,’x1’,’x2’,’x3’,’x4’)
Warning: 3 equations in 4 variables.
u =
x1: [1x1 sym]
x2: [1x1 sym]
x3: [1x1 sym]
x4: [1x1 sym]
可以看到:屏幕提示“有3个方程4个变量”,意为解不唯一。(有时会提示解不唯一)且输出的是解的结构形式。为进一步得到解,可输入:
u.x1,u.x2,u.x3,u.x4, 得:
ans =
x1
ans =
-5x1-4x4
ans =
11x1+9x4+2
ans =
x4
这样就得到了原方程组的通解。
6.解符号微分方程
dsolve(‘eq1’,’eq2’,…) 其中eq表示相互独立的常微分方程、初始条件或
指定的自变量。默认的自变量为t。如果输入的初
始条件少于方程的个数,则在输出结果中出现常数
c1,c2,等字符。关于微分方程的表达式有如下的约
定:字母y表式函数,Dy表示y对t的一阶导数;
Dny表示y对t的n阶导数。
例如:求 的解。可键入:
[x,y]=dsolve(‘Dx=y’,’Dy=-x’) 得
x =
cos(t)C1+sin(t)C2
y =
-sin(t)C1+cos(t)C2
dsolve中的输入宗量最多只能有12个,但这并不妨碍解具有多个方程的方程组,因为可以把多个方程或初始条件定义为一个符号变量进行输入。
例如求, , , f(0)=0 , g(0)=1 的解,可输入指令:
P=’Df=3f+4g,Dg=-4f+3g’;
v=’f(0)=0,g(0)=1’;
[f,g]=dsolve(P,v)
f =
exp(3t)sin(4*t)
g =
exp(3t)cos(4*t)
注意:微分方程表达式中字母D必须大写。
求解微分方程 ,可输入
y=dsolve(‘D3y=-y’,’y(0)=1,Dy(0)=0,D2y(0)=0’,’x’) 得:
y =
(1/3+2/3exp(1/2x)cos(1/23^(1/2)x)exp(x))/exp(x)
最后看一个解非线性微分方程的例子:
dsolve(‘(Dy)^2+y^2=1’,‘y(0)=0’,’x’)
ans =
[ sin(x)]
[ -sin(x)]
对于无法求出解析解的非线性微分方程,屏幕将提示出错信息。
六、MATLAB绘图
1.二维图形
plot: x轴和y轴均为线性刻度(Linear scale)
loglog: x轴和y轴均为对数刻度(Logarithmic scale)
semilogx: x轴为对数刻度,y轴为线性刻度
semilogy: x轴为线性刻度,y轴为对数刻度
====================================================
若要画出多条曲线,只需将座标对依次放入plot函数即可:
plot(x, sin(x), x, cos(x));
若要改变颜色,在座标对後面加上相关字串即可:
plot(x, sin(x), ‘c’, x, cos(x), ‘g’);
若要同时改变颜色及图线型态(Line style),也是在座标对後面加上相关字串即可:
plot(x, sin(x), ‘co’, x, cos(x), ‘g*’);
====================================================
Matlab绘图中用到的直线属性包括:
(1)LineStyle:线形
(2)LineWidth:线宽
(3)Color:颜色
(4)MarkerType:标记点的形状
(5)MarkerSize:标记点的大小
(6)MarkerFaceColor:标记点内部的填充颜色
(7)MarkerEdgeColor:标记点边缘的颜色
1、线形
标记符 - – : -.
线 形 实线 虚线 点线 点横线
2、点形
标记符 + o * . x s d
点 形 加号 圆圈 星号 实心点 叉号 正方形 钻石形
标记符 ^ v > < p h
点 形 上三角形 下三角形 右三角形 左三角形 五角星形 六角星形
3、颜色
标记符 r g b c m y k w
颜 色 红 绿 蓝 蓝绿 紫红 黄 黑 白
例如:plot(x,y,’-.or’,’MarkerFaceColor’,’g’),其中线形为点横线,数据点形状为圆圈,线条和数据点边缘的颜色都是红色,数据点的填充颜色为绿色。
有时候我们希望画出数据点的分布情况,不需要画出这些点之间的连线,则可以按以下方式实现:
plot(x,y,’d’)
即只定义数据点的点形。这里再给出一个例子说明怎样运用以上属性来画图:
plot(t,sin(2*t),’-mo’,…
‘LineWidth’,2,…
‘MarkerEdgeColor’,’k’,…
‘MarkerFaceColor’,[.49 1 .63],…
‘MarkerSize’,12)
====================================================
图形完成後,我们可用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围:
axis([0, 6, -1.2, 1.2]);
此外,MATLAB也可对图形加上各种注解与处理:
xlabel(‘Input Value’); % x轴注解
ylabel(‘Function Value’); % y轴注解
title(‘Two Trigonometric Functions’); % 图形标题
legend(‘y = sin(x)’,’y = cos(x)’); % 图形注解
grid on; % 显示格线
我们可用subplot来同时画出数个小图形於同一个视窗之中:
subplot(2,2,1); plot(x, sin(x));
subplot(2,2,2); plot(x, cos(x));
subplot(2,2,3); plot(x, sinh(x));
subplot(2,2,4); plot(x, cosh(x));
====================================================
其他各种二维绘图函数:
bar 柱状(直方)图
errorbar 图形加上误差范围的误差棒图
fplot 绘制函数图形
ezplot 符号函数的简易绘图函数
polar 极座标图
hist 统计直方图
rose 统计扇形图
stairs 阶梯图
stem 火柴杆图
fill 二维多边形并填充颜色
compass 复数向量图(罗盘图)
pie 饼图
scatter 离散数据图
调用格式:Scatter(x, y, s, c),其中S为点的大小,c为颜色
feather 复数向量投影图(羽毛图)
area 填充一个图形与横坐标之间的区域
loglog 双对数坐标曲线
Semilogx x-轴对数坐标曲线
Semilogy y-轴对数坐标曲线
例:有一组测量数据满足 ,t的变化范围为0~10,用不同的线型和标记点画出a=0.1、a=0.2和a=0.5三种情况下的曲线。在结果图中添加标题 ,并用箭头线标识出各曲线a的取值。
解答:
>> t=0:0.5:10;
>> y1=exp(-0.1*t);
>> y2=exp(-0.2*t);
>> y3=exp(-0.5*t);
>> plot(t,y1,’-ob’,t,y2,’:*r’,t,y3,’-.^g’)
>> title(‘\ity\rm=e^{-\itat}’)
>> title(‘\ity\rm=e^{-\itat}’,’FontSize’,12)
>> text(t(6),y1(6),’\leftarrow\ita\rm=0.1’,’FontSize’,11)
>> text(t(6),y2(6),’\leftarrow\ita\rm=0.2’,’FontSize’,11)
>> text(t(6),y3(6),’\leftarrow\ita\rm=0.5’,’FontSize’,11)
2.三维图形
plot3 —— 基本的三维图形指令
调用格式:plot3(x,y,z) —— x,y,z是长度相同的向量
plot3(X,Y,Z) —— X,Y,Z是维数相同的矩阵
plot3(x,y,z,s) —— 带开关量
plot3(x1,y1,z1,’s1’, x2,y2,z2,’s2’, …)
grid on(off) 绘制三维网格
text(x,y,z,‘string’) 三维图形标注
pie3 三维饼图
fill3 三维多边形的绘制和填色
mesh 三维网线绘图函数
调用格式:mesh(z) —— z为n×m的矩阵,x与y坐标为元素的下标;或
[x, y]=meshgrid(x, y——生成2维网格点
mesh(x,y,z) —— 绘三维网线图,x,y,z分别为三维空间的坐标位置
surf 三维曲面绘图函数,与网格图看起来一样
调用格式:surf(x,y,z) —— 绘制三维曲面图,x,y,z为图形坐标向量
surfc(X,Y,Z) —— 带等高线的曲面图
surfl(X,Y,Z) —— 被光照射带阴影的曲面图
axis([xmin xmax ymin ymax zmin zmax ]) ——设置图形大小
三维图形效果修饰:
shading faceted —— 网格修饰,缺省方式
shading flat —— 去掉黑色线条,根据小方块的值确定颜色
shading interp —— 颜色整体改变,根据小方块四角的值差补过度点的值确定颜色
例: ,当x和y的取值范围均为-2到2时,用建立子窗口的方法在同一个图形窗口中绘制出三维线图、网线图、表面图和带渲染效果的表面图。
解答:
>> [x,y]=meshgrid([-2:.2:2]);
>> z=x.*exp(-x.^2-y.^2);
>> mesh(x,y,z)
>> subplot(2,2,1), plot3(x,y,z)
>> title(‘plot3 (x,y,z)’)
>> subplot(2,2,2), mesh(x,y,z)
>> title(‘mesh (x,y,z)’)
>> subplot(2,2,3), surf(x,y,z)
>> title(‘surf (x,y,z)’)
>> subplot(2,2,4), surf(x,y,z), shading interp
>> title(‘surf (x,y,z), shading interp’)
七、MATLAB中的运算符和特殊字符说明
符号 符号用途说明
-
加
-
减
.* 点乘,用于数组运算
- 矩阵相乘
^ 矩阵求幂
.^ 点幂,用于数组运算
\ 左除 详细说明help slash
/ 右除
.\ 点左除,用于数组运算
./ 点右除,用于数组运算
, 作分隔用,如把矩阵元素、向量参数、函数参数、几个表达式分隔开来
; (a)写在一个表达式后面时,运算后命令窗口中不显示表达式的计算结果,(b)在创建矩阵的语句中指示一行元素的结束,例如m=[x y z;i j k]
: (a)创建向量的表达式分隔符,如x=a:b:c,(b)a(:,j)表示j列的所有行元素;a(i,:)表示i行的所有列元素;a(1:3,4)表示第四列的第1行至第3行元素
() 圆括号
[] 创建数组、向量、矩阵或字符串(字母型)
{} 创建单元矩阵(cell array)或结构(struct)
% 注释符,特别当编写自定义函数文件时,紧跟function后的注释语句,在你使用help函数名时会显示出来。
’ (a)定义字符串用,(b)向量或矩阵的共轭转置符
.’ 一般转置符
… 表示MATLAB表达式继续到下一行,增强代码可读性
= 赋值符号
== 等于关系运算符
<,> 小于,大于关系运算符
& 逻辑与
逻辑或 |
~ 逻辑非
xor 逻辑异或
整理笔记
本文主要记录一些学习Matlab过程中的一些琐碎的易忘的知识点,以待日后翻阅查看。快捷键指令cmd+k
清除指令界面quit
退出matlabwhos
可以查询迄今为止所有定义的变量的类型、内存空间、是否复数,who
只查看变量名称clear
清除全部变量,clear x y z
清除制定变量...
用来续行format short/long
结果精确到4位小数或者16位小数,format short e
用科学计数法计数,format rat
查找最近结果的比例式%
注释标记数学运算符pi
相当于派abs
求绝对值exp(a)
求解e的a次方sqrt(a)
对a开根号log(a)
求a的自然对数ln(a),log10(a)
求10为底的a的对数sin
cos
tan
atan
三角函数随便用a/b
是右除,意思是a➗ba\b
是左除,意思是b➗a运算顺序:幂运算优于乘除,右除优于左除在赋值语句后面加 ;
可以只起到赋值的效果,不输出 x=20
的赋值结果(不显示在命令窗口)2 +3i
表示复数就可以用i.^
幂次方运算需要在^
之前加.
pretty(f)
用书面方式显示方程f易错点看清是直径还是半径当重新定义了自变量x,需要重新运行y=f(x)
,从而获取新的y值,否则会有矢量大小不匹配的错误axis([-4,4,-2,2])
别忘了最外面的括号得到一个大矩阵:[x, y] = meshgrid(-3:0.1:2, -5:0.1:5)[x, y] = meshgrid(-5:0.2:5)
矩阵求模:sqrt(dot(A,A))
当出现error
的时候,先看看有没有定义变量,syms x
.*
和dot
是不同的运算,dot
得出来的结果是两个矩阵对应元素相乘后加起来,因此得到一个数字,.*
没有加起来,因此得出来的是一个矩阵syms
定义多个变量的时候不需要加,
如果极限不存在,为NAN,那么再计算一下左右极限来进一步确定一下渐近线需要先求解出来,再用plot([3,3],[-10 10],'r--')
画出来,注意中间的定义域和值域的首尾之间没有,
dsolve里面不能传入连等的条件,Dx=x(0)=0
这种结果是错误的。积分的时候int(f)
中的f不需要加引号线性代数基础补充一点线性代数的基础知识:向量:u=(u1,u2,u3) v=(v1,v2,v3)
单纯行乘列的矩阵乘法公式: u * v'={u1v1+u2v2+u3v3}
叉积公式:cross(u,v)=u x v = {u2v3-v2u3, u3v1-v3u1, u1v2-u2v1}
点积公式:sum(dot(u,v))=sum(u .* v) = u1v1+u2v2+u3v33=|u|*|v|*COS(U,V)
叉乘(向量积)的意义就是通过两个向量来确定一个新的向量,该向量与前两个向量都垂直点乘(数量积)的结果就是两个向量的模相乘,然后再与这两个向量的夹角的余弦值相乘。或者说是两个向量的各个分量分别相乘的结果的和。很明显,点乘的结果就是一个数,这个数对我们分析这两个向量的特点很有帮助。如果点乘的结果为0,那么这两个向量互相垂直;如果结果大于0,那么这两个向量的夹角小于90度;如果结果小于0,那么这两个向量的夹角大于90度。行向量 a=[1,2,3] a=[1 2 3]
, 列向量 b=[1;2;3]
引用向量的个别“单行单列”元素a(1),a(4:6),a(:)
第三个是显示a向量所有的元素引用向量的个别“多行多列”元素a(2,3) a(:,2) a(:,2:3) a(1:2,2:3)
第二行第三列,第二列,第二列和第三列,一二行二三列,a(1,:)=[]
,删除第一行复制行创建新矩阵a([1,2,1],:)
,复制一行放在一行,复制二行放在二行,复制一行放在三行转置运算用 '
,加减乘除直接算向量合并,行向量用,
合并,列向量用;
合并a=[0:2:10]
创建从0到10间隔2的等差行向量a=logspace(0,1,5)
创建从10^0到10^1之间含有5个等差元素的点,注意是圆括号()length(a),max(a),min(a)
分别求解出- 矩阵的个数,最大值,最小值求模(繁琐版)对于实数 sqrt(sum(a.*a))
对于复数sqrt(sum(a.*conj(a)))
,conj(a)
是求复数的共轭复数dot(a,b) cross(a,b)
点乘(对应元素相乘并求和)和叉乘当a是带有复数的矩阵,'
是转置加共轭,而.'
是单纯的转置.*
是对应位置元素相乘(行乘行),*
是矩阵相乘(行乘列)./
.\
.^
分别是右除,左除和幂次方,换句话说只要是加.
基本都是对应位置元素互相运算zeros(m),zeros(m,n) eye(m),eye(m,n)
分别是零矩阵和单位矩阵det(a)
求矩阵a的行列式,助力求解多元一次方程的解rank(a)
求矩阵a的秩inv(a)
求矩阵a的逆矩阵,det(a) != 0
的矩阵a才有逆矩阵rref(A)
求A降行后的梯形矩阵magic(n)
魔方矩阵(幻方)是一个 n×n 矩阵。矩阵的元素从 1 到 n^2 之间,并且行元素的和等于列元素的和。[L, U] = lu(A)
对矩阵 A 进行 LU 分解,x = U\(L\b)
用来求方程组的解求方程的解普通方法:增广矩阵:逆矩阵:线伪逆矩阵求无限解det(a)=0:LU分解:绘制图像x=[0:0.1:10]; y=cos(x); plot(x,y),xlabel('x'),ylabel('cos(x)'),gird on,axis equal,legend('cos(x)');
绘制图像+加坐标轴标签+网格+坐标轴间隔相同+图例,当更新x的区间或者间隔的时候,需要重新调用y=cosx
来更新y值,否则会报错fplot('exp(-2*t)*sin(t)',[0, 4]), xlabel('t'), ylabel('f(t)'), title('阻尼弹力')
fplot自动计算间隔,画出平滑的曲线axis ( [xmin xmax ymin ymax] )
确定绘图的x轴和y轴的绘图范围,axis auto
让matlab自动确定x轴和y轴的间距输入图例或者坐标轴名称的时候务必注意输入''
,不要输入变量作为参数t = [0:0.02:4];f = exp(-2*t)*sin(t);??? Error using ==> mtimesInner matrix dimensions must agree.
当一个函数是由二个或更多个函数相乘构成,别忘记在相乘时加上“.”以便告诉 MATLAB 我们是对两个矩阵进行相乘。应改为t = [0:0.02:4];f = exp(-2*t).*sin(t);
同时画两条曲线,plot(t,f,'-',t,g,'--')
实线’-‘虚线’—‘虚点线’-.’点线 ‘:’同时画两条实线,并且确定两条实现的颜色和虚实plot(x,y,'r',x,z,'b--')
画平行于坐标轴的直线 plot([0,0],[-1,2],'--')
不可以用plot(0,[-1,2],'--')
对方程画图%ezplot里面的参数需要加''ezplot('x^2 - 6*x - 12')d = 'x^2 - 6*x - 12';ezplot(d);%限定图像定义域ezplot(d,[x1,x2]);%限定图像的定义域和值域ezplot('x+3', [-4, 4, -2, 2])%错误,ezplot里面没有等号ezplot('x+3=0')%正确ezplot('x+3')
MATLAB 颜色说明符颜色key黑色k白色w红色r黄色y绿色g蓝色b青色c洋红m绘制子图使用命令 subplot(m, n, p)
,这里 m 和 n 告诉 MATLAB 产生的产生的子图有 m 行和 n 列,p 用来告诉 MATLAB 我们所要贴上去的 某个已经绘制的图形窗口在第几个块中,记住,要先subplot开辟空白表,再在plot画上图像产生x数集的命令:
x = linspace(a,b)
:MATLAB 会在 a 到 b 间取出均匀分布的 100 个点(或行向量),如果写成x = linspace(a,b,n)
:那么 MATLAB 会在 a、b 之间取出均匀分布的 n 个点。在两条plot
命令之间加hold on
可以使得两个图像重叠,而不必清除原有重新绘制将图像上特定的点用红色圆圈圈起来plot(double(s(1)),double(subs(f,s(1))),'ro')
绘制极坐标曲线:theta = [0:pi/90:2*pi];r = a*theta;polar(theta,r), title('阿基米德螺线');
绘制双log曲线:loglog(x,y)
,它产生的图像x,y轴均使用对数值semilogx(x, y)
,它产生的图象 x 轴使用对数值, y 轴仍然用直接值;相应地,semilogy(x, y)
产生的图象 y 轴使用对数值,x 使用直接值。绘制离散图(折线图)months=['J';'F';'M';'A';'M';'J';'J';'A';'S';'O';'N';'D'];N=20; x=(1:N); y=ceil(12*rand(N,1)); plot(x,y); set(gca,'YLim',[0 13],'YTick',1:12,'YTickLabel',months)
YLim
限制纵坐标的总范围0~13YTick
月份对应点在总范围中的部分1~12YTickLabel
纵轴的文字标定值绘制离散图(柱状图)x = [1:5];y = [50,98,75,80,98];bar(x,y), xlabel('学生'),ylabel('分数'), title('期末测试')%水平的柱状图barh(a,b),xlabel('学生人数'),ylabel('考试分数')%三维柱状图bar3(a,b),xlabel('考试分数'),ylabel('学生人数')
%默认是非分组的柱状图bar(x, y, grouped);%设置分组柱状图bar(x, y, stacked);x = [54.5,64.5,74.5,84.5,94.5];garcia= [0; 3; 18; 13; 10];simpson= [3; 5; 20; 10; 5];smith= [1; 2; 15; 17; 8];y = [garcia simpson smith];bar(x,y),xlabel('考试分数'),ylabel('学生人数'),legend('加西亚','辛普森','史密斯')
绘制离散图(针头图)plot(t,f),xlabel('时间(秒)'),ylabel('弹簧响应')%替换为:stem(t,f),xlabel('时间(秒)'),ylabel('弹簧响应')%填充绿色菱形标记:stem(t,f,'--dg','fill'),xlabel('时间(秒)'),ylabel('弹簧响应')
等高线图(二维+三维)[x,y] = meshgrid(-5:0.1:5, -3:0.1:3);%[x,y] = meshgrid(-2:0.1:2);如果两个变量的取值范围相同,可以只写一次z = x.^2 + y.^2;[C,h] = contour(x,y,z);%c是等高线矩阵,h是等高线句柄%给等高线加上图例set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)%变成三维图像,30指的是等高线的密度contour3(x, y, z, 30);%装扮图像surface(x,y,z,'EdgeColor',[.8 .8 .8],'FaceColor','none')grid off;view(-15,20);%摄像机沿着x,y轴移动
解释set指令的参数:contour(x,y.z)
:(x,y)是平面z=0上点的坐标矩阵,z为相应点的高度值矩阵。[C,h]=contour(x,y,z)
:C 为返回等值线矩阵,h为图形对象的句柄向量,也就是代表所绘制图形;set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
h:图形对象;ShowText
:显示等高值标签命令,后面设置’on’,就是打开显示标签;TextStep
:标签的步长;LevelStep
:等高线步长;get(h,'LevelStep')
:得到等高线步长的值。这个命令就是从第一个等高线开始,每隔一个给等高线贴上标签。三维图像%绘制圆柱体t = 0:pi/10:2*pi;[X,Y,Z] = cylinder(1+sin(t));surf(X,Y,Z);axis square;%普通三维图像mesh(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')%表面颜色过渡的图像surf(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')%底部有等高线映射的图像surc(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')%图象中的阴影可以设置为flat、interp和faceted。%flat 是用同一颜色为每个网格进行着色并隐藏网格线%而 facted 则显示网格%使用 interp 是 告诉 MATLAB 使用颜色插值的办法进行着色,因此显得非常平滑surfl(x,y,z),xlabel('x'),ylabel('y'),zlabel('z');shading interp;%将图像着色为灰色colormap(gray);
mean(a)
行向量可以求得每一个行元素的平均值,mean(A)
矩阵可以求得每一列的平均值median(raw)
中位数std(raw)
标准差size(A)
判断矩阵的大小~=
是不等于disp('错误:数据必须具有相同的维数。')
自定义错误出现时,屏幕上显示的语句逻辑控制if_else判断myaverage.m
文件的内容(文件名与函数名务必相同,否则无法调用)function ave = myaverage(x,N) sizex = size(x); sizeN = size(N); if sizex(2) ~= sizeN(2) disp('错误:数据必须具有相同的维数。') else total = sum(N); s = x.*N; ave = sum(s)/total; endend
for循环for index = start : increment : finish statements
end
input输入r = input('输入半径:')
while循环while condition statements
end
switch_case语句switch expression case 1 do these statements case 2 do these statements case n do these statements end
解方程一元一次方程%'a'的意义是标定未知量,这样剩下的一个字母被认为是常量%solve('a*x + 5=0','a')和solve('a*x + 5','a')是一样的,=0是默认值solve('a*x + 5','a')MATLAB 响应输出为:ans = -5/x
一元二次方程s = solve('x^2 - 6*x - 12 = 0')s= 3 + 21^(1/2) 3 - 21^(1/2)%这两个值可以用s(1),s(2)取到d = 'x^2 + 9*x -7 = 0';solve(d);%强制转换格式,可以将多项式转化为小数x = double(s(1))
二元一次方程组s = solve('5*x + 4*y = 3','x - 6*y = 2');%使用点句号“.” 我们就可以取得相应的 x 和 y 值s.xs.y
方程的展开(多个多项式相乘)%定义变量xsyms x
expand((x - 1)*(x + 4))
方程的合并和化简(分配多项式)collect(x*(x^2 - 2))%经测试,可以被expand代替
因式分解factor(112)%分解数字factor(x^2 - y^2)factor([x^2-y^2, x^3+y^3])%多个因式同时分解
多项式相除%多项式相除syms x;simplify((x^4-81)/(x^2-9))ans = x^2+9%log函数化简syms x;simplify(exp(2*log(3*x)))ans = 9*x^2%三角恒等式syms x;simplify(cos(x)^2-sin(x)^2)ans = 2*cos(x)^2-1simplify(cos(x)^2+sin(x)^2)ans = 1
使用指数和对数函数求解方程eq = 'log10(x) - log10(x - 3) = 1';s = solve(eq);
泰勒级数展开式taylor(sin(x),'order',20)//20为展开的项数
极限计算独立变量趋近于0%limit(f)limit((x^3 + 1)/(x^4 + 2))
独立变量趋近于非0%limit(f, a)limit(x + 5,3)
独立变量趋近于无穷大(小)%limit(f,inf)%limit(f,-inf)limit(sqrt(x^2+x)-x,inf)
左极限和右极限a = limit(f,x,3,'left')b = limit(f,x,3,'right')
求导数%一阶导数diff(f)%n阶导数diff(f,n)
检查等式两边的式子是否相等isequal(a,f)
将常数代入方程得到结果subs(h,2)%将多个常数代入求得方程的结果subs(F,{b,x},{2,4})
求解符号微分方程%dsolve('eqn', 'cond1', 'cond2', ...),cond1等是初始条件dsolve('Dy = y*t/(t-5)','y(0) = 2')dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')
常微分方程(ODE)求解s = dsolve('Dy=a*y')s = C1*exp(a*t)C1 = 2; a = 4;%将常数代入字母为系数的方程f = subs(s)f= 2*exp(4*t)%或者f = subs(s,'C1',2);
方程组和相平面图设置曲线图像细节%调用 findobj 命令告诉 MATLAB 查找图象中的线条,然后使用 set 命令为线条设置颜色(最后所有的line都变为红色)ezplot(s.X),set(findobj('Type','line'),'Color','r')%调用 get 命令,它将返回当前图形对象的句柄h=get(gca,'children');%使用下面的命令改变它(单独的一条line变为虚线)set(h(1),'linestyle','--')
常微分方程(ODE)的数值解使用ODE23和ODE45求解一阶方程我们创建一个.m文件,输入下面的内容。function ydot = eq1(t,y)ydot = cos(t);
通过调用ODE32/ODE45函数来求解ODE(产生的是t和对应的y的数组元素)%[t,y] = ode23('func_name', [start_time, end_time], y(0))[t,y] = ode23('eq1',[0 2*pi],2);%[t,y] = ode45('func_name', [start_time, end_time], y(0))[t,w] = ode45('eq1',[0 2*pi],2)
首先我们产生一个表示解析解的数集,然后我们可以比较:f = 2 + sin(t);
使用下面的命令来产生图象:plot(t,y,'o',t,f),xlabel('t'),ylabel('y(t)'),axis([0 2*pi 0 4])plot(t,w,'o',t,f),xlabel('t'),ylabel('y(t)'),axis([0 2*pi 0 4])
ODE23ODE45ODE23与ODE45区别:如果误差对你非常重要,那么使用ode45将是明智的选择,ODE45误差小根据数值画出的点比前面我们从ode32得到的密度要高带有扰动的常微分方程function ydot = eq2(t,y) global tc w F = t*exp(-t/tc)*cos(w*t); ydot = 5*(F-y);
tc = 0.1; w = 6.28;final_time = 1.0;[t,y] = ode45('eq2',[0 final_time],y0);plot(t,y),xlabel('t'),ylabel('y(t)'),axis([0 0.7 0 0.015])plot(t,y,t,F,'--'),xlabel('t'),ylabel('y(t)'),axis([0 0.7 0 0.05])
二阶方程求解function xdot = eqx(t,x);%创建数组储存数据xdot = zeros(2,1);xdot(1) = -x(1)^2 + x(2);xdot(2) = -x(1) - x(1)* x(2);[t,x] = ode45('eqx',[0 10],[0,1]);plot(t,x(:,1),t,x(:,2),'--'),xlabel('t'), axis([0 10 -1.12 1.12])
二阶方程求解需要把这个方程换成一阶方程组积分计算INT命令%int(f)%int(f, v) 语法来调用 int,其中 f 就是要积分的函数,而 v 是积分变量syms x;int(x)
对于计算积分的读者来说,不要忘记在你的答案后面带上积分常量定积分int('x',2,3)
orF = int(x);subs(F,x,3)-subs(F,x,2)
多重积分int(int(int(x*y^2*z^5,x),y),z)
int(int(f,x,2,4),y,1,2)
数值积分调用 trapz(x, y)函数 MATLAB 可以进行梯形积分%等分次数越多,误差越小x = linspace(0,2,10);y = x.^2;a = trapz(x,y);a= 2.6831
正交积分MATLAB 有两个命令 quad 和 quad1 可以用来实现正交积分。这种类型的方法基于使用 二次函数代替矩形更能接近曲线下方面积的原理(使用高阶的多项式还能够得到更精确的结 果)。辛普森法则(Simpson’s rule)是把积分区间分成偶数段,相邻两段下面的面积用不同 的二次函数近似表示。quad 函数采用适应辛普森法则的逼近方法进行数值积分。要使用 quad,把被积的函数传递给它,后面跟着积分区间。
quadl 函数采用洛巴托(Lobatto)积分法。这是一种适应正交积分更加灵活复杂的类型, 查阅 MATLAB 的帮助以便获得更多的信息。quad 和 quadl 函数的不利方面是无法对点集进行积分。quad('exp(-2*x)'',0,1/8)
数据拟合%n 是我们要 MATLAB 求出的多项式的次数%对于 y = mx + b 形式的方程,我们把 n 设为等于 1,%因此调用的语句将是 polyfit(x, y, 1)%n次多项式有n+1个常数系数polyfit(x, y, n)如果我们使用 p = polyfit(x, y, n)调用 polyfit,第 j 个系数的引用写成 p(j)m = p(1)b = p(2)
指数函数的拟合拟合程度当r^2接近1,或者,RMS小于1,则说明拟合程度比较好。%其中,AVE是原有的数据,MEAN是原有数据的平均值,w是拟合数据,S和A公用的数据是AVE,即原有数据S = sum((Ave - MEAN).^2)A = sum((w - Ave).^2)r2 = 1 - A/S
另一种我们可以用来体现拟合程度的方法是计算一个称为均方根(Root-Mean-Square,RMS)误差的数 值,要用过这种方法来评估多项式与实际数据的拟合程度,我们可以使用下面的命令:w = m*sqft + bd = price - w;N = 10;d2 = d.^2;RMS = sqrt((1/N)*sum(d2))
可以使用 find 命令提问与数据有关的问题。例如,温度小于 80 度是在什么时候find(y < 80)
MATLAB复习资料
第一章 MATLAB基础知识
\1. MATLAB的主要功能:数值计算和符号计算功能、绘图功能、程序设计语言功能、扩展功能。
\2. MATLAB的集成开发环境包括多个窗口:除了MATLAB主窗口外,还有命令窗口、工作空间窗口、命令历史窗口和当前目录窗口。
\3. 变量的命名规则:变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符,变量名区分字母的大小写, MATLAB中的特殊变量名,应避免使用。
\4. MATLAB提供了6种关系运算符,三种逻辑运算符,四个逻辑运算函数。
\5. 矩阵相乘:mn; 矩阵元素相乘(数组相乘):.
右除,“/” :A/B=A*B-1 (B的逆矩阵inv(B)), B必须是方阵,
A与B列应相等;“./” :A./B为A各元素除以B中各元素。
矩阵乘方 :A^标量;元素的乘方:A.^标量
\6. 写出完成下列操作的指令:
1) 将矩阵A第2到5行中的第 1、3、5列元素赋值给矩阵: B=A(2:5,1:2:5)
2) 删除矩阵A的第七号元素: A(7)=[]
3) 将矩阵A的每个元素值加30: A=A+30
4) 求矩阵A的大小和维数: size(A);ndims(A)
5) 将向量t的0元素用机械零来代替: t(find(t==0))=eps
6) 将含有12个元素的向量x转换成3*4矩阵: t=reshape(x,3,4)
7) 求一个字符串的ASCII: abs(‘matlab’)
8) 求一个ASCII对应的字符: char(93)
第二章 MATLAB程序设计
Lower 大写转换为小写 upper 小写转换为大写
Fix 求商 rem求余
\1. MATLAB有两种执行方式:一种是交互式的命令执行方式;一种是程序执行方式。
\2. M文件可以根据调用方式的不同分为两大类:命令文件和函数文件。
\3. 命令文件和函数文件的主要区别在于:
1) 命令文件是一系列命令的组合,函数文件的第一行必须用function说明;
2) 命令文件没有输入参数,也不用返回参数,函数文件可以接受输入参数,也可以返回参数;
3) 命令文件处理的变量为工作空间变量,函数文件处理的变量为函数内部的局部变量,也可以处理全局变量。
\4. 函数调用的一般格式为:【输出实参数】=函数名【输入实参数】
\5. 全局变量用global命令定义,格式为:global 变量名
\6. 什么是M文件?如何建立并执行一个M文件?
答:用MATLAB语言编写的程序称为M文件;在matlab命令窗口点击file 菜单new ® m-file
\7. 程序的基本控制结构有几种?在matlab中如何实现?
任何程序都有三种基本控制结构组成:顺序结构、选择结构、循环结构。实现顺序结构的语句有input和disp等,实现选择结构的语句有if、switch和try语句,实现循环结构的语句有for和while。
第三章 图形绘制
\1. MATLAB有两类绘图命令,一是直接对图形句柄进行操作的低层绘图命令,另一类是在低层绘图基础上建立起来的高层绘图命令。
\2. 78页第2题
(1)
clc;
clear;
x1=linspace(0,1,100);
y1=2*x1-0.5;
t=linspace(0,pi,100);
x=sin(3*t).*cos(t);
y=sin(3*t).*sin(t);
plot(x1,y1,'r-',x,y,'b:');
text(0.4,1,'y=2x-0.5');
text(-0.4,0.5,'x=sin(3t)cos(t)');
text(-0.4,0.3,'y=sin(3t)sin(t)');
(2)
clc;
clear;
x=1:100;
y=2*x-0.5
subplot(1,2,1);
bar(y);
title('y=2x-0.5');
t=0:pi/100:pi;
x1=sin(3*t).*cos(t);
y1=sin(9*t).*sin(t);
subplot(1,2,2);
scatter(x1,y1,10);
title('x1=sin(3*t).*cos(t),y1=sin(9*t).*sin(t)');
\3. 78页第3题
clc;
clear;
x=1:100;
y=sin(1./x);
subplot(1,2,1);
plot(x,y);
subplot(1,2,2);
fplot('sin(1/x)',[1,100]);
第四章 线性代数中的数值计算
\1. 特殊矩阵有哪两类?分别举例加以说明。
答:通用特殊矩阵:零矩阵、幺矩阵、单位矩阵等,
面向特定应用的特殊矩阵:希耳伯特矩阵、范德伦矩阵、帕斯卡。
\2. 104页第三题
clc;
clear;
A=[31,1,0;-4,-1,0;4,-8,-2];
[V,D]=eig(A);
V
D
\3. 104页第四题
clc;
clear;
A=[2,-1,0,0,0,;-1,2,-1,0,0;0,-1,2,-1,0;0,0,-1,2,-1;0,0,0,-1,2]
b=[1,0,0,0,0]';
tic
x1=inv(A)*b;
toc
tic
x2=A\b;
toc
tic
[L,U]=lu(A);
x3=U\(L\b);
toc
第六章 数值微积分与常微分方程求解
\1. 134页第5题
(1) yp=inline('-(1.2+sin(10*x))*y');
[t,y]=ode23(yp,[0,5],1);
\2. 求出该系统的频率响应并画出频率特性?
clc;
clear all;
B=[3 6 9];A=[2 4 6 8];
w=linspace(0,10);
BB=polyval(B, j*w);
AA=polyval(A, j*w);
subplot(2,2,1);
plot(w,abs(BB ./ AA));
subplot(2,2,3);
plot(w,angle(BB ./ AA));
w1=logspace(-1,1);
B1=polyval(B,j*w1);
A1=polyval(A,j*w1);
subplot(2,2,2);
semilogx(w1,abs(B1./A1));
subplot(2,2,4);
semilogx(w1,angle(B1./A1));
第七章 符号计算
\1. MATLAB提供了两个建立符号对象的函数:sym和syms.
\2. 试比较下列表达式的数值计算和符号计算结果有何不同?如何将符号计算结果转换为数值计算结果?
(1) 1+1/2 (2)(1+x^(1/2))/2
\3. 148页第1题
clc;
clear;
syms x y z;
a=[1,2,3;x,y,z;3,2,1]
rank(a)
inv(a)
det(a)
第八章 图形句柄
MATLAB的图形对象包括图形窗口、坐标轴、用户界面、曲线、曲面、文字、图像等。
低层绘图操作的基本思路是什么?他同高层绘图操作相比有何特点?
第九章 图形用户界面设计
\1. 什么是图形用户界面?它有何特点?
图形用户界面(GUI)是指由窗口、菜单、图标、光标、按键、对话框和文本等各种图形对象组成的用户界面。它让用户定制用户与Matlab的交互方式,而命令窗口不是唯一与Matlab的交互方式。
\2. 在MATLAB应用程序的用户界面中,常用的控件有哪些?各有什么作用?
MATLAB的用户界面设计工具有多个,常用的有图形用户界面设计窗口、对象属性查看器、菜单编辑器、位置调整工具、Tab顺序编辑器、工具栏编辑器、对象浏览器、M文件编辑器等。
\3. 在MATLAB中,GUI的设计方式有哪两种?各有何特点?
GUI的设计方式有以下两种:通过使用MATLAB提供的图形用户界面工具来创建GUI;
使用M文件创建GUI。
第十章 Simulink仿真环境
\1. Simulink的主要功能是什么?应用Simulink进行系统仿真的主要步骤有哪些?
用于对动态系统进行建模和仿真。
仿真步骤:(1)建立系统仿真模型,包括添加模块、设置模块参数、进行模块连接等操作。
(2)设置仿真参数
(3)启动仿真并分析仿真结果
\2. 如何建立Simulink仿真模型?
\3. 在Simulink中有哪些求解微分方程的算法
利用微分积分器直接构造求解微分方程
利用传递函数模块建模
利用状态方程建模
建立一个字符串向量,然后对该向量做如下处理。
(1)取第12~18个字符组成的子字符串。
(2)将字符串中的小写字母变成相应的大写字母,其余字符不变。
(3)统计字符串中小写字母的个数。
ch='welcome to beijing';
subch=ch(12:18); %取子字符串
k=find(ch>='a'&ch<='z'); %找小写字母的位置
%将小写字母变成相应的大写字母
ch(k)=ch(k)-('a'-'a');
char(ch)
length(k) %统计小写字母的个数
运行结果:ans =
16
编写一个双音频程序,显示某个键的波形:
% 产生一个双音频
clc;
clear;
fs=8000;t=(0:1/fs:0.2);
f1=697;f2=1209; %键1对应的两个频率
y=sin(2*pi*f1*t)+sin(2*pi*f2*t);
plot(t,y);
wavplay(y, fs)
从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
程序如下:
sum=0;
cnt=0;
val=input('enter a number (end in 0):');
while (val~=0)
sum=sum+val;
cnt=cnt+1;
val=input('enter a number (end in 0):');
end
if (cnt > 0)
sum
mean=sum/cnt
end
输出100到200之间第一个能被7整除的数
for i=100:200
if rem(i,7)~=0
continue
end
break
end
i
若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。
for m=1:500
s=0;
for k=1:m/2
if rem(m,k)==0
s=s+k;
end
end
if m==s
disp(m);
end
end