fccjxxw.com
非常超级学习网 学习超级帮手
当前位置:首页 >> >>

学习matlab(Matlab基础知识)

第二讲 Matlab 基础知识
1. 标识符 把标志变量, 常量或文件名的特定字符称为标识符, Matlab 规定必须是英文 字母,阿拉伯数字和下划线等符号组成的字符串,第一个符号必须是英文字母. 2. Matlab 中的数据及变量类型 有三种类型的基本数据: (1)数值型数据,简称数值(Double Array) :一般输入的数字均为数值数 据,包含实数,复数. (2)字符串型数据,简称字符量(Char Array) :用英文格式单引号加以界 定的数字,字符,各种符号,表达式,方程式和汉字等. (3)符号型数据,简称符号量(Sym Object) :用 sym 和 syms 可以把字符, 表达式,方程,矩阵等定义成数学符号,称为符号型数据,运算结果为数学表达 式. 在命令窗口中键入 class(a) ,回车可知已有变量 a 是哪一种类型的数据. 3. 变量名及赋值 (略)

2.1 数值矩阵
2.1.1 永久性数值变量名 除了 i,j,pi,eps(浮点运算相对精度 10-52) ,Inf,NaN 外还有,realmin(最 -1022 1023 小正浮点数 2 ),realmax(最大正浮点数 2 ). 2.1.2 数值矩阵的创建 1.直接输入法 直接输入法 >>a=[1 6 1;4 6 2;9 3 8]; >> b=[2-3i,3+5i,2i;3,9i,6;5-i,7i,4]; 2.创建特殊数值矩阵的命令输入法 创建特殊数值矩阵的命令输入法 命令格式 功能 命令格式 输出 n 阶全零方阵 zeros(n) rand(n) zeros(m,n) 输出 m×n 全零矩阵 rand(m,n) 输出 n 阶全 1 方阵 ones(n) randn(n) ones(m,n) 输出 m×n 全 1 矩阵 randn(m,n) eye(n)
输出 n 阶单位方阵, n=1 时 可省略

