matlab基础学习
第一节课
变量命名和基础
+-*/ ……(构成算式,只有几个难点就是
【括号成对使用】
和exp()【就是指数】
和log等价ln
【而ln在matlab中压根不承认】)(要注意a^1/2是错的 对的指的是a^0.5
)变量(开头不能是数字,开头只能是字母),变量构成可以用下划线
keyword(不能用作变量)可以使用命令iskeyword
- Inf 无限大
- eps: 2.2204e-16 非常小的一个数据在数学上
- ans :answer
- 复数 i j
- pi
- NaN 不是数字
调取变量,或者又称引用变量
就是先变量赋值给字符串,用‘’ 赋值,取用的时候就是variable(num),如果想要清除工作台的变脸就是使用clear variable {要小心 ,因为clear 会清除全部变量,而clc是清楚你写的过程,但是变量不会消除}
- 变量字节显示问题
format + ?(long short longE shortE )【特别注意format+rat 就是用分数表示结果】
显示格式 说明 例子 short 短定点格式.显示小数点后4位 3.1416 long 长定点格式.对 double
类型变量显示小数点后15位,对float
类型变量显示小数点后7位.3.141592653589793 shortE 短科学计数法,显示小数点后4位.并带有科学计数法标记. 3.1416e+00 longE 长科学计数法.对 double
类型变量显示小数点后15位,对float
类型变量显示小数点后7位.并带有科学计数法标记.3.141592653589793e+00 bank 银行格式.显示小数点后2位. 3.14 hex 十六进制格式. 400921fb54442d18 rat 比例格式 355/113 程序书写时要加; (这个分号代表的就是告诉matlab不要直接出结果),便于写程序
矩阵
口诀
书写矩阵用[ ] 调用元素用()
- 输入矩阵 a=[1 2 3 4] 核心就是明白中括号就是矩阵 同时这也是行矩阵(同时也可以不使用space 而是使用逗号 但是看的会眼花缭乱)
a=[1;2;3] 列矩阵
矩阵中元素的调用(调用的时候注意 , 而且注意A()不管那种调用方法 这个开头的括号是定死的)
A(行数,列数) 就可以获得矩阵某个位置的元素
A([a b],[a b])就是代表第a行与第b行和第a列于第b列的交集元素构成的矩阵
A(num) 其中这个num是按照先第一列再到第二列,以此类推得到的,就是数数
A([a b])第一个显示第a位置上的元素,第二个显示第b位置上的元素,同理A([a b;a b])就是会显示矩阵 第一行就是A([a b]) ,第二行也是它,排列成两行两列的矩阵
- 矩阵合并就是A=[a b] 就是把啊a和b矩阵从左到右直接书写 (可以把space换成逗号) 如果A=[a;b]就是从上到下进行排列 增广矩阵
补充
改变矩阵某个位置的元素 其实就是调用之后直接赋值
矩阵书写的技巧(等差级数的输入)
例如A=[a:c:b] (同时可以写做 A=(a:c:b))
为了保持构建矩阵的连贯性 也就是说建议使用A=(a:c:b)就是从a到b 等差是c
没有书写c 就默认c是1
同时注意a 和b也可以是 *字符*(字符是’’代表的哦 千万别少写)
:这个符号代表全部的意思,比如a(3,:)就是调取第三行的全部元素 也就是是个行矩阵
如果让某个行/列=[] 就代表此行/列消失 delete
矩阵的计算(参考线性代数)
矩阵与矩阵的运算
注意就是.*和 *的区别(你在书写函数fuction的时候,因为c语言不涉及矩阵,所以你可能用 * 来表示公式中的乘法,但是你要注意matlab是矩阵实验室,如果你用乘就直接报错,所以注意.*的使用)==同时./和这个一样== 计算乘法时应尽量使用
.*
而非*
,因为前者不仅对参数t
为标量的情况可用,也对变量t
为向量或矩阵的情况可用.
.* 是对应位置相乘
*得用线性代数的方法去计算
/ 是要用逆矩阵的方式去计算
运算符 操作 形式 例子 + 矩阵与实数相加 A+b [6 3] + 2 = [8 5] - 矩阵与实数相减 A-b [6 3] - 2 = [4 1] + 矩阵与矩阵对应位置相加 A+B [6 3] + [4 8] = [10 11] - 矩阵与矩阵对应位置相减 A-B [6 3] - [4 8] = [2 -5] * 矩阵与矩阵相乘 A*B [6 3] * [4 8]’ = 48 .* 矩阵与矩阵对应位置相乘 A.*B [6 3] * [4 8] = [24 24] / 矩阵与矩阵右除(等价于 A*inv(B)
)A/B [6 3] / [4 8] = 0.6 \ 矩阵与矩阵左除(等价于 inv(A)*B
)A\B [6 3] / [4 8] = [0.06667 1.3333; 0 0] ./ 矩阵与矩阵对应位置右除 A./B [6 3] ./ [4 8] = [1.5 0.375] .\ 矩阵与矩阵对应位置左除 A.\B [6 3] .\ [4 8] = [0.6667 2.6667] ^ 矩阵与向量乘方 A^b [1 2; 3 4]^3 = [37 54; 81 118] .^ 矩阵与矩阵对应位置乘方 A.^B [1 2; 3 4].^[1 2; 3 4] = [1 4; 27 256] 矩阵与实数的运算
- a+b (其中a是矩阵,b是实数 那么就是代表a矩阵的每个元素都要加b)
- a^b 代表a*a…. (b个a相乘)
- a.^b 代表矩阵中每个元素都要b次方
- a/b和a./b一致 都是针对每个元素 同理a.*b和 a *b一致
矩阵转置
a‘
特殊矩阵
eye矩阵(对角线上为1 其他元素都是0)单位矩阵
zeros(a,b)代表a行b列的0矩阵 其中zeros(a) 表示一行a列的向量
diag矩阵 diag([1 2 3])对角线为1 2 3 其他地方都是0
ones(a,b)得到a*b全1矩阵
)
matlab中矩阵的函数
- max(A)每个列最大的数字显示出来 成为一个行矩阵
- max(max(A))就是整个矩阵中最大的数字
- min(A) ……
- sum(A),每个列数字的求和组成一个行矩阵
- mean(A)….的平均….
- sort(A)每一列大小重新排序(从小排到大)
- sortrows(A)就是矩阵的行按照第一列的大小重新排列(不用管其他列的大小排序)
- size(A) 第一个数字表示行数 第二个数字表示列数 (同时注意维的内涵:向量维数是列,因为向量的坐标只有一行,列数表示它的维数。例如(a,b,c)这就是一个三维向量,)
- size(A,n) 如果在 size 函数的输入参数中再添加一项 n,并用 1 或 2 为 n 赋值,则 size 将返回矩阵的行数或列数。其中 r=size(A,1) 该语句返回的时矩阵 A 的行数, c=size(A,2) 该语句返回的时矩阵 A 的列数。
find(A==num)告诉我们num所在位置的编号 ,所以也就可以通过它来调用元素,
比如说a(find(A == num))=[] 也就是表示数值大小为num的数据就会消失
但是不能直接作用于矩阵,可以说只能作用为向量(行矩阵/列矩阵)
矩阵 向量 数组
在向量( Vector )中,我们介绍了向量( Vector )的两个不同于数组的特性,一个是动态扩容 ==非常花时间,所以我建议先a=zeros(n1,n2,)节省matlab运算时间== ,还有一个是向量中可以放不同的数据类型,这对比数组极大的方便了我们日常的使用。而c语言使用数组,前提是规定所占内存的大小,而matlab是高阶编程语言,所以不需要定义,于是在matlab中只有向量和矩阵,同时在我的认识:向量(行矩阵/列矩阵),【向量是由 n 个有序的数所组成的数组】而矩阵是a行b列的,a和b就是两个数字,本身并无关系。
脚本的书写 .m
常用技巧
%在matlab中代表注解,就是说计算机不识别
注意最快的办法就是==ctrl+r== 注释掉某行
==ctrl+t==撤销某行的注释
%%代表将某部分变成结 然后用==run section== 就单独这一部分进行程序执行,来排除bug
点击某一行就会出现红点 (这代表到红点就不会继续run 然后你只能用continue)通过这个调试方法来确定那一步错了,通过和自己脑中的逻辑数字相比
==ctrl+c== 可以帮助你从 正忙(busy)中直接跳出
写脚本的时候最核心的思想是引入变量 比如n和i等等
编写脚本的常用指令
(每个区块都要加一个end)
同时注意matlab有一个问题就是for语句在书写脚本的时候 ,由于matlab会储存变量的值(通过工作台可以看见),for语句的赋值不能改变原有的值 ,所以使用for语句注意clear+变量if elseif else(和c语言一样)
for
执行子句固定次数
while 重复执行子句直到
while
中的条件为假switch case(与c语言不一样) 注意这个代码是不能直接复制的
input_num=1;
switch input_num
case -1
disp('negative 1');
case 0
disp('zero');
case 1
disp('positive 1');
otherwise
disp('other value');
endbreak 防止程序宕机 就是和while连用
continue
end
pause
return
matlab中的逻辑判断语句
注意就是
等于 ==
不等于~= (在c语言中这个是!=)
或 &&
且||
matlab中常用函数
rem(a,b)表示a/b的余数是几
disp(’’)显示括号内的东西
prod(1:n) 表示n的阶乘
tic (放在脚本最开始)… toc (放在脚本最后面) :作用是计算程序运行的时间
rand(a,b)表示会生成a行b列元素的矩阵 ,同时rand(a)表示生成a行a列的方阵 ==rand(size(a))会生成与a矩阵同样规格的矩阵==
strcmp(a,b) 比较a和b,如果两者相同,则返回1,否则返回0,输入参数可以死字符串数组 字符向量 和字符向量元胞数组的任何组合
y=length(x)函数计算向量或者矩阵的长度y(也就是矩阵的列数)
y=reverse(‘x’) 就是会输出x完全相反的字符串
linspace是Matlab中的一个指令,用于产生x1,x2之间的N点行矢量。其中x1、x2、N分别为起始值、中止值、元素个数 补充 linspace(x1,x2)表示从x1到x2等间距的100个点
C = power(A,B)
是执行A.^B
的替代方法,他的优势就是在于b可以是变量,也就是和for连用c = lines
以一个三列数组的形式返回线条颜色图,就代表三种不同的颜色 其中c = lines(m)
返回包含m
种颜色的颜色图。
第二节课
函数
基础格式
function [输出变量名] = 函数名(输入变量名)
% 函数的文档(注释)
code(代码 ,来完成你要的功能)
function
是一个关键字,声明该文件中保存的是一个函数.输入变量
和输出变量
是非必须的,函数既可以没有输入变量,也可以没有输出变量.函数名
应与.m
文件名相同,且不包含特殊字符(最好不要有中文).
以函数句柄形式定义函数
我们也可以使用函数句柄的形式定义函数,这更接近数学上的函数定义,其语法如下:
函数句柄 = @(输入变量) 输出变量
f = @(x) exp(-2*x);%这个后面的输出变量其实又是另一个函数,不过自带的 |
变量大全
- 变量包括
逻辑字符(logical)
char
numeric
cell
struct
logical 就是> <…. 得到的数值就是1/0
- 其中numeric 包括基础四种`inta(有符号整数)` `uinta(无符号整数)` `single(单精度)` `double(双精度)` ==注意其中的a就是储存的字节大小(a=8 16 32 64)==
例如b=int8(20) 就是代表20这个数据被储存在8字节中 变量名字叫做b
- char(在matlab中全部用字符串 就不会错)
和c语言一样 ASCLL码 只要注意 string **’’ ** 表示字符串就行,千万注意大部分一样,而其中有些部分并不一致,比如说c语言是没办法搞string 只能借用数组,但是matlab是高级程序语言,所以可以直接玩
同时注意 有个小 tip(提示)
例如 str=’apple’
str(str==’a’)=’z’
这时候变成zpple 因为中间的str==’a’ 就是会获得1 0 0 0 0 这个结论
- struct
在MATLAB中,结构体是一个存储{键. 值}
的数据结构,这个键就是此结构体的名字(student(num)就可以建立更多的结构体)这个值就是一个结构体中的field ==文件夹的思路==
- 建立基础的结构体
student.name = 'John Doe'; |
- 结构体中的操作函数
- rmfiled(student ,’id’) 删除结构体student中id这个field
- filednames(name)显示结构体所有field的名字
- isfield(student,’id’)判断id是否为结构体的一个field
- getfield(student,’id’)直接获取这个field 的值
- cell (元胞数组)
cell的概念就是构成特殊的矩阵,矩阵的每一部分不一定都是数字,可以一部分是矩阵,一部分是字符串 一部分是复数 还有一部分是向量 (其实就是构成四部分)
cell建成方式是
A = { [1 4 3; 0 5 8; 7 2 9] 'Anne Smith' ;... |
A{1,1}=[1 4 3; 0 5 8; 7 2 9]; |
注意
引用的方式和矩阵一模一样 a(1,1) 但是只是表示其是什么数据类型
a{1,1} 可以直接告诉你这个cell是什么样子的
cell中的操作函数
操作函数 | 作用 |
---|---|
cell2mat | 将元胞数组转为矩阵 |
cell2struct | 将元胞数组转为结构体 |
mat2cell | 将数组转换为指定大小元胞数组 |
num2cell | 将数组转换为相同大小的元胞数组 |
### 高维元胞数组
概念 就是除了行和列以外还有层 就是三个要素构成的立方体
可以使用cat
函数可以在指定维度上对元胞数组进行拼接.例如cat(1,a,b)直接让元胞数组按行的方式拼接,如果是2就是按列,3–层
问题
cell 矩阵 struct 这几个变量转换的内涵和理解?
第三节课
图线的绘制与装饰
使用plot()
函数绘制图线
在MATLAB中,使用plot()
函数绘制图线,其语法为:
plot(x,y,LineSpec) |
例如==plot(x,y,’r.-‘)== 同时 注意plot函数如果连续使用,matlab只会显示最后的,前面全部被擦除,除非用1 函数hold on(放最前)和hold off(放最后),此函数可以让matlab保留所有图 2 连在一起写
就是说
hold on |
各参数意义如下:
x
: 图线上点的x坐标y
: 图线上点的y坐标LineSpec
: 图线的线条设定,三个指定1 线型,2 标记符号和3 颜色的设定符组成一个字符串,设定符不区分先后
线型设定符 | 线型 | 标记设定符 | 标记 | 颜色设定符 | 颜色 |
---|---|---|---|---|---|
- |
实线(默认) | o |
圆圈 | y |
黄色 |
-- |
虚线 | + |
加号 | m |
品红色 |
: |
点线 | * |
星号 | c |
青蓝色 |
-. |
点划线 | . |
点 | r |
红色 |
x |
叉号 | g |
绿色 | ||
s |
方形 | b |
蓝色 | ||
d |
菱形 | w |
白色 | ||
^ |
上三角 | k |
黑色 | ||
v |
下三角 | ||||
> |
右三角 | ||||
装饰图线
以下函数语句一定要放在plot函数后面,否则会报错
使用
legend()
函数为图片增加图例使用
legend(label1, ..., labelN)
函数可以为图片添加图例例如
legend('sin(x)','cos(x)','Sigmoid','Gauss function'); % 添加图例.
使用
title()
和label()
为图片增加标题和标签xlabel('t = 0 to 2\pi');
ylabel('values of sin(t) and e^{-x}');
title('Function Plots of sin(t) and e^{-x}');使用
text()
和annotation()
(这个中文意思就是创造标注)为图片增加注解 (注意 latex语句要放在text前面) 这个annotation特别像vb中的属性一样
x = linspace(0,3); y = x.^2.*sin(x); plot(x,y); |
补充 dim— 尺寸和位置
尺寸和位置,指定为 [x y w h]
形式的四元素向量。前两个元素指定文本框、矩形或椭圆的左下角相对于图窗左下角的坐标。后两个元素分别指定注释的宽度和高度。xywh都得在0和1之间 就是占比
图像调整
核心就是句柄 (图形句柄本质上就是一个浮点数,可以唯一确定一个图形对象.)
如何找到相应属性的句柄?
fuction | purpose |
---|---|
gca |
获取当前坐标轴的句柄(对图像中的某一部分进行调整) |
gcf |
获取当前图像的句柄(主要调整整个坐标轴) |
allchild(handle_list) |
获取该对象的所有子对象的句柄 |
ancestor(h,type) |
获取对象最近的type 类型的祖先节点 |
delete(h) |
删除某对象 |
findall(handle_list) |
获取该对象的后代对象 |
注意
如果你使用figure会出现很多图,但是gca和gcf只针对最近的图片,剩下他不管
通过图形句柄操作图形属性
使用get()
(其实和whos差不多 只是返回的对象是figure 返回的值是属性)和set()
函数可以对图形对象的属性进行访问和修改.访问官方文档可以查看所有图形对象的属性.
set(H,Name,Value)
v = get(h,propertyName)
例子
|
tips 改变线形(不过我推荐,你在画图的时候就直接写代码,不用后期修改了)
h = plot(x,y); |
改变图像位置和大小
figure(‘position’,[left,bottom,width,height])
控制坐标轴,边框与网格
使用下列命令可以控制坐标轴,边框与网格.
命令 | 作用 |
---|---|
grid on/off |
设置网格可见性 |
box on/off |
设置边框可见性 |
axis on/off |
设置坐标轴可见性 |
axis normal |
还原默认行为,将图框纵横比模式和数据纵横比模式的属性设置为自动 |
axis square |
使用相同长度的坐标轴线,相应调整数据单位之间的增量 |
axis equal |
沿每个坐标轴使用相同的数据单位长度 |
axis tight |
将坐标轴范围设置为等同于数据范围,使轴框紧密围绕数据 |
下面的例子演示axis命令的效果:
t = 0:0.1:2*pi; x = 3*cos(t); y = sin(t); |
在一个窗口内绘制多个图像
使用subplot()函数可以在一个窗口内绘制多个图像.其语法为:
subplot(m,n,p)
该命令表示将当前图窗划分为m×n个网格,并在第p个网格内绘制图像.
示例如下:
subplot(2,2,1); |
绘制高级图形
二维图标
折线图
函数 | 图形描述 |
---|---|
loglog() |
x轴和y轴都取对数坐标 |
semilogx() |
x轴取对数坐标,y轴取线性坐标 |
semilogy() |
x轴取线性坐标,y轴取对数坐标 |
plotyy() |
带有两套y坐标轴的线性坐标系 |
ploar() |
极坐标系 |
对数坐标系图线
x = logspace(-1,1,100);%从10的-1次方到10的1次方 随机选取100个点
y = x.^2; 就是从10的-2次饭到10的2次方,也随机选取100个点
subplot(2,2,1);
plot(x,y);
title('Plot');
subplot(2,2,2);
semilogx(x,y);
title('Semilogx');
subplot(2,2,3);
semilogy(x,y);
title('Semilogy');
subplot(2,2,4);
loglog(x, y);
title('Loglog');
set(gca,'xGrid','on');双y轴图线
plotyy()
的返回值为数组[ax,hlines1,hlines2]
,其中:
ax
为一个向量,保存两个坐标系对象的句柄.hlines1
和hlines2
分别为两个图线的句柄.
x = 0:0.01:20; |
- 极坐标图线
polar(角度,半径函数)
% 螺旋线 |
统计图表
注意 如果想为统计图标中的某一给进行上色,就不能像之前一样直接对图线进行上色,办法就是用set(h(num),‘属性’,‘描述’)而且还要明白描述 如果是数字,或者是rgb显示色[r g b]都不用加 **’’ **
函数 | 图形描述 |
---|---|
hist() |
直方图 |
bar() |
二维柱状图 |
pie() |
饼图 |
stairs() |
阶梯图 |
stem() |
针状图 |
直方图
使用
hist()
绘制直方图,语法如下:hist(x,nbins) %x表示原始数据(这个需要先设定 比如randn)
% nbins表示分组的个数x = randn(1,1000); subplot(2,1,1); hist(x,10); title('Bins = 10'); subplot(2,1,2); hist(x,50); title('Bins = 50');
2. 柱状图
1. 使用`bar()`和`bar3()`函数分别绘制二维和三维直方图
注意就是bar(1:5,[a' b' c'])表示的就是一共五个柱状图 每个用空格隔开,序号是1到5 ,每个柱状图都是由abc 三个矩阵的元素构成,例如第一个图就是a的第一个元素和b的第一个元素和c的第一个元素,
其实 **’**代表的就是转置 和前面的构成矩阵,就是表明分别显示第一行然后以此类推
2. ```matlab
x = [1 2 5 4 8]; y = [x;1:5];%其中y是矩阵
subplot(1,3,1); bar(x); title('A bargraph of vector x');
subplot(1,3,2); bar(y); title('A bargraph of vector y');%会分别显示第一行和第二行,两组数据在图像中通过空格隔开
subplot(1,3,3); bar3(y); title('A 3D bargraph');
%三维的就是会把矩阵的每一行都三维显示,看长宽高就能知道矩阵是什么
hist
主要用于查看变量的频率分布(就是看数据的分布情况),而bar
主要用于查看分立的量的统计结果(数据的结果).使用
barh()
函数可以绘制纵向排列的柱状图x = [1 2 5 4 8];
y = [x;1:5];
barh(y);
title('Horizontal');向
bar()
传入'stack'
参数可以让柱状图以堆栈的形式画出.(其实就是堆叠在一起,看含量的多少)x = [1 2 5 4 8];
y = [x;1:5];
bar(y,'stacked');
title('Stacked');
饼图
使用
pie()
和pie3()
可以绘制二维和三维的饼图.向其传入一个bool向量表示每一部分扇区是否偏移.a = [10 5 20 30];
subplot(1,3,1); pie(a);%四个数据互相的占比,默认会把数据变成整数
subplot(1,3,2); pie(a, [0,0,0,1]);%第四个数据与其他数据割裂开
subplot(1,3,3); pie3(a, [0,0,0,1]);%三维下的图形
阶梯图和针状图:绘制离散数字序列
stairs()
和stem()
函数分别用来绘制阶梯图和针状图,用于表示离散数字序列.x = linspace(0, 4*pi, 40); y = sin(x);
subplot(1,2,1); stairs(y);%在画图的时候,我们总是会把点用光滑的曲线,或者直线连起来,但是stairs是阶梯的意思,也就是说把点用阶梯连接起来,基础的轮廓没有改变,但是表达图形并不相同
subplot(1,2,2); stem(y);%stem画图就是就是离散图,每个点之间并不连续,用一根根针来表示其离散特性(取样特性)
其他统计图表
boxplot() 箱线图 没理解这个图的内涵 有机会在理解
load carsmall
boxplot(MPG, Origin);errorbar() 含误差条的线图
x=0:pi/10:pi; y=sin(x);
e=std(y)*ones(size(x));%std是标准差
errorbar(x,y,e)%e中的值确定 ==数据点== 上方和下方的每个误差条的长度 因此,总误差条长度是 e 值的两倍
绘制图形
MATLAB也可以绘制简单的图形,使用fill()
函数可以对区域进行填充. 其中fill(x,y)和plot(x,y)的区别是前者不仅能把点连起来,还能线构成封闭曲面涂上特定的颜色,而后者只能把点练成线。
t =(1:2:15)'*pi/8;%分析八边形每个点的所占角度的规律 发现是等差数列 |
补充 text()函数的使用
text(a,b,’所要标识的语言文字/==变量==’,‘属性’,‘描述’,…)变量你可以让他包含一切,包括latex代码 a和b是位置 其中注意描述针对颜色的时候是字符串 针对尺寸的时候是数字(多少磅)
三维图表
二维图与三维图之间的关系
surf函数
surf(x,y,z)创建三维曲面图,该函数将矩阵z的值绘制为由x和y定义的x-y平面中网格上方的高度。曲面的颜色根据z指定的高度而变化,同时surf(a,name,value)使用一个或者多个名称来指定曲面的属性
二维图转化为三维图
在MATLAB中,所有的图都是三维图,二维图只不过是三维图的一个投影.点击图形窗口的
Rotate 3D
按钮,即可通过鼠标拖拽查看该图形的三维视图.- 三维图转化为二维图
使用imagesc()
函数可以将三维图转换为二维俯视图,通过点的颜色指示高度.
[x, y] = meshgrid(-3:.2:3,-3:.2:3); |
使用colorbar
命令可以在生成的二维图上增加颜色与高度间对应关系的图例,使用colormap
命令可以改变配色方案,最关键的就是这给可以自定义 (注意 colormap返回的是矩阵==64行三列==,你只要知道那个三列代表的是rgb就行,你64行你不用管,只要知道代表特定颜色就行)
接下来介绍如何自定义
通过定义一个由介于 0.0 和 1.0 之间的值组成的三列矩阵来创建一个自定义颜色图。每行定义一个三元素 RGB 三元组。第一列指定红色强度。第二列指定绿色强度。第三列指定蓝色强度。
通过将前两个列设置为零来使用蓝色值的颜色图。
map = [0 0 0.3 |
三维图的绘制
绘制三维图前的准备工作
绘制三维图前的准备工作:使用meshgrid()生成二维网格
我们对一个二维网格矩阵应用函数z = f ( x , y ) z=f(x,y)z=f(x,y)才能得到三维图形,因此在得到三维数据之前我们应当使用meshgrid()函数生成二维网格矩阵.meshgrid()函数将输入的两个向量进行相应的行扩充和列扩充以得到两个增广矩阵,对该矩阵可应用二元函数
x = -2:1:2;
y = -2:1:2;
[X,Y] = meshgrid(x,y)%x就是写作[-2 -1 0 1 2] 而y会写作[-2;-1;0;1;2] 然后进行行扩充和列扩充以达到满足x列y行的矩阵(二维网格矩阵)
Z = X.^2 + Y.^2我们得到了生成的二维网格矩阵如下:
X =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
Y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
Z =
8 5 4 5 8
5 2 1 2 5
4 1 0 1 4
5 2 1 2 5
8 5 4 5 8绘制三维线(和网格没关系,也就不需要meshgrid,对matlab来说画三维线图就是把每个点连起来)
使用
plot3()
函数即可绘制三维线,输入应为三个向量.x=0:0.1:3*pi;
z1=sin(x);
z2=sin(2.*x);
z3=sin(3.*x);
y1=zeros(size(x));
y3=ones(size(x));
y2=y3./2;
plot3(x,y1,z1,'r',x,y2,z2,'b',x,y3,z3,'g'); grid on;
xlabel('x-axis'); ylabel('y-axis'); zlabel('z-axis');螺旋线
subplot(1, 2, 1)
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
grid on; axis square;subplot(1, 2, 2)
turns = 40*pi;
t = linspace(0,turns,4000);
x = cos(t).*(turns-t)./turns;
y = sin(t).*(turns-t)./turns;
z = t./turns;
plot3(x,y,z); grid on;绘制三维面
使用
mesh()
和surf()
命令可以绘制三维面,前者不会填充网格而后者会.x = -3.5:0.2:3.5; y = -3.5:0.2:3.5;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
subplot(1,2,1); mesh(X,Y,Z);
subplot(1,2,2); surf(X,Y,Z);绘制三维图形的==等高线==(地理上学的那个)
使用
contour()
和contourf()
函数可以绘制三维图形的等高线,前者不会填充网格而后者会.x = -3.5:0.2:3.5;
y = -3.5:0.2:3.5;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
subplot(1,2,1);
mesh(X,Y,Z); axis square;
subplot(1,2,2);
contour(X,Y,Z); axis square;向
contour()
函数传入参数或操作图形句柄可以改变图像的细节:subplot(1,3,1); contour(Z,[-.45:.05:.45]); axis square;
subplot(1,3,2); [C,h] = contour(Z); clabel(C,h); axis square;
subplot(1,3,3); contourf(Z); axis square;使用
meshc()
和surfc()
函数可以在绘制三维图形时绘制其等高线subplot(1,2,1); meshc(X,Y,Z);
subplot(1,2,2); surfc(X,Y,Z);绘制三维体
使用patch()
函数可以绘制三维体.(多面体)
v = [0 0 0; 1 0 0 ; 1 1 0; 0 1 0; 0.25 0.25 1; 0.75 0.25 1; 0.75 0.75 1; 0.25 0.75 1]; |
三维图的视角和打光
调整视角
使用view()
函数可以调整视角,view()
函数接受两个浮点型参数,分别表示两个==方位角==azimuth
和elevation
.(其中一个是仰角一个是弧度对应的角度)
sphere(50); |
调整打光
使用light()
函数可以对三维图形进行打光,并返回光源的句柄.
[X, Y, Z] = sphere(64); h = surf(X, Y, Z); |
通过对光源的句柄进行操作可以修改光源的属性(如果你不用句柄的话,matlab会再弄一个光往物体上照)
set(L1, 'Position', [-1, -1, 1]); |
第四节课
多项式的数值运算
matlab表示多项式
使用向量表示多项式
在MATLAB中,多项式可以用向量表示,向量中的元素为多项式的==系数==(降幂排序):第一位为多项式最高次项系数,最后一位为常数项.
例如多项式:
f ( x ) = x^3 − 2 x − 5可以用向量p=[1 0 -2 -5]表示.(因为式子里没有x^2,所以系数为0)
多项式的数值运算
- 用
polyval()
来进行多项式的求值运算
使用polyval(p, x)
可以计算多项式p
在x
的每个点处的值.
a = [9,-5,3,7]; x = -2:0.01:5; |
小问题?
如果把a变成[9 5 3 7]那么代码能跑的起来吗
- 多项式的微分运算
polyder(p)
使用polyder(p)
函数来计算多项式的导数
例如对下面多项式求导:
f(x) = 5x^4 - 2x^2 + 1
p = polyder([5 0 -2 0 1]);
得到p = [20 0 -4 0] 所以这个如果和上面的polyval结合就知道在特定点的导数为多少
多项式的乘法运算
conv()
使用
conv(p1, p2)
函数可以对两个向量p1
和p2
进行卷积相乘,用于计算多项式的乘法. (结论:==由于多项式乘法与卷积的运算规则一样(翻转平移叠加求和),所以我们可以用卷积的方法来实现多项式乘法==) 例如
f(x)=(x^2+1)(2x+7) 可以使用
conv()
函数得到展开后的多项式 p = conv([1 0 1], [2 7])
得到
p = [2 7 2 7]
.多项式的积分
polyint()
使用
polyint(p,k)
函数可以计算多项式p的积分,积分结果的常数项设为k例如
f(x)=5x^4− 2x^2+1
p = polyint([5 0 -2 0 1], 3)
得到得到
p = [1 0 -0.6667 0 1 3]
多项式的因式分解
roots()
使用
roots(p)
函数可以对多项式p
进行因式分解,即求表达式值为0的根.
非线性表达式的数值运算
提要:在前面我们学习的运算都是针对多项式,那么也就以为着除了多项式,我们甚至连sin,cos这种的三角函数的积分和微分也做不出来,所以就要引入非线性表达式的数值运算
求差分和近似导数
diff()
使用
diff(x,n)
计算向量x的n阶差分(在做过一次差分的基础上再做一次,也就是说假设一共a列向量,那么n阶差分对他的影响就是使得他变成(a-n)列向量) ,n默认为1 同时这个函数还可以针对矩阵,也就是说相邻两行数据做差,也就会导致变成(n-1)行矩阵x = [1 2 5 2 1];
diff(x); % 得到 [1 3 -3 -1] 其实就是相邻数据做差,也就是比较
diff(x,1); % 得到 [1 3 -3 -1]
diff(x,2); % 得到 [2 -6 2]求导数
diff(y)./diff(x)
- 这个式子的由来就是导数的定义,所以用处就是计算函数在某点的近似导数
x0 = pi/2;
h = 0.1;
x = [x0 x0+h];
y = [sin(x0) sin(x0+h)];
m = diff(y)./diff(x) % 得到 m = -0.005 由数学结论可以得到h的取值越小,得到的近似导数越精确
呢有个小思考 这样只能算到某个点的导数 呢如果x是0<x<pi 呢是不是就是同样的道理来书写代码
下面程序计算
f ( x ) = x ^3的一阶和二阶导数的值.
x = -2:0.005:2; y = x.^3;
m = diff(y)./diff(x); % 计算一阶导数
m2 = diff(m)./diff(x(1:end-1)); % 计算二阶导数 -1是因为常数项没了
plot(x,y,x(1:end-1),m,x(1:end-2),m2);%end同时代表最后一个数字
xlabel('x'); ylabel('y');
legend('f(x) =x^3','f''(x)','f''''(x)', 4);数值积分
数值积分的原理
有三种常见算法用于计算数值积分: 矩形法,梯形法,抛物线法,它们分别把微分区间的图形视为矩形,梯形,抛物线以计算面积.下面分别使用三种方法计算f ( x ) = 4x^3 在区间(0,2)内的积分
h = 0.05; x = 0:h:2;
y = 4*midpoint.^3;
% 使用矩形法计算近似积分
midpoint = (x(1:end-1)+x(2:end))./2;
s = sum(h*y) % 得到 15.9950
% 使用梯形法计算近似积分
trapezoid = (y(1:end-1)+y(2:end))/2;
s = h*sum(trapezoid) % 得到 15.2246
% 使用抛物线法计算数值积分
s = h/3*(y(1)+2*sum(y(3:2:end-2))+4*sum(y(2:2:end))+y(end)) % 得到 15.8240数值积分函数
integral()
integral()
,integral2()
,integral3()
分别对函数在xmin
至xmax
间 进行一重,二重,三重积分.
它们的第一个参数都应该是一个函数句柄,下面例子演示他们的用法:
计算
$$
\nexists\int_{0}^{2}{\frac{1}{x^{3}-2x-5}}
$$
f = @(x) 1./(x.^3-2*x-5);%前面的符号不要管 出现的乱码 ./后面的是f关于x的方程 |
同时 我们应该也学会二重积分integral2()
$$
\int_{0}^{\pi}\int_{\pi}^{2\pi}(\mathbf{y}\sin(\mathbf{x})+\mathbf{x}\cos(\mathbf{y}))\mathrm{dxdy}
$$
f = @(x,y) y.*sin(x)+x.*cos(y);%依旧是句柄加自变量,当然重积分的自变量不可能是一个,然后写f的表达式 |
这时 我们也可以触及到三重积分integra13()
$$
\int_{-1}^{1}\int_{0}^{1}\int_{0}^{\pi}(\mathbf{y}\sin(\mathbf{x})+\mathbf{z}\cos(\mathbf{y}))\mathrm{dxdydz}
$$
f = @(x,y,z) y.*sin(x)+z.*cos(y); |
方程(组)求根
fsolve()
使用
fsovle(fun,x0)
求解非线性方程组的根,fun
为代求方程的函数句柄 ,x0
为初值%例如 求方程1.2 x + x sin ( x ) + 0.3 = 0 在x=0附近的解.
f2 = @(x) (1.2*x+x*sin(x)+0.3);
fsolve(f2,0) % 得到 -0.3500再例如
$$- \begin{cases}\mathrm{e}^{-\mathrm{e}^{-(x_1+x_2)}}-\mathrm{x}_2\big(1+\mathrm{x}_1^2\big)=0\ \mathrm{x}_1\cos\mathrm{x}_2+\mathrm{x}_2\sin\mathrm{x}_1-\dfrac{1}{2}=0\end{cases}
$$
- \begin{cases}\mathrm{e}^{-\mathrm{e}^{-(x_1+x_2)}}-\mathrm{x}_2\big(1+\mathrm{x}_1^2\big)=0\ \mathrm{x}_1\cos\mathrm{x}_2+\mathrm{x}_2\sin\mathrm{x}_1-\dfrac{1}{2}=0\end{cases}
设定初值为[0,0] 因为有x1 和x2
fun = @(x) [exp(-exp(-(x(1)+x(2))))-x(2)*(1+x(1)^2)... |
第五节课
此节课几乎就是线性代数 ,所以也没什么好记的,最关键的就是理解,同时线性系统就是信号和电路中学习的(其实就是电路的15章 ),借此也是为了理解,知道基础运算就够了 (先彻底学明白线性代数再来学习他)
线性方程式
- 高斯消去法
rref([a,b])
,(就是线性代数求解方程组 任意两行乘以某个系数来互相运算获得0的办法)
A = [1 2 1;2 6 1;1 1 4];%A是一个矩阵,其实就是方程组的系数 |
左除:
\
mldivide()
用因式分解法求解线性方程组Ax = b:
A = [1 2 1;2 6 1;1 1 4];
b = [2; 7; 3];
x = A\b
x =
-3.0000
2.0000
1.0000
线性系统
和线性方程式不同的就是 线性方程式是为了求x 而线性系统是为了求B (Ax=B)