功能
输出 n 阶均匀分布的随机方阵 输出 m×n 阶均匀分布的随机矩阵 输出 n 阶正态分布的随机方阵 输出 m×n 阶正态分布的随机矩阵 输出 n 阶魔方阵(各行各列及主对 角线元素和均为 ( n3 + n) / 2 输出矩阵 a 的主对角线下(上)方 元素构成的下(上)三角矩阵.

magic(n)

diag(a,k)

输出矩阵 a 主对角线右移 k tril(a) 列时其元素构成的列向量. truilu(a) k=0 时可省略

3.变换矩阵结构的命令 .变换矩阵结构的 flipud(a)——输出矩阵 a 上下翻转后的矩阵; fliplr(a)——输出矩阵 a 左右翻转后的矩阵; rot90(a,k)——输出矩阵 a 沿逆时针旋转 k 个 90 度后的矩阵,k 为正负整数; rot90(a)——输出矩阵 a 逆时针旋转 90 度后的矩阵; reshape(A,m,n)——输出一个 m×n=k 阶矩阵,它是由矩阵 a 的 k 个元素重新 排列构成的矩阵,重排前后元素在矩阵中的符号不变. 一批特殊向量(行矩阵) 4. 一批特殊向量(行矩阵)的创建 (1) 等差数列型向量的创建 增量输入法:t=a:h:b 或 t=[a:h:b],>> t=(a:h:b),a,b 为起始值,h 为公差, 可正,可负,省略时为 1. 例如>> t=0:0.1:2*pi 线性等分命令 t=linspace(a,b,n),a,b 为起始值,n 为(b-a)的等分点个数. 例 x=linspace(2,2*pi,6) (2) 等比数列型向量的创建 调用格式为:q=logspace(log10(a),log10(b),n)或 q=logspace(as,bf,n),a,b 分别 为等比数列的初值和终值,n 为等比数列划分时的节点数. 例>> q=logspace(0,1,6) 2.1.3 数值矩阵的矩阵算法 矩阵算法——按照(线性代数)矩阵理论来运算. 数组算法——把矩阵视为由其元素构成的数据(数组) ,运算时在参与运算 的矩阵的元素之间进行的数与数的运算,如通常的".*"运算.便于对大批数据 的处理. 1. 数值矩阵维数的查验和矩阵的转置 数值矩阵维数的查验 查验和矩阵的转置 查验矩阵维数命令:size(a)或 size(a,r), r 取 1 输出矩阵的行数;取 2 输出矩 阵的列数. 例 b=[3 7 0 1;7 9 1 5]; size(b) 转置为:>> c=b' 2. 矩阵算法中的矩阵加,减和乘法运算 矩阵算法中的矩阵加, 普通的矩阵算法.注意: a n ,a 为矩阵,n 为整数.当 n>0 时,表示 n 个 a 相乘;当 n<0 时,表示 n 个 a 相乘的逆.矩阵 a 与常数 d 的和定义为 a+d=a+d*ones(size(a)). 3. 数值矩阵的求逆及矩阵算法中的除法 数值矩阵的求逆及矩阵算法中的除法 (1) 求逆命令 矩阵 a,b 满足 ab=ba=e(单位矩阵) ,格式 b=inv(a) (2) 求矩阵的伪逆矩阵 对矩阵 b(可以是奇异或长方) ,同时满足 xbx=b 和 bxb=x 的矩阵 x 称为 b 的伪逆矩阵,格式 x=pinv(b)

(3) 左除 解矩阵方程 ax=b 可得 x=a-1b,格式 x=inv(a)*b 或 x=a\b 或 mldivide(a,b) (4) 右除 解矩阵方程 xa=b 可得 x=ba-1,格式 x=b*inv(a)或 x=b/a 或 mrdivide(b,a) 4. 矩阵函数 设 a 为方阵. expm(z)—— ea = 1 + a a2 + + 1! 2!

logma(a)—— ln a sqrtm(a)——矩阵 a 的平方根 funm(a,@f)——矩阵 a 的任意函数 f(a) 2.1.4 数值矩阵的数组算法 1.查验向量维数命令 查验向量维数命令 length(a),a 为向量输出维数;a 为列阵(行阵)时,输出列(行)数;a 为 长方形矩阵时,输出行和列数. 2.数值矩阵间数组算法的四则运算 数值矩阵间数组算法的四则运算 a.*b——a 与 b 的对应元素相乘 a.^n——a 中每个元素的 n 次方 a./s,s.\a——a 中各元素被 s 除 a./b,b.\a——a 中各元素除以 b 中对应元素 s./a,a.\s——s 被 a 中各元素除. 3.数组算法中的基本初等函数运算 数组算法中的基本初等函数运算
函数命 令 数学意义 sin x 函数命令 数学意义 四舍五入 输出靠零的整数 输出靠向的整数 输出靠向的整数 arctan x e
x

函数命令

数学意义 x 的幅角 2x 各列元素中最大值 各列元素之平均值 各列元素之和 矩阵 x1 除以 x2 元素 的余数 各列元素的中间值 m(m+1)…(n-1),m<1 x!,x 为非负整数矩阵, 这时输出个元素阶乘

sin(x) asin(x) cos(x) sec(x) tan(x) cot(x) sinh(x) cosh(x) real(x) imga(x) sign(x)

round arcsinx fix cos x floor sec x ceil tan x atan(x) cot x exp(x) 双曲正弦 log(x) 双曲余弦 log2(x) x 的实部 log10(x) x 的虚部 sqrt(x)
符号函数

ln x long2 x lg x

x
x 的绝对值

angle(x) pow2(x) max(x) mean(x) sum(x) rem(x1,x2) 或 mod(x1,x2) median(x) prod(m:n) pactorial(x)

abs(x)

5. 向量的点积和叉积 点积:dot(a,b) 叉积:cross(a,b)

2.2 字符串和符号矩阵
2.2.1 字符串变量和函数求值 字符串在数据处理,造表和函数求值运算中非常有用. 用单引号界定的排成的各种符号,包括数字,英文,汉字,横线,括号 及表达式,方程式等.例如>> a='I am a sutdent' 字符串的输出显示命令 disp(zs),输入参数 zs 可以是数值变量,字符串 变量和被界定的字符串,但每一次只能有一个内容,各变量之间用空格 分开.空格也可以用字符命令 blanks(n)控制. >> a='sint';b='exp(t)';c='lnt';t=[0.1:0.2:pi/4]'; d=' t sint exp(t) lnt '; disp(d),disp([t sin(t) exp(t) log(t)]) 格式化数据显示命令 为了使输出的数据按规定格式 (表示方式, 小数点位数等) 显示, 常用命令>> sprintf('Z',S1,S2) 输入参数的第一部分'Z'由两部分组成(这两部分可以交错混合排列) ; 控制的第二部分数据显示 S1,S2 显示形式的"格式" ,格式符及其意义如 下表,两个格式符空格的大小就是数据显示时的间距. 格式 显示格式 格式符 显示格式 %e 指数格式 %g 自动选择指数 %f 小数格式 %m.nf 数据共占 m 个字符宽度, 显示 n 位小数 %d 十进制整数格式 \n 换行符 【例 2-17】分两行输出自然数 e,ln 5 和最小浮点数 eps 的符号(即表头) 和数值. >> a=[exp(1) log(5) eps]; >> b=sprintf(' e ln5 eps\n %9.3f; %f; %e;',a) 2 自定义函数求值 可以用数值或符号变量表达式,内联函数命令,自己编写的 M-函数文件等 多种方法自定义函数,然后进行函数的求值运算. (1)用数值变量表达式自定义函数. 四则运算中必须用数组符号算法符号, 否则称为矩阵函数; 表达式使用时 "一 次性"的,再使用需要重新输入;输入表达式前必须先给数值变量赋值. (2)用字符变量表达式定义函数 把函数表达式定义成字符串表达式(自定义函数) ,给字符串赋值以后,通 过数值转换命令 eval 将字符串转换为数值,从而得出函数值.表达式两端必须 加单引号界定,使之被定义为字符串表达式. (3)用内联函数命令自定义函数 内联函数命令为 fun1_1=inline(字符串表达式) 3 2π 9 【例 2-48】 已知 A = 用三种方法求 yij = f (aij ) = a 3 + sin 2 a + e a . , 6 5 3π

数值变量法:>> A=[3 2*pi 9;6 5 3*pi]; f1=A.^3+sin(A).^2+exp(-A) 字符变量函数法:>> fx1='A.^3+sin(A).^2+exp(-A)'; >> A=[3 2*pi 9;6 5 3*pi];;fx1_A=eval(fx1) 内联函数法:>> fx2=inline('A.^3+sin(A).^2+exp(-A)'); >> A=[3 2*pi 9;6 5 3*pi];;fx2(A) 2.2.2 符号变量 ( 略) 符号矩阵的创建方法 2.2.3 符号矩阵的创建方法 >> Y=sym('[a 5*b+1;c-sin(a) b+3]') 2.2.4 符号矩阵的运算 符号矩阵的加法,乘法,点乘法: >> X=sym('[a/b,sin(a);b^4,8]');Y=sym('[3/a,cos(b);b^3,3]'); >> X+Y,X*Y,X.*Y 符号矩阵的求逆运算: >> inv(X)
x 对矩阵 2 x 5x 6 2x 各元素进行因式分解: x 2 x + 1
2

>> A=sym('[x/(x^2-5*x-6),2*x/(x^2-2*x+1)]'); >> factor(A)

cos( x y ) sin( x + y ) 将符号矩阵 的各元素展开: x y ( x 1)3 e
>> A=sym('[cos(x-y),sin(x+y);exp(x-y),(x-1)^3]'); >> expand(A) 同次幂系数合并: >> syms x y,collect(x^2*y+x*y-2*x^2-3*x) 求极限:格式,limit(F,x,a,'right'或'left'),right,left 表左右极限,缺省时表 极限. >> syms x m a,limit((x^(1/m)-a^(1/m))/(x-a),x,a) 求导数命令,格式:diff(S,'v',n),S 为函数,v 为求导的指定自变量,n 为 求导阶数.

【例 2-29】已知二元函数 z ( x, y ) = xyesin(π xy ) ,求

z z , x y

默认变量 x:>> syms x y,z=x*y*exp(sin(pi*x*y));diff(z) 指定变量 y:>> diff(z,'y') 泰勒展开式:>> syms x,taylor(exp(2*x))

2.3 基本绘图方法

Matlab 提供了丰富的绘图功能,在绘图时,每个图形元素(如坐标轴或图形 上的曲线,文字等)都是一独立的对象,被分配给一个句柄(handle) ,用户只 需对该句柄进行操作就可以独立地修改一个图形元素,而不影响图形的其他部 分. 2.3.1 二维图形函数与调用方法 常用的绘图函数 plot——绘制二维图形,x 轴和 y 轴为线性坐标 semilogx——绘制二维图形,x 轴为对数坐标,y 轴为线性坐标 semilogy——绘制二维图形,x 轴为线性坐标,y 轴为对数坐标 loglog——绘制二维图形,x 轴和 y 轴均为对数坐标 plotyy——绘制二维图形,在图形的左右各有一个 y 轴 polar——绘制极坐标曲线 grid——在图形窗口添加网(grid on)或去掉网(grid off) zoom——允许(zoom on)或不允许(zoom off)对图形进行放大缩小操作 ginput——用鼠标获取图形中点的坐标 patch——填充二维或三维坐标中的二维图形 fill——填充二维坐标中的二维图形 1.基本二维图形 . Plot(X,Y,'S') X 为横坐标,Y 为纵坐标,S 是修饰曲线的标记符,包含标志拐点的点型符 号,曲线的线性符号和色型符号,分布标记数据点位置,曲线类型和曲线色彩. 常用的绘图选项 选项 含义 选项 含义 选项 含义 实线 c 青色 D 用菱形标出数据点 -虚线 w 白色 V 用下三角形标出数据点 : 点线 k 黑色 ^ 用上三角形标出数据点 -. 点画线 * 用*号标出数据点 < 用左三角形标出数据点 r 红线 . 用点号标出数据点 > 用右三角形标出数据点 g 绿线 o 用圆圈标出数据点 H 用六角形标出数据点 b 蓝线 x 用叉号标出数据点 P 用五角形标出数据点 y 黄线 + 用加号标出数据点 m 洋红 s 用正方形标出数据点 画实线可以在参数 S 后加写"'linewidth',n",用以控制线条宽度,n 标志线 宽,也可在绘图窗中单击快捷按钮,用其菜单进行编辑. 【例 2-34】>> y=[3 7 9 1 5 2 8]; >> subplot(1,2,1),plot(y,'linewidth',2),grid 又如:>> x=[3 3 9;8 1 2;1 8 5;7 9 1]; >> subplot(1,2,2),plot(x),xlabel('x'),ylabel('y') 2.特殊坐标二维图形 特殊坐标二维图形 极坐标曲线:>> theta=0:0.1:8*pi; polar(theta,cos(4*theta)+1/4) 对数坐标曲线:>> x=0:0.1:2*pi; y=sin(x);semilogx(x,y);grid on 【例 3-27】执行下列程序,比较在不同坐标系下的图形特点. theta=0:0.1:6*pi;

>> r=cos(theta/3)+1/9; >> subplot(2,2,1),polar(theta,r) >> subplot(2,2,2),plot(theta,r) >> subplot(2,3,4),semilogx(theta,r) >> subplot(2,3,5),semilogy(theta,r) >> subplot(2,3,6),loglog(theta,r) 双 y 轴图形:>> x=0:0.01:5;y=exp(x);plotyy(x,y,x,y,'semilogy','plot'),grid 复数数据,plot(x,y),不论参数 x,y 那个是复数,都将忽略掉虚部数据,只 绘制该复数的实部数据,其余用法和绘制与一般实数数据相同. plot(z)绘图时,以复数的实部为横坐标,虚部为纵坐标绘制实部和虚部的关 系曲线. >> t=0:0.1:2*pi;x=sin(t);y=cos(t);z=x+y*i;plot(t,z),grid >> t=0:0.1:2*pi;x=sin(t);y=cos(t);z=x+y*i;plot(z),grid 2.3.2 二维图形处理 图形标注 x=(0:0.1:2*pi)'; >> y1=2*exp(-0.5*x)*[1,-1]; >> y2=2*exp(-0.5*x).*sin(2*pi*x); >> x1=(0:12)/2; >> y3=2*exp(-0.5*x1).*sin(2*pi*x1); >> plot(x,y1,'g:',x,y2,'b--',x1,y3,'rp') >> title('曲线及其包络线'); >> xlabel('变量 x'); >> ylabel('变量 y'); >> text(3.2,0.5,'包络线'); >> text(0.5,0.5,'曲线'); >> text(1.4,0.15,'离散数据点'); >> legend('包络线','曲线 y','离散数据点') 坐标控制 axis equal——纵,横坐标轴采用等长刻度 axis squae——产生正方形坐标系(默认为矩形) axis auto——使用默认设置 axis off——取消坐标轴 axis on——显示坐标轴 给坐标轴加网格线 >> x=(0:0.1:2*pi)'; >> y1=2*exp(-0.5*x)*[1,-1]; >> y2=2*exp(-0.5*5).*sin(2*pi*x); >> plot(x,y1,'g'); >> hold on; >> plot(x,y2,'b--'); >> x1=(0:12)/2;

>> plot(x1,y3,'rp'); >> grid on; >> box off; >> hold off; 2.3.3 三维图形的基本函数 建立三维图形的基本函数 函数 功能 plot3 建立三维线条图 mesh 建立网格图 meshc 建立具有基本等高线的网格图 meshz 建立具有基准平面的网格图 surf 建立表面图 2.3.4 三维曲线图 【例 2-45】绘制三维曲线 >> t=pi:pi/200:8*pi; >> h=figure(1) ; >> set(h,'color',[1,1,1]) ; >> subplot(1,2,1),plot3(cos(t),sin(t),t,'b-') >> subplot(1,2,2),plot3(sin(t),cos(t),t,'.') 2.3.5 三维网格图 所谓网格图就是把相邻的数据点连接起来形成网状曲面. 【例 2-46】绘制函数 z = sin x 2 + y 2 x2 + y 2

函数 surfc surfl surface Fill3

功能 建立带有基本等高线的表面图
建立带有指定方向照明的表面图

建立表面图对象的低级函数 填充三维多边形

[x,y]=meshgrid(-8:0.5:8,-10:0.5:10); >> R=sqrt(x.^2+y.^2)+eps; >> z=sin(R)./R; >> mesh(x,y,z) 在以上程序末尾加 hiden off 可以显示被遮住部分的效果. 2.3.6 三维曲面图 所谓三维曲面图, 就是把三维网格图表面的网格围成的小片区域用不同颜色 填充所形成的彩色曲面. 【例 2-47】绘制标准曲面 >> subplot(2,2,1),sphere(3); >> title('n=3'),axis equal; >> subplot(2,2,2),sphere(6); >> title('n=6'),axis equal; >> subplot(2,2,3),sphere; >> title('n=20'),axis equal; >> subplot(2,2,4),sphere(50);

>> title('n=50'),axis equal; 【例 2-49】绘制三维曲面图 [x,y]=meshgrid(-8:0.5:8,-10:0.5:10); R=sqrt(x.^2+y.^2)+eps; z=sin(R)./R; surf(x,y,z); colorbar colorbar 命令的作用是在三维曲面图旁边绘制一个可以指示高度的色彩条, 使三维曲面的可读性更强. handing flat 去掉各片连接处的线条,平滑当前图形的颜色. shading interp 去掉连接线条,在各片之间使用颜色插值,使得片与片之间 以及片内部的颜色均过渡. shading faceted 默认值,带有连接线条的曲面. 可以将 surf 换为 surfc 或 surfl. 2.3.7 专用图形 1 条形图 bar,bar3 分别绘制二维和三维竖条形图;barh 和 bar3h 分别绘制二维和三维 水平条形图.四个函数用法相似. Bar(x,y):x 是横坐标向量,y 是向量或矩阵.y 是向量时,每个元素对 应一个竖条; 是 m 行 n 列矩阵时, y 将画出 m 组竖条, 每组包括 n 个条. bar(y):横坐标使用默认值 1:m. bar(x,y,width)或 bar(y,widh):用 width 指定竖条的宽度,默认宽度是 0.8. 如果宽度大于 1,那么条与条之间将重合. bar(…, 'grouped'):产生组合的条形图. bar(…,'stacked'):产生堆叠的条形图. bar(…,'linespec'):指定条的颜色. h=bar(…):返回补片对象的句柄向量. >> Y=[3,8,2;8,9,2;8,3,3;2,5,6;9,5,1]; >> subplot(1,2,1),bar(Y),title('二维条形图'); >> subplot(1,2,2),bar3(Y),title('三维条形图'); 2 直方图(统计拼数条形图) 直方图(统计拼数条形图) hist 在直角坐标系中建立直方图,rose 在极坐标系下建立直方图. n=hist(y):指 y 按其中数据的大小分为 10 个相等的段,统计每段中的元 素个数并返回给 n.如果 y 是矩阵,那么按列分段. n=hist(y,m):m 是标量,用来设置分段的个数. n=hist(y,x):x 是向量,用来指定所分的每个数据段的中间值. hist(…):不带输出参数时,直接绘制直方图. >> y1=randn(10000,1); >> y2=rand(10000,1); >> subplot(1,2,1);hist(y1,20);title('正太分布'); >> subplot(1,2,2);hist(y2,10);title('均匀分布');

3 饼形图 pie 和 pie3 分别用于绘制二维和三维饼形图. pie(x):x 可以是向量矩阵.如果 x 是向量,则绘制各个元素在向量所有 元素之和中所占的比例. pie(x,explode):参数 explode 中的元素值非零时,该元素所对应的片 和整个图形脱开. pie(…,labels):labels 用于标注饼形图的字符串数组,它必须和 x 同 维.若没有指定,则 Matlab 缺省的以该片所占的比例作为标注. h=pie(…):返回包括补片和文本对象的句柄的向量. >> cj=[80,95,70,40]; 二维饼图>> pie(cj,[0,0,1,0]) 三维饼图>> pie3(cj,[0,0,1,0],{'语文 28%','数学 33%','外语 25%','政治 14%'}); 4 离散数据图 函数 stem 和 stem3 分别用来绘制二维和三维的离散图形,用法与 plot 和 plot3 用法一致,区别在于这两个函数用选项 fill 来填充图中的离散点标记. 绘制离散数据图:>> x=linspace(0,2*pi,40); a=sin(2*x);b=cos(x); stem(x,a+b);hold on; plot(x,a);hold on; plot(x,b);hold off; 用函数绘制三维空间中的火柴杆图,当数据较少时,这种效果较好.以下是 一个螺旋线的例子. th=(0:127)/128*2*pi;x=th.*cos(th);y=th.*sin(th); >> stem3(x,y,th,'fill');view([-158 66]); >> xlabel('X 轴');ylabel('y 轴');zlabel('z 轴'); >> title('三维火柴杆图');hold on; >> plot3(x,y,th,'k');hold off; 画阶梯图时,相邻两点间的区间的值全部为两点中起点的值,两点间全部用 阶梯值相连.阶梯图对于绘制数字系统的时程曲线比较有用. >> alpha=0.01;beta=0.5;t=0:10; >> f=exp(alpha*t).*sin(2*beta*t);stairs(t,f); >> hold on;plot(t,f,'--*');hold off; >> label='函数 e^{\alpha*t)}sin2\beta*t 的阶梯图'; >> text(0.5,0.2,label,'FontSize',12); >> xlabel('t=0:10','FontSize',14);axis([0,10,-1.2,1.2]) 三维离散序列图绘制应用实例. >> t=0:pi/10:6*pi; >> x=exp(-t/10).*cos(t); >> y=2*exp(-t/10).*sin(t); >> stem3(x,y,t,'filled') >> hold on >> plot3(x,y,t)

>> xlabel('X');ylabel('Y');zlabel('Z') 5 等高线 函数 contour 和 contour3 用来绘制二维和三维等高线,调用方法如下: contour(z):直接绘制矩阵 z 的等高线. contour(x,y,z):用 x 和 y 指定等高线的 x,y 坐标. contour(z,n)和 contour(x,y,z,n):用标量 n 指定绘制等高线的线条数, 即从最低位置到最高位置所用的条线条总数. contour(z,v)和 contour(x,y,z,v):向量 v 中的元素指定绘制等高线的 位置,该向量的长度对应绘制的线条数. [c,h]=contour(…):返回等高线矩阵 c 和列向量 h,h 是线条对象或补 片对象的句柄. Clabel(c,h):标记等高线的数值,参数(c,h)必须是 contour 命令的返 回值,即[c,h]=contour(…). 说明:n 指定要绘制出 n 条等高线,可以缺省,系统默认;若指定矩阵 x 和 y,则居于矩阵 x 和 y 绘制三维等高线;参数 option 是个字符串参数,指定等高 线型和颜色,默认为黄色. 二维等高线:>> [x,y,z]=peaks;contour(x,y,z,15); 三维等高线:>> [x,y,z]=peaks;>> contour3(x,y,z,20);>> colormap(hsv) 【例 2-52】利用函数 clabel 绘制下列函数的曲面及其对应的三维等高线. 2 2 2 2 2 2 x 1 f ( x, y ) = 3(1 x) 2 e x ( y +1) 10( x3 y 5 )e ( x y ) e ( x +1) y 5 3 x=-3:0.25:3;y=x;[X,Y]=meshgrid(x,y); Z=3*(1-X).^2.*exp(-(X.^2)-(Y+1).*2)-10*(X/5-X.^3-Y.^5).*exp(-X.^2 -Y.^2)-1/3*exp(-(X+1).^2-Y.^2); subplot(2,2,1);mesh(X,Y,Z) >> xlabel('x');ylabel('y');zlabel('z');title('Peaks 函数图形'); >> subplot(2,1,2);[c,h]=contour3(x,y,Z); >> clabel(c,h) >> xlabel('x');ylabel('y');zlabel('z');title('Peaks 函数的三维等高 线'); 6 瀑布图 函数 waterfall 绘制瀑布图,用法和 mesh 类似. >> waterfall(peaks); >> axis tight 7 简易函数绘图 三维图形简易绘制函数: 函数
ezplot3(funx,funy,[tmin,tmax]) ezmesh(fun,domain) ezmeshc(fun,domain)

说明

在[tmin,tmax]范围下绘制(funx(t),funy(t),funz(t)三维曲线. 在 domain 指定的区域绘制 fun 指定的二元函数的网线图 在 domain 指定区域绘制 fun 指定的二元函数的网线图, 并在 x-y 平面叠加绘制等高线.

ezsurf(fun,domain) ezsurfc(fun,domain)

在 domain 指定的区域绘制 fun 指定的二元函数的表面图 在 domain 指定的区域绘制 fun 指定的二元函数的表面图, 并 在 x-y 平面叠加绘制等高线.

【例 2-35】利用简易三维绘图函数 ezplot3,ezmesh,ezsurf 和 ezsurfc 分别绘制三维图形. >> subplot(2,2,1);ezplot3('sin(t)','cos(t)','sin(2*t)',[0,2*pi]); >> subplot(2,2,2);ezmesh(@peaks,[-5 5 -5 5]); >> subplot(2,2,3);ezsurf(@(x,y)(x.^2+y.^2),[-5 5 -5 5]); >> subplot(2,2,4);ezsurfc(@(x,y)(x.^2+y.^2),[-5 5 -5 5]) peaks 是 Matlab 内置的一个二元函数,因此@peaks 代表这一函数的句柄, @sin 和@cos 类似. 8 圆柱体图 利用圆柱体表面数据产生命令 cylinder 产生一组圆柱体表面的坐标矩阵 值,然后由该矩阵值利用 mesh 或 surf 命令来绘制出这个圆柱体图形.常用的调 用格式如下: [X,Y,Z]=cylinder(r,n):产生三个维数为 (n + 1) × (n + 1) 的矩阵 X,Y,Z (不直接绘制圆柱体) ,它们分别表示圆柱体表面上一系列数据点 (x,y,z)的坐标值.利用这些矩阵数据,用 mesh 和 surf 命令来绘制出 指定大小和位置的圆柱体图形.参数 r 为一个向量,它表示等距离分布 的沿圆柱体基线在其单位高度的半径.r 的默认值为 r=[1 1].参数 n 确定了圆柱体绘制的精度.N 值越大,数据点越多,绘制越精确. cylinder(r,n):产生圆柱体表面的数据点,并直接由 surf 命令绘制这 个圆柱体. cylinder(r):以默认的参数 n=20 绘制基线为 r 的圆柱体. cylinder:以默认参数 r=[1 1],n=20 绘制单位圆柱体. 【例 2-54】利用函数 cylinder 绘制出两种圆柱体. >> subplot(1,2,1);[X,Y,Z]=cylinder;mesh(X,Y,Z);title('单位圆柱体'); >>subplot(1,2,2);t=1:10;r(t)=t.*t;[X,Y,Z]=cylinder(r,40);mesh(X,Y,Z); title('一般圆柱体') 9 球面图 先利用表面数据产生命令 sphere 产生一组单位球面的坐标矩阵值,然后由 该矩阵利用 mesh 和 surf 命令来绘制出球面图形.常用调用格式如下: sphere(n):产生单位球面的数据点,并直接由 surf 命令绘制出这个单 位球面. [X,Y,Z]=sphere(n):产生三个维数为 (n + 1) × (n + 1) 的矩阵 X,Y,Z(不 直接绘制圆柱体) ,它分别表示球面表面上一系列数据点(x,y,z)的坐标 值. 【例 2-55】利用 sphere 绘制出两种不同的曲面. >> subplot(1,2,1);sphere(25);title('单位球面'); >> subplot(1,2,2);[X,Y,Z]=sphere(25);mesh(X,Y,2*(Z+1));title(' 移

位和放大的球面');

2.3.8 三维绘图的高级应用
1 透明度作图 hidden on:对当前图形打开隐藏线移除的状态,因此三维图后方的线会被前 面的线遮住,就是会透视被叠压的图形. hidden off:对当前图形关闭隐藏移除的状态,因此三维图后方的线将不会 被前面的线遮住,也就是说该三维图会变成一个透明的图. hidden:切换 hidden 为 on 或 off 的状态. 【例 2-56】绘制一个球体包住网络图,并将球体设置为透明. >> [x,y,z]=sphere(20); >> x=8.2*x;y=8.2*y;z=8.2*z; >> peaks; >> shading interp; %使用 imterp 渲染方式 >> colormap(hot); %使用 hot 颜色映射值 >> hold on >> mesh(x,y,z) %以 mesh 来绘制球体数据 >> hold off >> axis equal %产生等长的坐标轴以便于球体的显示 >> axis off %将坐标轴隐藏 在程序的末尾加上 hidden off 将球体设置为透明. 2 立体可视化 立体可视化需要构建的是立体而不是一些简单的表面, 因此需要三维数组作 为输入参数,其中三维数组的每一维分别代表一个坐标轴,三维数组中的点定义 了坐标轴格栅和坐标轴上的坐标点.如果要绘制的函数是一个标量函数,则绘制 函数需要四个三维数组,其中三个数组各代表一个坐标轴,第四个数组代表了这 些坐标处的标量数据,这些数组通常记作 X,Y,Z 和 V.如果要绘制的函数是一 个向量函数,则绘图函数需要 6 个三维数组,其中 3 个各表示一个坐标轴,3 个 用来表示坐标点处的向量,这些数组通常记作 X,Y,Z,U,V 和 W. 需要对立体和向量的术语有所了解.比如散度(Divergence)和旋度(Curl) 用于描述向量过程, 而等值面(Isosurfaces)和等值顶(Isocaps)则用于描述立体 的视觉外观. 先生成一个构建立体对象的坐标系: x=linspace(-3,3,13); >> y=1:20; >> z=-5:5; >> [X,Y,Z]=meshgrid(x,y,z); >> size(X) 运行结果: ans = 20 13 11

其中 X,Y,Z 为定义格栅的 3 个三维数组,分别从 x,y,z 经过三维格栅扩展形 成的.需要定义一个以三个数组为自变量的标量函数 V: >> V=sqrt(X.^2+cos(Y).^2+Z.^2); 利用标量函数 v = f ( x, y, z ) 定义一个立体对象所需要的数据已全部给出.为了使 立体对象可视化,用下面的代码查看该立体对象的一些截面. >> slice(X,Y,Z,V,[0,3],[5,15],[-3,5]) >> xlabel('X_axis');ylabel('Y_axis') 显示的立体图形在 x=0,x=3,y=5,y=15,z=-3,z=5 处的截面. 【例 2-58】采用正弦函数来截取立体图形. 在上例的基础上: >> [xs,ys]=meshgrid(x,y); >> zs=sin(-xs+ys/2); >> slice(X,Y,Z,V,xs,ys,zs) 【例 2-59】添加等高线 x=linspace(-3,3,13); y=1:20; z=-5:5; [X,Y,Z]=meshgrid(x,y,z); >> V=sqrt(X.^2+cos(Y).^2+Z.^2); >> slice(X,Y,Z,V,[0,3],[5,15],[-3,5]) >> hold on >> h=contourslice(X,Y,Z,V,3,[5,15],[]) >> set(h,'EdgeColor','k','Linewidth',1.5) >> xlabel('X_axis');>> ylabel('Y_axis');zlabel('Z_axis'); 【例 2-60】绘制等值面. >> x=linspace(-3,3,13);y=1:20;z=-5:5; >> [X,Y,Z]=meshgrid(x,y,z); >> V=sqrt(X.^2+cos(Y).^2+Z.^2); >> [X,Y,Z,V]=flow(13); >> fv=isosurface(X,Y,Z,V,-2); >> subplot(1,2,1);p=patch(fv); >> set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); %设置面属性 >> view(3) >> axis equal tight %按比例显示图形,打开网格 >> grid on >> subplot(1,2,2) >> p=patch(shrinkfaces(fv,.3)); %shrinkfaces 使表面收缩 >> set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); >> view(3) >> axis equal tight >> grid on

当显示立体图时,仅仅是为了观察其大体结构时,就没有必要针对所有的数 据点作图,因为数据点太多,会降低显示的速度.利用函数 reducevolume 和 reducepatch 则可以使用户在显示图形之前先删除一些数据或一些对图形显示 影响很小的碎片,从而提高图形显示的效率. 【例 2-61】reducevolume 和 reducepatch 函数的用法. >> x=linspace(-3,3,13);y=1:20;z=-5:5; >> [X,Y,Z]=meshgrid(x,y,z); >> V=sqrt(X.^2+cos(Y).^2+Z.^2); >> [X,Y,Z,V]=flow(13); >> [X,Y,Z,V]=flow; >> fv=isosurface(X,Y,Z,V,-2); >> subplot(2,2,1); >> p=patch(fv); >> Np=size(get(p,'Faces'),1); >> set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); >> view(3) >> axis equal tight >> grid on >> zlabel(sprintf('%d Patches',Np)) >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> subplot(2,2,2) [Xr,Yr,Zr,Vr]=reducevolume(X,Y,Z,V,[3 2 2]); fvr=isosurface(Xr,Yr,Zr,Vr,-2); p=patch(fvr); Np=size(get(p,'Faces'),1); set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); view(3) axis equal tight grid on subplot(2,2,3) p=patch(fv); set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); view(3) axis equal tight grid on reducepatch(p,.15) Np=size(get(p,'Faces'),1); zlabel(sprintf('%d Patches',Np)) subplot(2,2,4) p=patch(fvr); set(p,'FaceColor',[.5 .5 .5],'EdgeColor','Black'); view(3)

>> >> >> >> >>

axis equal tight grid on reducepatch(p,.15) Np=size(get(p,'Faces'),1); zlabel(sprintf('%d Patches',Np))

三维数据也可以通过 smooth3 函数来过滤而实现其平滑化. 【例 2-62】smooth3 的用法. >> data=rand(10,10,10); >> datas=smooth3(data,'box',3); >> subplot(1,2,1) p=patch(isosurface(data,.5),'FaceColor','Blue','EdgeColor','none' ); patch(isocaps(data,.5),'FaceColor','interp','EdgeColor','none'); >> isonormals(data,p) >> view(3); >> axis vis3d tight off >> camlight; lighting phong >> subplot(1,2,2) p=patch(isosurface(datas,.5),'FaceColor','Blue','EdgeColor','none '); patch(isocaps(datas,.5),'FaceColor','interp','EdgeColor','none'); >> isonormals(datas,p) >> view(3); >> axis vis3d tight off >> camlight;lighting phong


更多相关文章:

非常超级学习网 fccjxxw.com

copyright ©right 2010-2021。
非常超级学习网内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图