matlab程序设计实例
MATLAB程序设计及应用实例

MATLAB程序设计及应用实例MATLAB程序设计及应用实例一、引言1.1 研究背景1.2 目的和意义二、MATLAB入门2.1 MATLAB的基本概念2.2 MATLAB环境的配置2.3 MATLAB的基本操作2.4 基本数据类型和变量2.5 控制语句和循环结构三、向量和矩阵运算3.1 向量的定义和运算3.2 矩阵的定义和运算3.3 矩阵的转置、共轭和逆3.4 特殊矩阵的和操作3.5 矩阵的行列式和特征值计算四、函数的定义和调用4.1 函数的定义和语法4.2 函数的输入和输出参数4.3 匿名函数和内嵌函数4.4 函数的调试和错误处理五、图形化界面设计5.1 MATLAB的图形化界面工具箱5.2 GUI的设计和布局5.3 控件的属性设置和事件处理5.4 图像的读取和处理5.5 图表的绘制和交互操作六、数据分析与统计6.1 数据的导入和导出6.2 数据的预处理和清洗6.3 常用的数据统计和分析方法6.4 数据可视化和结果展示七、信号处理与图像处理7.1 信号的和处理7.2 傅里叶变换和频域分析7.3 滤波器的设计和应用7.4 图像的读取和处理7.5 图像的增强和分割八、机器学习与深度学习8.1 机器学习算法的基本原理8.2 机器学习工具箱的使用8.3 深度学习算法的基本原理8.4 深度学习工具箱的使用8.5 实例:图像分类和预测九、应用实例9.1 实例1:图像处理与分析9.2 实例2:信号处理与模式识别9.3 实例3:数据挖掘与预测十、总结与展望10.1 主要研究成果总结10.2 存在的问题和不足10.3 下一步工作的展望本文档涉及附件:- 附件1:MATLAB代码示例- 附件2:实验数据集法律名词及注释:- 版权:对创作作品的控制权和使用权的法律保护。
- 许可证:允许某人使用或复制作品的法律文件。
MATLAB程序设计及应用实例

c=input('请输入一个字符','s'); if c>='A' & c<='Z'
disp(setstr(abs(c)+1)); elseif c>='a'& c<='z'
disp(setstr(abs(c)-1)); elseif c>='0'& c<='9'
disp(abs(c)-abs('0')); else
disp(c); end
5.1.4 选择结构- switch语句
switch语句
其语句格式为: switch 表达式 case 值1 语句组1 case 值2 语句组2 …… case 值m 语句组m otherwise 语句组m+1 end
5.1.4 选择结构- switch语句
例 某商场对顾客所购买的商品实行打折销售,已知打折标 准,求所售商品的实际销售价格
例 矩阵乘法运算要求两矩阵的维数相容,否则会出错。 先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘
MATLAB程序设计及应用实例

MATLAB程序设计及应用实例MATLAB(Matrix Laboratory)是一种用于算法开发、数据分析、可视化和数值计算的高级技术计算语言和环境。
它的强大功能和灵活性使其成为各个领域研究和工程实践中广泛使用的工具。
下面将介绍几个MATLAB程序设计及应用的实例。
1.信号处理:MATLAB是信号处理的强大工具,它可以用于滤波、频谱分析、小波变换、分析和合成音频信号等。
例如,可以利用MATLAB进行语音信号的去噪处理,通过设计特定的滤波器来去除信号中的噪声成分,从而提取出清晰的语音信号。
2.图像处理:MATLAB可以进行图像的加载、处理和分析。
它提供了丰富的图像处理函数和工具箱,可以实现图像的滤波、二值化、边缘检测、图像增强等操作。
例如,可以使用MATLAB对医学图像进行分割,将感兴趣的区域提取出来,辅助医生进行病灶诊断。
3.控制系统设计:MATLAB是控制系统设计的有效工具。
它提供了丰富的控制系统分析和设计函数,可以进行系统建模、模拟和优化。
例如,可以使用MATLAB进行PID控制器的参数调整,通过对系统建模和后续仿真,优化PID控制器的参数,提高控制系统的性能和稳定性。
4.机器学习:MATLAB提供了强大的机器学习和深度学习工具箱,可以进行数据预处理、特征提取、模型训练和评估等操作。
例如,可以利用MATLAB进行图像分类,通过构建深度卷积神经网络模型,将输入的图像进行分类和识别。
5.数值计算:MATLAB对线性代数、数值优化和统计分析等有着强大的支持。
它提供的优化和求解函数可以解决复杂的线性和非线性优化问题,例如最小二乘拟合和参数估计等。
此外,MATLAB还拥有强大的统计分析工具,可以进行假设检验、数据拟合、方差分析等统计分析操作。
6.仿真模拟:MATLAB可以进行动态系统的建模和仿真,通过搭建系统方程和初始条件,可以对系统的动态响应进行模拟。
例如,在电力系统中,可以使用MATLAB进行电力系统稳定性分析,对电力系统的动态响应进行跟踪和分析。
实验二MATLAB程序设计含实验报告

实验二 MATLAB 程序设计一、 实验目的1.掌握利用if 语句实现选择结构的方法。
2.掌握利用switch 语句实现多分支选择结构的方法。
3.掌握利用for 语句实现循环结构的方法。
4.掌握利用while 语句实现循环结构的方法。
5.掌握MATLAB 函数的编写及调试方法。
二、 实验的设备及条件计算机一台(带有MATLAB7.0以上的软件环境)。
M 文件的编写:启动MATLAB 后,点击File|New|M-File ,启动MATLAB 的程序编辑及调试器(Editor/Debugger ),编辑以下程序,点击File|Save 保存程序,注意文件名最好用英文字符。
点击Debug|Run 运行程序,在命令窗口查看运行结果,程序如有错误则改正三、 实验内容1.编写求解方程02=++c bx ax 的根的函数(这个方程不一定为一元二次方程,因c b a 、、的不同取值而定),这里应根据c b a 、、的不同取值分别处理,有输入参数提示,当0~,0,0===c b a 时应提示“为恒不等式!”。
并输入几组典型值加以检验。
(提示:提示输入使用input 函数)2.输入一个百分制成绩,要求输出成绩等级A+、A 、B 、C 、D 、E 。
其中100分为A+,90分~99分为A ,80分~89分为B ,70分~79分为C ,60分~69分为D ,60分以下为E 。
要求:(1)用switch 语句实现。
(2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。
(提示:注意单元矩阵的用法)3.数论中一个有趣的题目:任意一个正整数,若为偶数,则用2除之,若为奇数,则与3相乘再加上1。
重复此过程,最终得到的结果为1。
如:2?13?10?5?16?8?4?2?16?3?10?5?16?8?4?2?1运行下面的程序,按程序提示输入n=1,2,3,5,7等数来验证这一结论。
请为关键的Matlab 语句填写上相关注释,说明其含义或功能。
matlab 程序设计 例题

一、概述Matlab是一种强大的工程计算软件,在工程领域有着广泛的应用。
对于学习Matlab程序设计来说,通过例题学习是非常有效的方法。
通过实际的例题练习,可以帮助学生更深入地理解Matlab的基本原理和应用技巧。
本文将介绍几个常见的Matlab程序设计例题,并进行详细的分析和讲解,希望能够帮助读者加深对Matlab程序设计的理解。
二、例题一:矩阵运算题目:编写一个Matlab程序,实现两个任意大小的矩阵相加的运算。
1.我们需要定义两个任意大小的矩阵A和矩阵B,可以通过rand函数生成随机矩阵,也可以手动输入矩阵的元素。
2.编写Matlab程序,使用矩阵的加法运算符“+”进行矩阵相加操作。
3.输出矩阵相加的结果,并进行验证和检查。
通过这个例题,可以加深对Matlab矩阵运算的理解,包括矩阵的定义、矩阵相加的操作和结果输出的方法。
三、例题二:函数绘图题目:编写一个Matlab程序,绘制sin函数的曲线图像。
1.我们需要定义sin函数的自变量范围和取值步长,可以使用linspace函数生成自变量的取值范围。
2.编写Matlab程序,调用sin函数计算自变量对应的函数值。
3.接下来,使用plot函数绘制sin函数的曲线图像,并设置图像的标题、坐标轴标签等其他参数。
4.输出绘制好的sin函数曲线图像,并进行观察和分析。
通过这个例题,可以了解Matlab中函数绘图的基本方法,包括自变量的定义、函数值的计算和图像的绘制等操作。
四、例题三:数值积分题目:编写一个Matlab程序,实现对指定函数在指定区间上的数值积分。
1.我们需要定义积分的目标函数和积分区间,在Matlab中可以使用function定义目标函数,也可以手动输入目标函数和积分区间。
2.编写Matlab程序,调用Matlab内置的数值积分函数(如quad、quadl等)进行数值积分的计算。
3.输出数值积分的结果,并与解析解进行比较和分析。
通过这个例题,可以了解Matlab中数值积分的计算方法,包括目标函数的定义、积分区间的设定和数值积分函数的调用。
matlab编程实例100例(精编文档).doc

【最新整理,下载后即可编辑】1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figure('toolbar','none',...'position',[198****0300],...'name','实例01');h1=axes('parent',h0,...'visible','off');x=-pi:0.05:pi;y=sin(x);plot(x,y);xlabel('自变量X');ylabel('函数值Y');title('SIN( )函数曲线');grid on实例2:三角函数曲线(2)function shili02h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例02');x=-pi:0.05:pi;y=sin(x)+cos(x);plot(x,y,'-*r','linewidth',1);grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例3:图形的叠加function shili03h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例03');x=-pi:0.05:pi;y1=sin(x);y2=cos(x);plot(x,y1,...'-*r',...x,y2,...'--og');grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例4:双y轴图形的绘制function shili04h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例04');x=0:900;a=1000;b=0.005;y1=2*x;y2=cos(b*x);[haxes,hline1,hline2]=plotyy(x,y1,x,y2,'semilogy','plot'); axes(haxes(1))ylabel('semilog plot');axes(haxes(2))ylabel('linear plot');实例5:单个轴窗口显示多个图形function shili05h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例05');t=0:pi/10:2*pi;[x,y]=meshgrid(t);subplot(2,2,1)plot(sin(t),cos(t))axis equalsubplot(2,2,2)z=sin(x)-cos(y);plot(t,z)axis([0 2*pi -2 2])subplot(2,2,3)h=sin(x)+cos(y);plot(t,h)axis([0 2*pi -2 2])subplot(2,2,4)g=(sin(x).^2)-(cos(y).^2);plot(t,g)axis([0 2*pi -1 1])实例6:图形标注function shili06h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例06');t=0:pi/10:2*pi;h=plot(t,sin(t));xlabel('t=0到2\pi','fontsize',16);ylabel('sin(t)','fontsize',16);title('\it{从0to2\pi 的正弦曲线}','fontsize',16) x=get(h,'xdata');y=get(h,'ydata');imin=find(min(y)==y);imax=find(max(y)==y);text(x(imin),y(imin),...['\leftarrow最小值=',num2str(y(imin))],...'fontsize',16)text(x(imax),y(imax),...['\leftarrow最大值=',num2str(y(imax))],...'fontsize',16)实例7:条形图形function shili07h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例07');tiao1=[562 548 224 545 41 445 745 512];tiao2=[47 48 57 58 54 52 65 48];t=0:7;bar(t,tiao1)xlabel('X轴');ylabel('TIAO1值');h1=gca;h2=axes('position',get(h1,'position'));plot(t,tiao2,'linewidth',3)set(h2,'yaxislocation','right','color','none','xticklabel',[]) 实例8:区域图形function shili08h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例08');x=91:95;profits1=[88 75 84 93 77];profits2=[51 64 54 56 68];profits3=[42 54 34 25 24];profits4=[26 38 18 15 4];area(x,profits1,'facecolor',[0.5 0.9 0.6],...'edgecolor','b',...'linewidth',3)hold onarea(x,profits2,'facecolor',[0.9 0.85 0.7],...'edgecolor','y',...'linewidth',3)hold onarea(x,profits3,'facecolor',[0.3 0.6 0.7],...'edgecolor','r',...'linewidth',3)hold onarea(x,profits4,'facecolor',[0.6 0.5 0.9],...'edgecolor','m',...'linewidth',3)hold offset(gca,'xtick',[91:95])set(gca,'layer','top')gtext('\leftarrow第一季度销量') gtext('\leftarrow第二季度销量') gtext('\leftarrow第三季度销量') gtext('\leftarrow第四季度销量') xlabel('年','fontsize',16);ylabel('销售量','fontsize',16);实例9:饼图的绘制function shili09h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例09');t=[54 21 35;68 54 35;45 25 12;48 68 45;68 54 69];x=sum(t);h=pie(x);textobjs=findobj(h,'type','text');str1=get(textobjs,{'string'});val1=get(textobjs,{'extent'});oldext=cat(1,val1{:});names={'商品一:';'商品二:';'商品三:'};str2=strcat(names,str1);set(textobjs,{'string'},str2)val2=get(textobjs,{'extent'});newext=cat(1,val2{:});offset=sign(oldext(:,1)).*(newext(:,3)-oldext(:,3))/2; pos=get(textobjs,{'position'});textpos=cat(1,pos{:});textpos(:,1)=textpos(:,1)+offset;set(textobjs,{'position'},num2cell(textpos,[3,2]))实例10:阶梯图function shili10h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例10');a=0.01;b=0.5;t=0:10;f=exp(-a*t).*sin(b*t);stairs(t,f)hold onplot(t,f,':*')hold offglabel='函数e^{-(\alpha*t)}sin\beta*t的阶梯图'; gtext(glabel,'fontsize',16)xlabel('t=0:10','fontsize',16)axis([0 10 -1.2 1.2])实例11:枝干图function shili11h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例11');x=0:pi/20:2*pi;y1=sin(x);y2=cos(x);h1=stem(x,y1+y2);hold onh2=plot(x,y1,'^r',x,y2,'*g');hold offh3=[h1(1);h2];legend(h3,'y1+y2','y1=sin(x)','y2=cos(x)') xlabel('自变量X');ylabel('函数值Y');title('正弦函数与余弦函数的线性组合'); 实例12:罗盘图function shili12h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例12');winddirection=[54 24 65 84256 12 235 62125 324 34 254];windpower=[2 5 5 36 8 12 76 14 10 8];rdirection=winddirection*pi/180;[x,y]=pol2cart(rdirection,windpower); compass(x,y);desc={'风向和风力','北京气象台','10月1日0:00到','10月1日12:00'};gtext(desc)实例13:轮廓图function shili13h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例13');[th,r]=meshgrid((0:10:360)*pi/180,0:0.05:1); [x,y]=pol2cart(th,r);z=x+i*y;f=(z.^4-1).^(0.25);contour(x,y,abs(f),20)axis equalxlabel('实部','fontsize',16);ylabel('虚部','fontsize',16);h=polar([0 2*pi],[0 1]);delete(h)hold oncontour(x,y,abs(f),20)实例14:交互式图形function shili14h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例14');axis([0 10 0 10]);hold onx=[];y=[];n=0;disp('单击鼠标左键点取需要的点'); disp('单击鼠标右键点取最后一个点'); but=1;while but==1[xi,yi,but]=ginput(1);plot(xi,yi,'bo')n=n+1;disp('单击鼠标左键点取下一个点');x(n,1)=xi;y(n,1)=yi;endt=1:n;ts=1:0.1:n;xs=spline(t,x,ts);ys=spline(t,y,ts);plot(xs,ys,'r-');hold off实例14:交互式图形function shili14h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例14');axis([0 10 0 10]);hold onx=[];y=[];n=0;disp('单击鼠标左键点取需要的点'); disp('单击鼠标右键点取最后一个点'); but=1;while but==1[xi,yi,but]=ginput(1);plot(xi,yi,'bo')n=n+1;disp('单击鼠标左键点取下一个点');x(n,1)=xi;y(n,1)=yi;endt=1:n;ts=1:0.1:n;xs=spline(t,x,ts);ys=spline(t,y,ts);plot(xs,ys,'r-');hold off实例15:变换的傅立叶函数曲线function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren')h=uicontrol('style','slider','position',...[100 10 500 20],'min',1,'max',20)for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例16:劳伦兹非线形方程的无序活动function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren')h=uicontrol('style','slider','position',...[100 10 500 20],'min',1,'max',20)for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例17:填充图function shili17h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例17');t=(1:2:15)*pi/8;x=sin(t);y=cos(t);fill(x,y,'r')axis square offtext(0,0,'STOP',...'color',[1 1 1],...'fontsize',50,...'horizontalalignment','center') 例18:条形图和阶梯形图function shili18h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例18');subplot(2,2,1)x=-3:0.2:3;y=exp(-x.*x);bar(x,y)title('2-D Bar Chart')subplot(2,2,2)x=-3:0.2:3;y=exp(-x.*x);bar3(x,y,'r')title('3-D Bar Chart')subplot(2,2,3)x=-3:0.2:3;y=exp(-x.*x);stairs(x,y)title('Stair Chart')subplot(2,2,4)x=-3:0.2:3;y=exp(-x.*x);barh(x,y)title('Horizontal Bar Chart')实例19:三维曲线图function shili19h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例19');subplot(2,1,1)x=linspace(0,2*pi);y1=sin(x);y2=cos(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,y1,z1,x,y2,z2,x,y3,z3)grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure1:3-D Plot')subplot(2,1,2)x=linspace(0,2*pi);y1=sin(x);y2=cos(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,z1,y1,x,z2,y2,x,z3,y3)grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure2:3-D Plot')实例20:图形的隐藏属性function shili20h0=figure('toolbar','none',...'position',[200 150 450 300],...'name','实例20');subplot(1,2,1)[x,y,z]=sphere(10);mesh(x,y,z)axis offtitle('Figure1:Opaque')hidden onsubplot(1,2,2)[x,y,z]=sphere(10);mesh(x,y,z)axis offtitle('Figure2:Transparent') hidden off实例21PEAKS函数曲线function shili21h0=figure('toolbar','none',...'position',[200 100 450 450],...'name','实例21');[x,y,z]=peaks(30);subplot(2,1,1)x=x(1,:);y=y(:,1);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfc(x,y,z)xlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure1:surfc函数形成的曲面') subplot(2,1,2)x=x(1,:);y=y(:,1);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfl(x,y,z)xlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure2:surfl函数形成的曲面') 实例22:片状图function shili22h0=figure('toolbar','none',...'position',[200 150 550 350],...'name','实例22');subplot(1,2,1)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trimesh(t,x,y,z)hidden offtitle('Figure1:Triangular Surface Plot'); subplot(1,2,2)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trisurf(t,x,y,z)title('Figure1:Triangular Surface Plot'); 实例23:视角的调整function shili23h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例23');x=-5:0.5:5;[x,y]=meshgrid(x);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;subplot(2,2,1)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure1')view(-37.5,30)subplot(2,2,2)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure2')view(-37.5+90,30) subplot(2,2,3)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure3')view(-37.5,60)subplot(2,2,4)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure4')view(180,0)实例24:向量场的绘制function shili24h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例24');subplot(2,2,1)z=peaks;ribbon(z)title('Figure1')subplot(2,2,2)[x,y,z]=peaks(15);[dx,dy]=gradient(z,0.5,0.5); contour(x,y,z,10)hold onquiver(x,y,dx,dy)hold offtitle('Figure2')subplot(2,2,3)[x,y,z]=peaks(15);[nx,ny,nz]=surfnorm(x,y,z);surf(x,y,z)hold onquiver3(x,y,z,nx,ny,nz)hold offtitle('Figure3')subplot(2,2,4)x=rand(3,5);y=rand(3,5);z=rand(3,5);c=rand(3,5);fill3(x,y,z,c)grid ontitle('Figure4')实例25:灯光定位function shili25h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例25');vert=[1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;12 2;2 2 2;2 1 2];fac=[1 2 3 4;2 6 7 3;4 3 7 8;15 8 4;1 2 6 5;5 6 7 8];grid offsphere(36)h=findobj('type','surface');set(h,'facelighting','phong',...'facecolor',...'interp',...'edgecolor',[0.4 0.4 0.4],...'backfacelighting',...'lit')hold onpatch('faces',fac,'vertices',vert,...'facecolor','y');light('position',[1 3 2]);light('position',[-3 -1 3]);material shinyaxis vis3d offhold off实例26:柱状图function shili26h0=figure('toolbar','none',...'position',[200 50 450 450],...'name','实例26'); subplot(2,1,1)x=[5 2 18 7 39 8 65 5 54 3 2];bar(x)xlabel('X轴');ylabel('Y轴');title('第一子图');subplot(2,1,2)y=[5 2 18 7 39 8 65 5 54 3 2];barh(y)xlabel('X轴');ylabel('Y轴');title('第二子图');实例27:设置照明方式function shili27h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例27');subplot(2,2,1)sphereshading flatcamlight leftcamlight rightlighting flatcolorbaraxis offtitle('Figure1')subplot(2,2,2)sphereshading flatcamlight leftcamlight rightlighting gouraudcolorbaraxis offtitle('Figure2')subplot(2,2,3)sphereshading interpcamlight rightcamlight leftlighting phongaxis offtitle('Figure3')subplot(2,2,4)sphereshading flatcamlight leftcamlight rightlighting nonecolorbaraxis offtitle('Figure4')实例28:羽状图function shili28h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例28');subplot(2,1,1)alpha=90:-10:0;r=ones(size(alpha));m=alpha*pi/180;n=r*10;[u,v]=pol2cart(m,n);feather(u,v)title('羽状图')axis([0 20 0 10])subplot(2,1,2)t=0:0.5:10;y=exp(-x*t);feather(y)title('复数矩阵的羽状图')实例29:立体透视(1)function shili29h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例29');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2);grid onfor i=-2:0.5:2;h1=surf(linspace(-2,2,20),...linspace(-2,2,20),...zeros(20)+i);rotate(h1,[1 -1 1],30)dx=get(h1,'xdata');dy=get(h1,'ydata');dz=get(h1,'zdata');delete(h1)slice(x,y,z,v,[-2 2],2,-2)hold onslice(x,y,z,v,dx,dy,dz)hold offaxis tightview(-5,10)drawnowend实例30:立体透视(2)function shili30h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例30');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2); [dx,dy,dz]=cylinder;slice(x,y,z,v,[-2 2],2,-2)for i=-2:0.2:2h=surface(dx+i,dy,dz);rotate(h,[1 0 0],90)xp=get(h,'xdata');yp=get(h,'ydata');zp=get(h,'zdata');delete(h)hold onhs=slice(x,y,z,v,xp,yp,zp);axis tightxlim([-3 3])view(-10,35)drawnowdelete(hs)hold offend实例31:表面图形function shili31h0=figure('toolbar','none',...'position',[200 150 550 250],...'name','实例31');subplot(1,2,1)x=rand(100,1)*16-8;y=rand(100,1)*16-8;r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;xlin=linspace(min(x),max(x),33); ylin=linspace(min(y),max(y),33); [X,Y]=meshgrid(xlin,ylin);Z=griddata(x,y,z,X,Y,'cubic'); mesh(X,Y,Z)axis tighthold onplot3(x,y,z,'.','Markersize',20) subplot(1,2,2)k=5;n=2^k-1;theta=pi*(-n:2:n)/n;phi=(pi/2)*(-n:2:n)'/n;X=cos(phi)*cos(theta);Y=cos(phi)*sin(theta);Z=sin(phi)*ones(size(theta)); colormap([0 0 0;1 1 1])C=hadamard(2^k);surf(X,Y,Z,C)axis square实例32:沿曲线移动的小球h0=figure('toolbar','none',...'position',[198****8468],...'name','实例32');h1=axes('parent',h0,...'position',[0.15 0.45 0.7 0.5],...'visible','on');t=0:pi/24:4*pi;y=sin(t);plot(t,y,'b')n=length(t);h=line('color',[0 0.5 0.5],...'linestyle','.',...'markersize',25,...'erasemode','xor');k1=uicontrol('parent',h0,...'style','pushbutton',...'position',[80 100 50 30],...'string','开始',...'callback',[...'i=1;',...'k=1;,',...'m=0;,',...'while 1,',...'if k==0,',...'break,',...'end,',...'if k~=0,',...'set(h,''xdata'',t(i),''ydata'',y(i)),',...'drawnow;,',...'i=i+1;,',...'if i>n,',...'m=m+1;,',...'i=1;,',...'end,',...'end,',...'end']);k2=uicontrol('parent',h0,...'style','pushbutton',...'position',[180 100 50 30],...'string','停止',...'callback',[...'k=0;,',...'set(e1,''string'',m),',...'p=get(h,''xdata'');,',...'q=get(h,''ydata'');,',...'set(e2,''string'',p);,',...'set(e3,''string'',q)']); k3=uicontrol('parent',h0,...'style','pushbutton',...'position',[280 100 50 30],...'string','关闭',...'callback','close');e1=uicontrol('parent',h0,...'style','edit',...'position',[60 30 60 20]);t1=uicontrol('parent',h0,...'style','text',...'string','循环次数',...'position',[60 50 60 20]);e2=uicontrol('parent',h0,...'style','edit',...'position',[180 30 50 20]);t2=uicontrol('parent',h0,...'style','text',...'string','终点的X坐标值',...'position',[155 50 100 20]);e3=uicontrol('parent',h0,...'style','edit',...'position',[300 30 50 20]);t3=uicontrol('parent',h0,...'style','text',...'string','终点的Y坐标值',...'position',[275 50 100 20]);实例33:曲线转换按钮h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例33');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid onhuidiao=[...'if i==1,',...'i=0;,',...'y=cos(x);,',...'delete(h),',...'set(hm,''string'',''正弦函数''),',...'h=plot(x,y);,',...'grid on,',...'else if i==0,',...'i=1;,',...'y=sin(x);,',...'set(hm,''string'',''余弦函数''),',...'delete(h),',...'h=plot(x,y);,',...'grid on,',...'end,',...'end'];hm=uicontrol(gcf,'style','pushbutton',...'string','余弦函数',...'callback',huidiao);i=1;set(hm,'position',[250 20 60 20]);set(gca,'position',[0.2 0.2 0.6 0.6])title('按钮的使用')hold on实例34:栅格控制按钮h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例34');x=0:0.5:2*pi;y=sin(x);plot(x,y)huidiao1=[...'set(h_toggle2,''value'',0),',...'grid on,',...];huidiao2=[...'set(h_toggle1,''value'',0),',...'grid off,',...];h_toggle1=uicontrol(gcf,'style','togglebutton',...'string','grid on',...'value',0,...'position',[20 45 50 20],...'callback',huidiao1);h_toggle2=uicontrol(gcf,'style','togglebutton',...'string','grid off',...'value',0,...'position',[20 20 50 20],...'callback',huidiao2);set(gca,'position',[0.2 0.2 0.6 0.6])title('开关按钮的使用')实例35:编辑框的使用h0=figure('toolbar','none',...'position',[200 150 350 250],...'name','实例35');f='Please input the letter';huidiao1=[...'g=upper(f);,',...'set(h2_edit,''string'',g),',...];huidiao2=[...'g=lower(f);,',...'set(h2_edit,''string'',g),',...];h1_edit=uicontrol(gcf,'style','edit',...'position',[100 200 100 50],...'HorizontalAlignment','left',...'string','Please input the letter',...'callback','f=get(h1_edit,''string'');',...'background','w',...'max',5,...'min',1);h2_edit=uicontrol(gcf,'style','edit',...'HorizontalAlignment','left',...'position',[100 100 100 50],...'background','w',...'max',5,...'min',1);h1_button=uicontrol(gcf,'style','pushbutton',...'string','小写变大写',...'position',[100 45 100 20],...'callback',huidiao1);h2_button=uicontrol(gcf,'style','pushbutton',...'string','大写变小写',...'position',[100 20 100 20],...'callback',huidiao2);实例36:弹出式菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例36');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid onhm=uicontrol(gcf,'style','popupmenu',...'string',...'sin(x)|cos(x)|sin(x)+cos(x)|exp(-sin(x))',...'position',[250 20 50 20]);set(hm,'value',1)huidiao=[...'v=get(hm,''value'');,',...'switch v,',...'case 1,',...'delete(h),',...'y=sin(x);,',...'h=plot(x,y);,',...'grid on,',...'case 2,',...'delete(h),',...'y=cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 3,',...'delete(h),',...'y=sin(x)+cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 4,',...'delete(h),',...'y=exp(-sin(x));,',...'h=plot(x,y);,',...'grid on,',...'end'];set(hm,'callback',huidiao)set(gca,'position',[0.2 0.2 0.6 0.6]) title('弹出式菜单的使用')实例37:滑标的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例37');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);h1=axes('position',...[0.2 0.2 0.5 0.5],...'visible','off');htext=uicontrol(gcf,...'units','points',...'position',[20 30 45 15],...'string','brightness',...'style','text');hslider=uicontrol(gcf,...'units','points',...'position',[10 10 300 15],...'min',-1,...'max',1,...'style','slider',...'callback',...'brighten(get(hslider,''value''))'); 实例38:多选菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例38');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);hlist=uicontrol(gcf,'style','listbox',...'string','default|spring|summer|autumn|winter',...'max',5,...'min',1,...'position',[20 20 80 100],...'callback',[...'k=get(hlist,''value'');,',...'switch k,',...'case 1,',...'colormap default,',...'case 2,',...'colormap spring,',...'case 3,',...'colormap summer,',...'case 4,',...'colormap autumn,',...'case 5,',...'colormap winter,',...'end']);实例39:菜单控制的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例39');x=0:0.5:2*pi;y=cos(x);h=plot(x,y);grid onset(gcf,'toolbar','none')hm=uimenu('label','example');huidiao1=[...'set(hm_gridon,''checked'',''on''),',...'set(hm_gridoff,''checked'',''off''),',...'grid on'];huidiao2=[...'set(hm_gridoff,''checked'',''on''),',...'set(hm_gridon,''checked'',''off''),',...'grid off'];hm_gridon=uimenu(hm,'label','grid on',...'checked','on',...'callback',huidiao1);hm_gridoff=uimenu(hm,'label','grid off',...'checked','off',...'callback',huidiao2);实例40:UIMENU菜单的应用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例40');h1=uimenu(gcf,'label','函数');h11=uimenu(h1,'label','轮廓图',...'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'[x,y,z]=peaks;,',...'contour3(x,y,z,30)']);h12=uimenu(h1,'label','高斯分布',...'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'mesh(peaks);,',...'axis tight']);。
Matlab100个实例程序

程序代码:(代码标记[code]...[/code] ) 1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figure('toolbar','none',...'position',[198****0300],...'name','实例01');h1=axes('parent',h0,...'visible','off');x=-pi:0.05:pi;y=sin(x);plot(x,y);xlabel('自变量X');ylabel('函数值Y');title('SIN( )函数曲线');grid on实例2:三角函数曲线(2)function shili02h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例02');x=-pi:0.05:pi;y=sin(x)+cos(x);plot(x,y,'-*r','linewidth',1);grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例3:图形的叠加function shili03h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例03');x=-pi:0.05:pi;y1=sin(x);y2=cos(x);plot(x,y1,...'-*r',...x,y2,...'--og');grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例4:双y轴图形的绘制function shili04h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例04');x=0:900;a=1000;b=0.005;y1=2*x;y2=cos(b*x);[haxes,hline1,hline2]=plotyy(x,y1,x,y2,'semilogy','plot'); axes(haxes(1))ylabel('semilog plot');axes(haxes(2))ylabel('linear plot');实例5:单个轴窗口显示多个图形function shili05h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例05');t=0:pi/10:2*pi;[x,y]=meshgrid(t);subplot(2,2,1)plot(sin(t),cos(t))axis equalsubplot(2,2,2)z=sin(x)-cos(y);plot(t,z)axis([0 2*pi -2 2])subplot(2,2,3)h=sin(x)+cos(y);plot(t,h)axis([0 2*pi -2 2])subplot(2,2,4)g=(sin(x).^2)-(cos(y).^2);plot(t,g)axis([0 2*pi -1 1])实例6:图形标注function shili06h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例06');t=0:pi/10:2*pi;h=plot(t,sin(t));xlabel('t=0到2\pi','fontsize',16);ylabel('sin(t)','fontsize',16);title('\it{从0to2\pi 的正弦曲线}','fontsize',16) x=get(h,'xdata');y=get(h,'ydata');imin=find(min(y)==y);imax=find(max(y)==y);text(x(imin),y(imin),...['\leftarrow最小值=',num2str(y(imin))],... 'fontsize',16)text(x(imax),y(imax),...['\leftarrow最大值=',num2str(y(imax))],...'fontsize',16)实例7:条形图形function shili07h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例07');tiao1=[562 548 224 545 41 445 745 512];tiao2=[47 48 57 58 54 52 65 48];t=0:7;bar(t,tiao1)xlabel('X轴');ylabel('TIAO1值');h1=gca;h2=axes('position',get(h1,'position'));plot(t,tiao2,'linewidth',3)set(h2,'yaxislocation','right','color','none','xticklabel',[])实例8:区域图形function shili08h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例08');x=91:95;profits1=[88 75 84 93 77];profits2=[51 64 54 56 68];profits3=[42 54 34 25 24];profits4=[26 38 18 15 4];area(x,profits1,'facecolor',[0.5 0.9 0.6],...'edgecolor','b',...'linewidth',3)hold onarea(x,profits2,'facecolor',[0.9 0.85 0.7],...'edgecolor','y',...'linewidth',3)hold onarea(x,profits3,'facecolor',[0.3 0.6 0.7],... 'edgecolor','r',...'linewidth',3)hold onarea(x,profits4,'facecolor',[0.6 0.5 0.9],... 'edgecolor','m',...'linewidth',3)hold offset(gca,'xtick',[91:95])set(gca,'layer','top')gtext('\leftarrow第一季度销量')gtext('\leftarrow第二季度销量')gtext('\leftarrow第三季度销量')gtext('\leftarrow第四季度销量')xlabel('年','fontsize',16);ylabel('销售量','fontsize',16);实例9:饼图的绘制function shili09h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例09');t=[54 21 35;68 54 35;45 25 12;48 68 45;68 54 69];x=sum(t);h=pie(x);textobjs=findobj(h,'type','text');str1=get(textobjs,{'string'});val1=get(textobjs,{'extent'});oldext=cat(1,val1{:});names={'商品一:';'商品二:';'商品三:'}; str2=strcat(names,str1);set(textobjs,{'string'},str2)val2=get(textobjs,{'extent'});newext=cat(1,val2{:});offset=sign(oldext(:,1)).*(newext(:,3)-oldext(:,3))/2; pos=get(textobjs,{'position'});textpos=cat(1,pos{:});textpos(:,1)=textpos(:,1)+offset;set(textobjs,{'position'},num2cell(textpos,[3,2]))实例10:阶梯图function shili10h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例10');a=0.01;b=0.5;t=0:10;f=exp(-a*t).*sin(b*t);stairs(t,f)hold onplot(t,f,':*')hold offglabel='函数e^{-(\alpha*t)}sin\beta*t的阶梯图'; gtext(glabel,'fontsize',16)xlabel('t=0:10','fontsize',16)axis([0 10 -1.2 1.2])实例11:枝干图function shili11h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例11');x=0:pi/20:2*pi;y1=sin(x);y2=cos(x);h1=stem(x,y1+y2);hold onh2=plot(x,y1,'^r',x,y2,'*g');h3=[h1(1);h2];legend(h3,'y1+y2','y1=sin(x)','y2=cos(x)') xlabel('自变量X');ylabel('函数值Y');title('正弦函数与余弦函数的线性组合');实例12:罗盘图function shili12h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例12');winddirection=[54 24 65 84256 12 235 62125 324 34 254];windpower=[2 5 5 36 8 12 76 14 10 8];rdirection=winddirection*pi/180;[x,y]=pol2cart(rdirection,windpower); compass(x,y);desc={'风向和风力','北京气象台','10月1日0:00到','10月1日12:00'};gtext(desc)实例13:轮廓图function shili13h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例13');[th,r]=meshgrid((0:10:360)*pi/180,0:0.05:1); [x,y]=pol2cart(th,r);z=x+i*y;f=(z.^4-1).^(0.25);contour(x,y,abs(f),20)xlabel('实部','fontsize',16);ylabel('虚部','fontsize',16);h=polar([0 2*pi],[0 1]);delete(h)hold oncontour(x,y,abs(f),20)实例14:交互式图形function shili14h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例14');axis([0 10 0 10]);hold onx=[];y=[];n=0;disp('单击鼠标左键点取需要的点'); disp('单击鼠标右键点取最后一个点'); but=1;while but==1[xi,yi,but]=ginput(1);plot(xi,yi,'bo')n=n+1;disp('单击鼠标左键点取下一个点'); x(n,1)=xi;y(n,1)=yi;endt=1:n;ts=1:0.1:n;xs=spline(t,x,ts);ys=spline(t,y,ts);plot(xs,ys,'r-');hold off实例15:变换的傅立叶函数曲线function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren')h=uicontrol('style','slider','position',... [100 10 500 20],'min',1,'max',20) for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例16:劳伦兹非线形方程的无序活动function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren')h=uicontrol('style','slider','position',... [100 10 500 20],'min',1,'max',20) for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例17:填充图function shili17h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例17');t=(1:2:15)*pi/8;x=sin(t);y=cos(t);fill(x,y,'r')axis square offtext(0,0,'STOP',...'color',[1 1 1],...'fontsize',50,...'horizontalalignment','center')实例18:条形图和阶梯形图function shili18h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例18');subplot(2,2,1)x=-3:0.2:3;y=exp(-x.*x);bar(x,y)title('2-D Bar Chart')subplot(2,2,2)x=-3:0.2:3;y=exp(-x.*x);bar3(x,y,'r')title('3-D Bar Chart')subplot(2,2,3)x=-3:0.2:3;y=exp(-x.*x);stairs(x,y)title('Stair Chart')subplot(2,2,4)x=-3:0.2:3;y=exp(-x.*x);barh(x,y)title('Horizontal Bar Chart')实例19:三维曲线图function shili19h0=figure('toolbar','none',...'position',[200 150 450 400],... 'name','实例19');subplot(2,1,1)x=linspace(0,2*pi);y1=sin(x);y2=cos(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,y1,z1,x,y2,z2,x,y3,z3) grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure1:3-D Plot')subplot(2,1,2)x=linspace(0,2*pi);y1=sin(x);y2=cos(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,z1,y1,x,z2,y2,x,z3,y3) grid onxlabel('X轴');zlabel('Z轴');title('Figure2:3-D Plot')实例20:图形的隐藏属性function shili20h0=figure('toolbar','none',...'position',[200 150 450 300],... 'name','实例20');subplot(1,2,1)[x,y,z]=sphere(10);mesh(x,y,z)axis offtitle('Figure1:Opaque')hidden onsubplot(1,2,2)[x,y,z]=sphere(10);mesh(x,y,z)axis offtitle('Figure2:Transparent') hidden off实例21:PEAKS函数曲线function shili21h0=figure('toolbar','none',...'position',[200 100 450 450],... 'name','实例21');[x,y,z]=peaks(30);subplot(2,1,1)x=x(1,:);y=y(:,1);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfc(x,y,z)xlabel('X轴');ylabel('Y轴');title('Figure1:surfc函数形成的曲面')subplot(2,1,2)x=x(1,:);y=y(:,1);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfl(x,y,z)xlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure2:surfl函数形成的曲面')实例22:片状图function shili22h0=figure('toolbar','none',...'position',[200 150 550 350],...'name','实例22');subplot(1,2,1)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trimesh(t,x,y,z)hidden offtitle('Figure1:Triangular Surface Plot');subplot(1,2,2)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trisurf(t,x,y,z)title('Figure1:Triangular Surface Plot');实例23:视角的调整function shili23h0=figure('toolbar','none',...'position',[200 150 450 350],... 'name','实例23');x=-5:0.5:5;[x,y]=meshgrid(x);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;subplot(2,2,1)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure1')view(-37.5,30)subplot(2,2,2)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure2')view(-37.5+90,30)subplot(2,2,3)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure3')view(-37.5,60)subplot(2,2,4)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure4')view(180,0)实例24:向量场的绘制function shili24h0=figure('toolbar','none',...'position',[200 150 450 350],... 'name','实例24');subplot(2,2,1)z=peaks;ribbon(z)title('Figure1')subplot(2,2,2)[x,y,z]=peaks(15);[dx,dy]=gradient(z,0.5,0.5); contour(x,y,z,10)hold onquiver(x,y,dx,dy)hold offtitle('Figure2')subplot(2,2,3)[x,y,z]=peaks(15);[nx,ny,nz]=surfnorm(x,y,z);surf(x,y,z)hold onquiver3(x,y,z,nx,ny,nz)hold offtitle('Figure3')subplot(2,2,4)x=rand(3,5);y=rand(3,5);z=rand(3,5);c=rand(3,5);fill3(x,y,z,c)grid ontitle('Figure4')实例25:灯光定位function shili25h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例25');vert=[1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;12 2;2 2 2;2 1 2];fac=[1 2 3 4;2 6 7 3;4 3 7 8;15 8 4;1 2 6 5;5 6 7 8];grid offsphere(36)h=findobj('type','surface');set(h,'facelighting','phong',...'facecolor',...'interp',...'edgecolor',[0.4 0.4 0.4],...'backfacelighting',...'lit')hold onpatch('faces',fac,'vertices',vert,... 'facecolor','y');light('position',[1 3 2]);light('position',[-3 -1 3]); material shinyaxis vis3d offhold off实例26:柱状图function shili26h0=figure('toolbar','none',...'position',[200 50 450 450],...'name','实例26');subplot(2,1,1)x=[5 2 18 7 39 8 65 5 54 3 2];bar(x)xlabel('X轴');ylabel('Y轴');title('第一子图');subplot(2,1,2)y=[5 2 18 7 39 8 65 5 54 3 2];barh(y)xlabel('X轴');ylabel('Y轴');title('第二子图');实例27:设置照明方式function shili27h0=figure('toolbar','none',...'position',[200 150 450 350],... 'name','实例27');subplot(2,2,1)sphereshading flatcamlight leftcamlight rightlighting flatcolorbaraxis offtitle('Figure1')subplot(2,2,2)sphereshading flatcamlight leftcamlight rightlighting gouraudcolorbaraxis offtitle('Figure2')subplot(2,2,3)sphereshading interpcamlight rightcamlight leftlighting phongcolorbaraxis offtitle('Figure3')subplot(2,2,4)sphereshading flatcamlight leftcamlight rightlighting nonecolorbaraxis offtitle('Figure4')实例28:羽状图function shili28h0=figure('toolbar','none',...'position',[200 150 450 350],... 'name','实例28');subplot(2,1,1)alpha=90:-10:0;r=ones(size(alpha));m=alpha*pi/180;n=r*10;[u,v]=pol2cart(m,n);feather(u,v)title('羽状图')axis([0 20 0 10])subplot(2,1,2)t=0:0.5:10;x=0.05+i;y=exp(-x*t);feather(y)title('复数矩阵的羽状图')实例29:立体透视(1)function shili29h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例29');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2); grid onfor i=-2:0.5:2;h1=surf(linspace(-2,2,20),...linspace(-2,2,20),...zeros(20)+i);rotate(h1,[1 -1 1],30)dx=get(h1,'xdata');dy=get(h1,'ydata');dz=get(h1,'zdata');delete(h1)slice(x,y,z,v,[-2 2],2,-2)hold onslice(x,y,z,v,dx,dy,dz)hold offaxis tightview(-5,10)drawnowend实例30:立体透视(2)function shili30h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例30');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2); [dx,dy,dz]=cylinder;slice(x,y,z,v,[-2 2],2,-2)for i=-2:0.2:2h=surface(dx+i,dy,dz);rotate(h,[1 0 0],90)xp=get(h,'xdata');yp=get(h,'ydata');zp=get(h,'zdata');delete(h)hold onhs=slice(x,y,z,v,xp,yp,zp);axis tightxlim([-3 3])view(-10,35)drawnowdelete(hs)hold offend实例31:表面图形function shili31h0=figure('toolbar','none',...'position',[200 150 550 250],...'name','实例31');subplot(1,2,1)x=rand(100,1)*16-8;y=rand(100,1)*16-8;r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;xlin=linspace(min(x),max(x),33); ylin=linspace(min(y),max(y),33); [X,Y]=meshgrid(xlin,ylin);Z=griddata(x,y,z,X,Y,'cubic'); mesh(X,Y,Z)axis tighthold onplot3(x,y,z,'.','Markersize',20)subplot(1,2,2)k=5;n=2^k-1;theta=pi*(-n:2:n)/n;phi=(pi/2)*(-n:2:n)'/n;X=cos(phi)*cos(theta);Y=cos(phi)*sin(theta);Z=sin(phi)*ones(size(theta)); colormap([0 0 0;1 1 1])C=hadamard(2^k);surf(X,Y,Z,C)axis square实例32:沿曲线移动的小球h0=figure('toolbar','none',...'position',[198****8468],... 'name','实例32');h1=axes('parent',h0,...'position',[0.15 0.45 0.7 0.5],... 'visible','on');t=0:pi/24:4*pi;y=sin(t);plot(t,y,'b')n=length(t);h=line('color',[0 0.5 0.5],...'linestyle','.',...'markersize',25,...'erasemode','xor');k1=uicontrol('parent',h0,...'style','pushbutton',...'position',[80 100 50 30],...'string','开始',...'callback',[...'i=1;',...'k=1;,',...'m=0;,',...'while 1,',...'if k==0,',...'break,',...'end,',...'if k~=0,',...'set(h,''xdata'',t(i),''ydata'',y(i)),',...'drawnow;,',...'i=i+1;,',...'if i>n,',...'m=m+1;,',...'i=1;,',...'end,',...'end,',...'end']);k2=uicontrol('parent',h0,...'style','pushbutton',...'position',[180 100 50 30],...'string','停止',...'callback',[...'k=0;,',...'set(e1,''string'',m),',...'p=get(h,''xdata'');,',...'q=get(h,''ydata'');,',...'set(e2,''string'',p);,',...'set(e3,''string'',q)']);k3=uicontrol('parent',h0,...'style','pushbutton',...'position',[280 100 50 30],... 'string','关闭',...'callback','close');e1=uicontrol('parent',h0,...'style','edit',...'position',[60 30 60 20]);t1=uicontrol('parent',h0,...'style','text',...'string','循环次数',...'position',[60 50 60 20]);e2=uicontrol('parent',h0,...'style','edit',...'position',[180 30 50 20]);t2=uicontrol('parent',h0,...'style','text',...'string','终点的X坐标值',...'position',[155 50 100 20]);e3=uicontrol('parent',h0,...'style','edit',...'position',[300 30 50 20]);t3=uicontrol('parent',h0,...'style','text',...'string','终点的Y坐标值',...'position',[275 50 100 20]);实例33:曲线转换按钮h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例33');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid on'if i==1,',...'i=0;,',...'y=cos(x);,',...'delete(h),',...'set(hm,''string'',''正弦函数''),',...'h=plot(x,y);,',...'grid on,',...'else if i==0,',...'i=1;,',...'y=sin(x);,',...'set(hm,''string'',''余弦函数''),',...'delete(h),',...'h=plot(x,y);,',...'grid on,',...'end,',...'end'];hm=uicontrol(gcf,'style','pushbutton',... 'string','余弦函数',...'callback',huidiao);i=1;set(hm,'position',[250 20 60 20]);set(gca,'position',[0.2 0.2 0.6 0.6]) title('按钮的使用')hold on实例34:栅格控制按钮h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例34');x=0:0.5:2*pi;y=sin(x);plot(x,y)huidiao1=[...'set(h_toggle2,''value'',0),',...'grid on,',...];'set(h_toggle1,''value'',0),',...'grid off,',...];h_toggle1=uicontrol(gcf,'style','togglebutton',... 'string','grid on',...'value',0,...'position',[20 45 50 20],...'callback',huidiao1);h_toggle2=uicontrol(gcf,'style','togglebutton',... 'string','grid off',...'value',0,...'position',[20 20 50 20],...'callback',huidiao2);set(gca,'position',[0.2 0.2 0.6 0.6])title('开关按钮的使用')实例35:编辑框的使用h0=figure('toolbar','none',...'position',[200 150 350 250],...'name','实例35');f='Please input the letter';huidiao1=[...'g=upper(f);,',...'set(h2_edit,''string'',g),',...];huidiao2=[...'g=lower(f);,',...'set(h2_edit,''string'',g),',...];h1_edit=uicontrol(gcf,'style','edit',...'position',[100 200 100 50],...'HorizontalAlignment','left',...'string','Please input the letter',...'callback','f=get(h1_edit,''string'');',...'background','w',...'max',5,...'min',1);h2_edit=uicontrol(gcf,'style','edit',...'HorizontalAlignment','left',...'position',[100 100 100 50],...'background','w',...'max',5,...'min',1);h1_button=uicontrol(gcf,'style','pushbutton',... 'string','小写变大写',...'position',[100 45 100 20],...'callback',huidiao1);h2_button=uicontrol(gcf,'style','pushbutton',... 'string','大写变小写',...'position',[100 20 100 20],...'callback',huidiao2);实例36:弹出式菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例36');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid onhm=uicontrol(gcf,'style','popupmenu',...'string',...'sin(x)|cos(x)|sin(x)+cos(x)|exp(-sin(x))',... 'position',[250 20 50 20]);set(hm,'value',1)huidiao=[...'v=get(hm,''value'');,',...'switch v,',...'case 1,',...'delete(h),',...'y=sin(x);,',...'h=plot(x,y);,',...'grid on,',...'case 2,',...'delete(h),',...'y=cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 3,',...'delete(h),',...'y=sin(x)+cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 4,',...'delete(h),',...'y=exp(-sin(x));,',...'h=plot(x,y);,',...'grid on,',...'end'];set(hm,'callback',huidiao)set(gca,'position',[0.2 0.2 0.6 0.6]) title('弹出式菜单的使用')实例37:滑标的使用h0=figure('toolbar','none',...'position',[200 150 450 250],... 'name','实例37');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);h1=axes('position',...[0.2 0.2 0.5 0.5],...'visible','off');htext=uicontrol(gcf,...'units','points',...'position',[20 30 45 15],...'string','brightness',...'style','text');hslider=uicontrol(gcf,...'units','points',...'position',[10 10 300 15],...'min',-1,...'max',1,...'style','slider',...'callback',...'brighten(get(hslider,''value''))');实例38:多选菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例38');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);hlist=uicontrol(gcf,'style','listbox',...'string','default|spring|summer|autumn|winter',... 'max',5,...'min',1,...'position',[20 20 80 100],...'callback',[...'k=get(hlist,''value'');,',...'switch k,',...'case 1,',...'colormap default,',...'case 2,',...'colormap spring,',...'case 3,',...'colormap summer,',...'case 4,',...'colormap autumn,',...'case 5,',...'colormap winter,',...'end']);实例39:菜单控制的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例39');x=0:0.5:2*pi;y=cos(x);h=plot(x,y);grid onset(gcf,'toolbar','none')hm=uimenu('label','example');huidiao1=[...'set(hm_gridon,''checked'',''on''),',...'set(hm_gridoff,''checked'',''off''),',...'grid on'];huidiao2=[...'set(hm_gridoff,''checked'',''on''),',...'set(hm_gridon,''checked'',''off''),',...'grid off'];hm_gridon=uimenu(hm,'label','grid on',... 'checked','on',...'callback',huidiao1);hm_gridoff=uimenu(hm,'label','grid off',... 'checked','off',...'callback',huidiao2);实例40:UIMENU菜单的应用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例40');h1=uimenu(gcf,'label','函数');h11=uimenu(h1,'label','轮廓图',...'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'[x,y,z]=peaks;,',...'contour3(x,y,z,30)']);h12=uimenu(h1,'label','高斯分布',...。
中南大学材料院matlab程序设计实践

中南大学MATLAB程序设计实践班级:学号:姓名:一、《MATLAB程序设计实践》Matlab基础表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,Data.txt是三维取向分布函数的一个实例。
由于数据量非常大,不便于分析,需要借助图形来分析。
请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:(1)用Slice函数给出其整体分布特征;(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 …90)切面上f分布情况(需要用到subplot函数);(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f 分布情况。
备注:data.txt 数据格式说明解:(1)将文件Data.txt 内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:fid=fopen('data.txt'); for i=1:18tline=fgetl(fid); endphi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19); while ~feof(fid)tline=fgetl(fid); data=str2num(tline); line=line+1;if mod(line,20)==1数据说明部分,与作图无关此方向表示f 随着φ1从0,5,10,15, 20 …到90的变化而变化此方向表示f 随着φ从0,5,10,15, 20 …到90的变化而变化表示以下数据为φ2=0的数据,即f (φ1,φ,0)phi2=(data/5)+1;phi=1;elsefor phi1=1:19f(phi1,phi,phi2)=data(phi1);endphi=phi+1;endendfclose(fid);将以上代码保存为readtext.m文件并在MATLAB中运行,运行结果如下图所示:将以下代码保存为code1_1.m文件:fopen('readtext.m');readtext;[x,y,z]=meshgrid(0:5:90,0:5:90,0:5:90);slice(x,y,z,f,[45,90],[45,90],[0,45])运行结果如右图所示:(2)将以下代码保存为code1_2_1.m文件:fopen('readtext.m');readtext;for i=1:19subplot(5,4,i)pcolor(f(:,:,i))End运行结果如右图所示:将以下代码保存为code1_2_2.m文件:fopen('readtext.m');readtext;for i=1:19subplot(5,4,i)contour(f(:,:,i))end运行结果如右图所示:(3)φ1=0~90,φ=45,φ2=0所对应的f(φ1,φ,φ2)即为f(:,10,1)。
matlab课程设计

MATLAB程序设计实践班级:材料0909姓名:金亚楠学号:0604090910指导老师:汪冰峰材料科学与工程学院2012年4月10日一、编程实现“Lagrange 差值”,并举一例应用之。
【实例】给出f(x)=lnx 的数值表,如下表所示,用Lagrange 差值计算ln(0.54)的近似值。
x 0.4 0.5 0.6 0.7 0.8 Ln(x) -0.916291 -0.693147 -0.510826 -0.357765 -0.2231441、算法说明Lagrange 差值原理:对给定的n 个差值节点x 1,x 2,…,x n 及对应的函数值y 1,y 2,…,y n ,利用n 次Lagrange 差值多项式公式,则对差值区间内任意x 的函数值y 可以通过下式求得:y (x )=∑y k ∙n k=1( ∏x −x j x k −x jnj=1j≠k )实例求解原理:输入5个差值节点值及其对应的函数值,调用Lagrange 差值函数即可求出ln(0.54)的值。
2、流程图Lagrange 差值流程图: 图1 Lagrange 差值流程图否 是 确定差值节点个数n 、待求节点个数m i=1,2,…,mz=x(i), s=0.0K=1,2,…,nj=1,2,…,nz=x(i), s=0.0J=k?p=p*(z-x0(j))/(x0(k)-x0(j)s=p*y0(k)+sy(i)=sP=1.0实例求解流程图:创建插值节点矩阵x及其对应的函数值矩阵y调用lagrange函数求x=0.54处的函数值图2 实例求解流程图3、源程序代码Lagrange差值源程序:%lagrange insertfunction y=lagrange(x0,y0,x)n=length(x0);m=length(x); %确定差值节点个数n、待求节点个数mfor i=1:m %最外层循环,循环求解各待求节点处的函数值z=x(i); %依次将差值节点值赋给变量zs=0.0; %s为累加和变量,赋初值0.0for k=1:n %第二层循环,求累加和p=1.0; %p为连乘积,赋初值1.0for j=1:n %第三层循环,求连乘if j~=k %连乘循环节p=p*(z-x0(j))/(x0(k)-x0(j));endend%第三层循环结束,连乘结果为ps=p*y0(k)+s; %累加循环节end%第二层循环结束,累加结果为sy(i)=s; %将累加结果赋给变量y(i),y(i)即为待求节点函数值end%最外层循环结束,求得待求节点函数值矩阵y实例求解源程序:%runlagrangex=[0.4:0.1:0.8]; %创建插值节点矩阵x及其对应的函数值矩阵yy=[-0.916291 -0.693147 -0.510826 -0.356675 -0.223144];lagrange(x,y,0.54) %调用Lagrange函数求0.54处的函数值4、程序运行结果ans =-0.616142715200000二、编程解决以下科学计算和工程实际问题A、给定由N个力F i⃗⃗⃗ (i=1,2,…,N)组成的平面任意力系,求其合力。
实验4Matlab程序设计1

实验4 Matlab程序设计1实验目的:1、掌握建立和执行M文件的方法;2、掌握实现选择结构的方法;3、掌握实现循环结构的方法。
实验内容:1. 从键盘输入一个4位整数,按如下规则加密后输出。
加密规则:每位数字都加上7,然后用和除以10的余数取代该数字;再把第一位与第三位交换,第二位与第四位交换。
2. 求分段函数的值。
2x +x-6, x <0且x式-3y = *x2—5x + 6 0Wxc 5 且x 式2及x 式3X2 _ X -1 其他用if语句实现,分别输出x=-5,-3,0,1,2,2.5,3,5时的y值。
3. 输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中90~100分为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。
要求:(1)分别用if语句和swich语句实现。
(2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。
4. 硅谷公司员工的工资计算方法如下:(1)工作时数超过120小时者,超过部分加发15% ;(2)工作时数低于60小时者,扣发700元;(3)其余按每小时84元计发。
试编程按输入的工号和该号员工的工时数,计算应发工资。
5. 设计程序,完成两位数的加、减、乘、除四则运算。
即:输入两个两位随机整数,再输入一个运算符号,做相应的运算,并显示相应的结果。
6. 建立5X 6矩阵,要求输出矩阵的第n行元素。
当n值超过矩阵的行数时,自动转为输出矩阵的最后一行元素,并给出出错信息。
7. 产生20 个两位随机整数,输出其中小于平均数的偶数。
实验代码及实验结果1.>> a=input(' 请输入一个四位整数:');请输入一个四位整数:9988>> a1=fix(a/1000);>> a2=rem(fix(a/100),10);>> a3=rem(fix(a/10),10);>> a4=rem(a,10);>> a1=rem(a1+7,10);>> a2=rem(a2+7,10);>> a3=rem(a3+7,10);>> a4=rem(a4+7,10);>> b=a1;a1=a3;a3=b;>> b=a2;a2=a4;a4=b;>> c=a1*1000+a2*100+a3*10+a4;>> disp(c)3.>> a=input C请输入一个四位整数:一); 请输人一个四f立整數:3988 »(a/1000);>> a2=ren(fix(a/100), 10);>> a3=ren(fiK(a/10)?10);>> 血(a, ID);» al=re&(al+^ 10);>> a^rsB(a2+7f 10);>> a3=rem(a3+7? 10):>> 丑"“血(M+C 10);>> b=al:a1=a3:a3=b;» b=a2:a2=a4:a4=b,» c-al *100(Hai2*l 0(H-a3*l 0+ttl;>> disp(c)55662.x=input('请输入x的值:');if x<0 & x~=-3y=x92+x-6;elseif x>=0 & x<5 & x~=2 & x~=3y=x.A2+5.*x+6elsey=x.A2-x-1;end请输入孟的値:[-瓦-亠0,1, 2t2. E f 3, 5]7 =29. 0000 IL ODDO -I. 0000 -1.0000 1. OODO 2.7500 5. QOOD(1) if语句:a=i nput('请输入成绩:');ig.ooooif a>=90 & a<=100disp('A');elseif a>=80 & a<90disp('B');elseif a>=70 & a<80disp('C');elseif a>=60 & a<70disp('D');elseif a<60 &a>=0disp('E');elsedisp('输入有误!'); end( 2) switch 语句:a=input(' 请输入成绩:'); switch fix(a/10)case{9}disp('A');case{8}disp('B');case{7}disp('C');case{6}disp('D');case nu m2cell(2:5)disp('E')otherwisedisp('输入有误!');end请输入咸绩:80E请输入咸绩;5E请输入成绩:1212输入有误I»4.n=i nput('请输入工号:’);a=i nput('请输入工作小时数:'); if a>=120 y=a*84+a*84*0.15;elseif a<120 & a>=60y=a*84;elsey=a*84-700;disp(y);end请输入工号:30请输入工作小时数:231232。
matlab程序设计实例解析

matlab程序设计实例解析MATLAB程序设计实例解析1.引言在本文档中,我们将详细分析几个MATLAB程序设计的实例,以帮助读者理解并掌握MATLAB的基本概念和应用。
每个实例都将包括程序代码、运行结果和解析过程。
2.实例一:________计算圆的面积2.1 实例描述本实例将演示如何使用MATLAB计算圆的面积。
给定圆的半径,程序将计算并输出圆的面积。
2.2 程序代码```% 计算圆的面积radius = input('请输入圆的半径:________')area = pi radius^2。
disp('圆的面积为:________', num2str(area))```2.3 运行结果及解析输入圆的半径为3,运行程序后,输出结果为:________```圆的面积为:________28.2743```程序中使用了`input`函数获取用户输入的半径值,并将其存储在变量`radius`中。
接着,通过`pi radius^2`计算圆的面积,并以字符串形式输出。
3.实例二:________矩阵相加3.1 实例描述本实例将演示如何使用MATLAB进行矩阵相加的运算。
给定两个矩阵,程序将计算并输出它们的和。
3.2 程序代码```% 矩阵相加matrix1 = 1, 2, 3。
4, 5, 6。
7, 8, 9。
matrix2 = 9, 8, 7。
6, 5, 4。
3, 2, 1。
sum_matrix = matrix1 + matrix2。
disp('两个矩阵的和为:________')disp(sum_matrix)```3.3 运行结果及解析运行程序后,输出结果为:________```两个矩阵的和为:________10 10 1010 10 1010 10 10```程序中,我们事先定义了两个矩阵`matrix1`和`matrix2`。
通过`matrix1 + matrix2`进行矩阵相加运算,并将结果存储在变量`sum_matrix`中。
MATLAB程序设计实验1

测试数据:
b3= linspace(0,10,5)
4)定数对数采样的方法(logspace(a,b,n)):
n为数组的总个数,a为第一个元素,b为数组的最后一个元素。经过常用对数采样生成一维数组。
测试数据:
b4=logspace(-1,1,4)
[px,py] = gradient(z,.2,.2);
contour(v,v,z), hold on, quiver(v,v,px,py), hold off
4)fminbnd、fminsearch、fminunc极值
x1 = 0;
x2 =2*pi;
[x,y] = fminbnd(@func,x1,x2)
a5=tril(a)
a6=triu(a,1)
5.字符串数组的创建和操作实验
1)字符串的创建
a.直接输入的方法创建字符串数组
在直接创建数组的时候,可以直接用单引号将字符串括起来作为一个字符串数组,字符窗中如果有单引号,可以利用转义的方法,在单引号前面在加一个单引号。一个字符串的数组还可以由其他的字符串数组拼接而成。
e./f
11)克罗内克张量积
kron(a,b)表示利用a的每一个元素和b矩阵相乘,乘后分别作为结果矩阵的一块.
a=[1,2,3;4,5,6];
b=[1,0,0;0,1,0;0,0,1];
kron(a,b)
kron(b,a)
12)逻辑与&
当数组中的元素数字不为0,均表示逻辑1。
a=[1,2,3];
b=[3,4,5];
a.cat函数
cat函数用于连接数组,标准形式为c=cat(dim,A1,A2,A3,…)其中,dim表示传见数组的维数,A1,A2,A3表示各个维度上的数组。
矩量法matlab程序设计实例

矩量法matlab 程序设计实例:Hallen 方程求对称振子天线一、条件和计算目标 已知:对称振子天线长为L ,半径为a ,且天线长度与波长的关系为λ5.0=L ,λ<<<<a L a ,,设1=λ,半径a=0.0000001,因此波数为πλπ2/2==k 。
目标:用Hallen 方程算出半波振子、全波振子以及不同λ/L 值的对应参数值。
求:(1)电流分布(2)E 面方向图 (二维),H 面方向图(二维),半波振子空间方向性图(三维) 二、对称振子放置图图1 半波振子的电流分布半波振子天线平行于z 轴放置,在x 轴和y 轴上的分量都为零,坐标选取方式有两种形式,一般选取图1的空间放置方式。
图1给出了天线的电流分布情况,由图可知,当天线很细时,电流分布近似正弦分布。
三、Hallen 方程的解题思路()()()()21''''12,cos sin sin 'z ziz z zzi z kz G z z dz c kz c kz E k z z dz j ωμ'++=-⎰⎰ 对于中心馈电的偶极子,Hallen 方程为()22'1222('),'cos sin sin ,2L L iL L V i z G z z dz c kz c kz k z z j η+--++=<<+⎰脉冲函数展开和点选配,得到()1121,''cos sin sin ,1,2,,2nnNz in m m m m z n V I G z z dz c kz c kz k z m N j η+''=++==⋅⋅⋅∑⎰上式可以写成 1122,1,2,,N nmn m m m n Ip c q c s t m N -=++==⋅⋅⋅∑矩阵形式为⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-----N N N N N N N N N N N t t t t c c I I I s q p p p s q p p p s q p p p 121211321,322,21,223221,11,11312,,,,,,,,,,,,,四、结果与分析(1)电流分布图2 不同λ/L 电流分布图分析:由图2可知半波振子天线λ/L =0.5的电流分布最大,馈点电流最大,时辐射电阻近似等于输入电阻,因为半波振子的输入电流正好是波腹电流。
第2章 MATLAB语言程序设计实例解析

【例2-6】switch语句实例 (原题见书本【例2-40】)。
• • • • • • • • • • • • • • • • • 解:首先我们要提取出开关表达式,这里若直接选用price作为开关表达式,则表达式i 则不好表示,因为price的取值理论上是无穷的,考虑到将price化为整数,这样图2-9中 的表达式i也就不难表示了。下面给出具体的程序: price=input('请输入商品价格:'); switch fix(price) case num2cell(0:199) % 价格小于200 rate=0; case num2cell(200:499) % 价格大于等于200但小于500 rate=3/100; case num2cell(500:999) % 价格大于等于500但小于1000 rate=5/100; case num2cell(1000:2499) % 价格大于等于1000但小于2500 rate=8/100; case num2cell(2500:4999) % 价格大于等于2500但小于5000 rate=10/100; otherwise % 价格大于等于5000 运行结果: rate=14/100; 请输入商品价格:1225 end sale_price =1127 sale_price=price*(1-rate) % 输出商品实际销售价格
【例2-1】隐函数的求导。
• 对于隐函数求偏导问题时,diff()函数并不能直接用于求解。考虑到隐 函数偏导数求解的一般方法:假设隐函数的数学表达式为
f ( x1 , x2 ,L , xn ) = 0
• 则可以通过隐函数求出自变量之间的偏导数。具体可以用下面的公式
∂xi • 求出 : ∂x j
∂ f ( x1 , x2 ,L , xn ) ∂x ∂xi =− j ∂ ∂x j f ( x1 , x2 ,L , xn ) ∂xi
Matlab交互式程序设计教程及举例

Matlab交互式程序设计教程及举例第一篇:Matlab交互式程序设计教程及举例Matlab交互式程序设计教程及举例一、创建GUI(Graphics User Interface)新文件和编辑已经存在的GUI文件1、在matlab命令窗口中键入guide,弹出如下的对话框:这是一个双页面对话框,分别用于创建新文件和打开已存在的GUI文件,鼠标点击相应的标题即可切换。
2、图中可见“创建新的GUI”有四种模版选项,不管其它几个,点选第一项,按“OK‘按钮可打开如图所示的GUI编辑器其中左边是控件工具栏,用户可根据自己的程序将所需要的控件用鼠标拖至右侧的编辑区域进行布局。
(用户可将鼠标悬停在各个控件图表上查看各个对象的名称)菜单栏下边是工具条,其中常用的有“”(保存当前GUI文件和相应的m文件)、“”(编写相应协调运行的m文件、“”(编辑当前控件的相应属性)、“”(创建和修改用户自己的程序菜单)、“”(保存当前文件并运行改程序)。
右下方主要区域是程序的界面布局窗口(灰色网格区域是布局区域,用户可根据程序需要用鼠标拖动该区域的右下角调整该区域的大小)。
3、此时可以按下“”图标保存该文件(自然此时程序没有任何功能,只有一个主框架),弹出文件保存对话框,在文件名处输入一个文件名(英文字母开头),如“my1”等,扩展名自动设置为“.fig”。
系统除了保存当前的界面文件外,还自动生成一个与该界面一起协调运行的“my1.m”文件,并在m文件编辑窗口中打开它。
4、浏览一下该文件,可以看到该文件中目前自动创建了3个函数:function varargout = my1(varargin)function my1_OpeningFcn(hObject, eventdata, handles, varargin)function varargout = my1_OutputFcn(hObject, eventdata, handles)这些函数声明和参数在后续的程序设计中不要做任何修改,切记!!对我们目前的应用来说第一个函数和第三个函数的程序体也不要做任何修改。
实验3 MATLAB程序设计

实验3 MATLAB程序设计实验3 MATLAB程序设计一、实验目的通过编写MATLAB程序,掌握基本的程序设计能力,提高对于MATLAB语言的熟悉度。
二、实验内容本次实验包含以下三个部分:1. 编写一个程序,计算前n项的斐波那契数列。
2. 编写一个程序,求解一个二次方程的根。
3. 编写一个程序,实现两个矩阵的相乘。
三、实验步骤1. 斐波那契数列编写一个程序,计算前n项的斐波那契数列。
斐波那契数列的前两个数为0和1,之后的每一项都是前两项的和。
matlabfunction fibonacci(n)fib = zeros(1, n);fib(1) = 0;fib(2) = 1;for i = 3:nfib(i) = fib(i-1) + fib(i-2);enddisp(fib);end2. 二次方程的根编写一个程序,求解一个二次方程的根。
用户输入三个系数a、b 和c,程序返回求解得到的根。
matlabfunction [x1, x2] = quadraticEquation(a, b, c)delta = b^2 4ac;if delta < 0fprintf('该方程无实数根\');elseif delta == 0x1 = -b / (2a);x2 = x1;fprintf('该方程有一个重根:x = %.2f\', x1);elsex1 = (-b + sqrt(delta)) / (2a);x2 = (-b sqrt(delta)) / (2a);fprintf('该方程有两个根:x1 = %.2f, x2 = %.2f\ ', x1, x2);endend3. 矩阵相乘编写一个程序,实现两个矩阵的相乘。
用户输入两个矩阵,程序返回相乘得到的矩阵。
matlabfunction result = matrixMultiply(matrix1, matrix2)[m1, n1] = size(matrix1);[m2, n2] = size(matrix2);if n1 ~= m2fprintf('矩阵无法相乘!\');result = ;elseresult = zeros(m1, n2);for i = 1:m1for j = 1:n2for k = 1:n1result(i, j) = result(i, j) + matrix1(i, k) matrix2(k, j);endendendendend四、实验结果1. 斐波那契数列:输入n=10,输出[0 1 1 2 3 5 8 13 21 34]。
实验3MATLAB程序设计

实验3MATLAB程序设计实验目的:学习使用MATLAB进行程序设计,掌握MATLAB中的函数、循环和条件语句的使用。
实验内容:设计一个MATLAB程序,实现以下功能:1.根据给定的身高和体重计算BMI指数;2.根据BMI指数判断体重状况,分为偏瘦、正常、超重和肥胖四种情况;3.将计算得到的BMI指数和体重状况进行输出。
实验步骤:1.首先,创建一个新的MATLAB脚本文件,命名为"BMI.m";2. 定义两个变量,height表示身高(单位:米),weight表示体重(单位:千克);3.根据给定的身高和体重计算BMI指数,使用公式:BMI = weight / (height^2);4. 利用MATLAB中的条件语句,判断BMI指数对应的体重状况,将结果存储在一个字符串变量status中,例如:当BMI < 18.5时,status = '偏瘦';当18.5 <= BMI < 24时,status = '正常';当24 <= BMI < 28时,status = '超重';当BMI >= 28时,status = '肥胖';5. 输出计算得到的BMI指数和体重状况,使用MATLAB中的disp函数,例如:disp(['BMI指数为:', num2str(BMI)]);disp(['体重状况为:', status]);6.保存并运行脚本文件,输入身高和体重,观察输出结果。
实验注意事项:1.身高应为正数,体重应为非负数;2.在计算BMI指数时,注意身高的单位应与体重的单位相匹配;3.判断体重状况时,注意条件语句的范围划分,避免重叠和遗漏;4.观察输出结果,检查是否符合预期。
实验总结:本次实验通过设计一个MATLAB程序,实现了根据身高和体重计算BMI指数并判断体重状况的功能。
MATLAB实验报告二

实验二 Matlab语言程序设计一、实验内容:1、编写命令文件:计算 1+2+…+n<2000 时的最大 n 值;>> n=1; %将变量初值设为1sum=0;while((sum+n)<2000) %若s<2000成立,则执行下一条语句,否则结束本循环sum=sum+n; %求和运算n=n+1;endsum,n-1 %显示最终s和nsum =1953ans =622、编写函数文件:分别用 for 和 while 循环结构编写程序,求 2 的 0 到 15 次幂的和。
function xunhuan(x)sum=0;for(i=0:x)sum=sum+2^i;endy=sum>> xunhuan(15)y =65535function whilexun(x)sum=0;i=0;while(i<x)sum=sum+2^i;i=i+1;endy=sum>> whilexun(16)y =655353、如果想对一个变量 x 自动赋值。
当从键盘输入 y 或 Y 时(表示是),x 自动赋为 1;当从键盘输入 n 或 N 时(表示否),x 自动赋为 0;输入其他字符时终止程序。
a=input('输入一个字符:');switch acase 'y'x=1case 'Y'x=1case 'n'x=0case 'N'x=0otherwiseend输入一个字符:'Y'x =1二、实验思考题1.用FOR和WHILE语句有何要求?答:for语句的基本命令格式为for 循环变量=表达式1表达式3表达式2循环语句组End表达式1、表达式3、表达式2的定义和C语言相似即首先执行循环变量的初始值赋成表达式1的值然后判断循环变量的值介于表达式1和表达式2的值之间则执行循环体中的语句否则结束循环语句的执行。
matlab程序设计实例解析

matlab程序设计实例解析MATLAB程序设计实例解析一、简介本文旨在通过实例解析的方式,介绍MATLAB程序设计的基本概念和技巧。
通过这些实例,读者将能了解如何使用MATLAB进行数据处理、算法实现和可视化。
二、MATLAB基础知识2.1 MATLAB环境的搭建在本章中,我们将介绍如何安装、配置和启动MATLAB环境。
包括MATLAB的版本选择、安装过程中的注意事项以及常见问题解答。
2.2 MATLAB基本语法与数据类型这一章节将介绍MATLAB的基本语法和数据类型。
包括变量的定义、运算符的使用、条件语句和循环结构等。
同时也会介绍MATLAB 中常用的数据类型,如数值型、字符型和数组等。
2.3 MATLAB函数的使用在本章中,我们将介绍如何定义和使用MATLAB函数。
包括函数的输入输出、函数的封装与调用以及函数的文件组织。
同时还会介绍MATLAB内置函数的使用和自定义函数的实现。
2.4 MATLAB数据处理这一章节将探讨MATLAB中数据处理的基本技巧。
包括数据导入、数据清洗与预处理、数据统计和数据可视化等。
同时还会介绍MATLAB中常用的数据处理工具箱的使用方法。
三、MATLAB算法实现3.1 数值计算与优化方法在本章中,我们将介绍MATLAB中数值计算和优化方法的实现。
包括数值积分、数值微分、方程求解和最优化等。
同时还会介绍MATLAB中常用的数学工具箱和优化工具箱的使用方法。
3.2 信号处理与滤波器设计这一章节将探讨MATLAB中信号处理和滤波器设计的应用。
包括信号处理基础、时域与频域分析、滤波器设计和滤波器实现等。
同时还会介绍MATLAB中常用的信号处理工具箱的使用方法。
3.3 图像处理与计算机视觉在本章中,我们将介绍MATLAB中图像处理和计算机视觉的应用。
包括图像读取与显示、图像增强与滤波、特征提取和目标检测等。
同时还会介绍MATLAB中常用的图像处理工具箱和计算机视觉工具箱的使用方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB 程序设计方法及若干程序实例樊双喜 (河南大学数学与信息科学学院开封475004)摘要本文通过对 MATLAB 程序设计中的若干典型问题做简要的分析和总结,并在此基础上着重讨论了有关算法设计、程序的调试与测试、算法与程序的优化以及循环控制等方面的问题.还通过对一些程序实例做具体解析,来方便读者进行编程训练并掌握一些有关MATLAB 程序设计方面的基本概念、基本方法以及某些问题的处理技巧等.此外,在文章的最后还给出了几个常用数学方法的算法程序, 供读者参考使用.希望能对初学者进行 MATLAB 编程训练提供一些可供参考的材料,并起到一定的指导和激励作用,进而为MATLAB 编程入门打下好的基础. 关键字算法设计;程序调试与测试;程序优化;循环控制1 算法与程序1.1 算法与程序的关系算法被称为程序的灵魂,因此在介绍程序之前应先了解什么是算法.所谓算法就是对特定问题求解步骤的一种描述.对于一个较复杂的计算或是数据处理的问题,通常是先设计出在理论上可行的算法,即程序的操作步骤,然后再按照算法逐步翻译成相应的程序语言,即计算机可识别的语言.所谓程序设计,就是使用在计算机上可执行的程序代码来有效的描述用于解决特定问题算法的过程.简单来说,程序就是指令的集合.结构化程序设计由于采用了模块分化与功能分解,自顶向下,即分而治之的方法,因而可将一个较复杂的问题分解为若干子问题,逐步求精.算法是操作的过程,而程序结构和程序流程则是算法的具体体现.1.2MATLAB 语言的特点MATLAB 语言简洁紧凑,使用方便灵活,库函数极其丰富,其语法规则与科技人员的思维和书写习惯相近,便于操作.MATLAB 程序书写形式自由,利用其丰富的库函数避开繁杂的子程序编程任务,压缩了很多不必要的编程工作.另外,它的语法限制不严格,程序设计自由度大.其最大的特点是以矩阵运算为最强,而数值的矩阵化又为运算和处理提供了方便.除此之外,MATLAB 还有着非常强大的绘图功能.1.3MATLAB 程序设计练习MATLAB 有着丰富的库函数,一般情况下应了解并学会使用一些常用的库函数,至少应熟悉函数库中都有哪些常用函数,当需要时可以现学现用.或者能对一些经典函数做一定的改造,以达到解决某一特定问题的目的.但,在大多情况下还需要自己编写程序去处理形形色色的问题.下面就先从一些较简单的程序入手来熟悉MATLAB 的编程方式.例 1 一个分类统计函数的设计(分类统计_1)编写一个函数,统计出一组有序(按升序或降序排列)数字中每种数字的个数,并返回数字种类数.分析:设待统计数组为x,因为x 有序,所以在设计算法时应抓住这个特点. 若用s1 记录已统计出的数字,则,在对x 中的数字进行遍历时,每次只需让x(i) 与 s1 中的最后一个数字进行比较就可以了,若相等,则对应计数器加1,若不等, 则说明测到新数,应开辟新的存储单元.其算法程序如下:function [s,k]=FLTJ_1(x)%x 为待统计的一组有序数,返回值s为 2 列的数组, 第一列为不同种类的数字%第二列为对应数字的个数, k 记录统计出的数字种类数目n=length(x);s1=x(1); % s1 记录测到的新数字,给其赋初值为x 的第一个数字s2=1; % s2 记录s1 中每个数字的个数,赋初值为x(1)的初始个数1k=1; % k 记录已统计出的数字种类数,初值赋为1for i=2:n % 从第2 项开始遍历数组xif x(i)==s1(k) % 如果x(i)与已测出的最后1 个数字相同, s2(k)=s2(k)+1; % 则对应的计数器加1else % 否则,则说明测到新数字endk=k+1; % k 值加1s1=[s1;x(i)]; % 将此新数并入s1, s2=[s2;1]; %对应的计数器为1 ends=[s1,s2]; % 将s1 与s2 拼接成一个两列的数组s程序运行如下(“↵ ”代表回车,下同.)>> x=[1,2,2,3,3,4,5,5]; ↵>> [s,k]=FLTJ_1(x) ↵s =1 12 23 24 15 2k =5例 2 一个数字游戏的设计有这样一个数字游戏:在一个20 ⨯ 10 的矩阵中,0~99 这100个数顺序排列在奇数列中(每20 个数组成一列),另有100 个图案排列在偶数列中,这样每个数字右边就对应一个图案.你任意想一个两位数a,再让a 减去它的个位数字与十位数字之和得到一个数b,然后,在上述矩阵的奇数列中找到b,将b 右边的图案记在心里,最后点击指定的按钮,你心里的那个图案将被显示.下面我们就来编写程序模拟一下这个小游戏,以[0,1]之间的小数代替矩阵中的图案,由MATLAB 程序实现如下:程序I% “测心术”游戏format shorta=1;t=0;while aa1=rand(100,1);k=3;s=[];while k<=10a1(9*k+1)=a1(19);k=k+1;enda2=reshape(a1,20,5);a3=reshape(99:-1:0,20,5);for i=1:5s=[s,a3(:,i),a2(:,i)]; %生成矩阵endif ~tdisp(' //任意想一个两位数a,然后将这个两位数减去它的个位数字与十位数字之和,');disp(' //得到数字 b,再在下面矩阵的奇数列中找到 b,最后记住其右边对应的小数c');pause(10); t=t+1;enddisp(' '); disp(s);pause(5); disp(' ');d=input(' //确定你已经完成计算并记下了那个小数,摁‘Enter’键呈现此数字\n');disp(s(19,2)); pause(3); disp(' ');a=input(' // ‘Enter’退出;=>‘1’再试一次\n');end使用说明:运行程序I 生成一个20 10 的矩阵s,你任意想一个两位数a, 按照上面所说的步骤操作,然后在s 的奇数列中找到b,将b 右边的小数记在心里,再调用程序II,则返回你所记下的那个小数.(运行演示略)原理说明:设任意一个两位数a=10 k1 + k2,则a-( k1+ k2)=9 k1=b,所以b 一定是9 的倍数,且只可能在9到81 之间.明白了这一点,上面程序中的各种设置就一目了然了.例 3 折半查找算法要从一个数组x 中找到一个指定的数a,通常的做法是从x 的第一个数开始顺序查找.如果x 是一个无序的数组,的确没有比顺序查找更好的方法了,但如果x 有序,设计查找算法时就要充分利用这已有的规律,折半查找就是针对有序数组进行查找的一种效率较高的方法.对于一个n 维数组,折半查找最多比较次数为'≤log2n∞ƒ +1,而顺序查找的平均比较次数为n /2 .写一个算法:在数组x 中查找数字a,其中x 是一个元素各异并按升序排列的一维数组.若找到a,则返回a在x 中的位置,若a 不在x 中则返回“找不到”.折半查找算法程序如下:function s= BinarySearch (x,a)%折半查找法,x 是按升序排列的一维数组,a 是待查找的数字n=length(x);sign=0; %用sign 标记是否查找成功,赋初值为假,当查找成功时其值为真top=1;bott=n; %查找区间端点下标,top 为“顶”,bott为“底”if a<x(1)|a>x(n) %当a比x 的最小值小或比x 的最大值大时,返回找不到此数, s='The number is not found'; %并终止程序,否则在x 的内部查找a return;elsewhile((sign==0)&(top<=bott))mid=fix((bott+top)/2); %求中位数并取整if a==x(mid) %若找到as=mid; %记录它在x 中的下标,sign=1; %并置标志变量为真elseif a<x(mid) %否则,改变区间端点下标bott=mid-1;end elsetop=mid+1; endif sign==0 %当sign 为假,说明在x 中找不到a s='The number is not found';endend运行情况如下:>> x=[1 3 4 6 8 9 12 15]; ↵>> s= BinarySearch (x,6) ↵s =4>> s= BinarySearch (x,7) ↵s =The number is not found例 4 对答卷中选择题的初步统计函数当做完一项问卷调查后,或举行完一次考试后,在对答卷中选择题的做答情况做统计分析时,需要知道每个选择题中每个选项的被选次数及所占的百分比.现假设选择题只有4 个选项(A,B,C,D),某些题目允许多选,但不得选多于2 项.(如果题目的选项或可选项增加的话,方法类似.)4 个选项分别用 1,2,3,4 表示(若选择AB,则表示为12),缺选时用0 表示.请编程序统计每个题目中每个选项的被选次数及所占的百分比.分析:若一共有n 个题目,可用两个4 ⨯ n的矩阵分别表示每个选项的被选次数与所占的百分比,在统计的过程中用数组分别为每个题目中的每个选项计数.MATLAB 程序如下:function [s1,s2]=TongJi1(A)%A 为答卷结果的数据,返回值s1,s2 分别为每个%选项的被选次数与所占的百分比[m,n]=size(A);s1=[];s2=[];D=ones(1,n).*m; %D 记录每个题目中每个选项被选次数总和,%给每个元素赋初值为mfor j=1:nB=zeros(4,1); %B 为计数器,记录每个题目中的每个选项的被选次数for i=1:mt=A(i,j);if t==0 %缺选时,在该题的总数记录中减1D(j)=D(j)-1;elseif t<10 %只选一项时,在该项的计数器上加1B(t)=B(t)+1;else %当选两项时,需分离数字,再让每项的计数器加1,%同时该题目的各项被选次数总和加1t1=floor(t/10);t2=t-t1*10;B(t1)=B(t1)+1;B(t2)=B(t2)+1;D(j)=D(j)+1;endends1=[s1,B]; %组合矩阵B1=B./D(j); %求百分比s2=[s2,B1];end附录中表 1 是一个有20 个学生作答记录的数据,若记该数据矩阵为A,调用上面的程序运行如下:?[s1,s2]=TongJi1(A)s1 =ik3 8 0 0 2 0 0 2 8 5 5 7 12 1 74 4 45 7 2 13 7 8 4 2953555s2 =0.1579 0.4211 0 0 0.1053 0 0 0.10530.4211 0.2632 0.2632 0.3684 0.6316 0.0526 0.3684 0.2105 0.2105 0.2105 0.2632 0.3684 0.1053 0.6842 0.3684 0.4211 0.2105 0.1053 0.4737 0.2632 0.1579 0.2632 0.2632 0.2632 例 5 列主元 Gauss 消去法解方程组列主元 Gauss 消去法是指在解方程组时,未知数顺序消去,在要消去的那个 未知数的系数中找按模最大者作为主元.完成消元后,系数矩阵化为上三角形,然 后在逐步回代求解未知数.列主元 Gauss 消去法是在综合考虑运算量与舍人误差 控制的情况下一种较为理想的算法.其算法描述如下: 1.输入系数矩阵 A,右端项 b2.测 A 的阶数 n,对 k=1,2,…,n -1 循环 a) 按列主元保存主元所在行的指标 i k .α = max a ikk ≤i ≤nb) 若α = 0 ,则系数矩阵奇异,返回出错信息,计算停止;否则,顺序进行. c) 若 i k = k 则转向 d);否则换行 a ↔ a , j = k + 1,…, ni k jkjb ↔ b kd) 计算乘子 m ik = a ik / a kk , i = k +1,…, n e) 消元:a ij = a ij - m ik a ik , i , j = k +1,…,nb i = b i - m ik b k , i = k + 1,…,n3.回代nb i = b i - ∑ a ij b j / a ii ,i = n , n -1, …,1j =i -1方程组的解 X 存放在右端项 b 中.MATLAB 程序如下: function s=LZYgauss(A,b)% 列主元高斯消去法解方程组:A 为系数矩阵,b 为右端项 n=length(A(:,1)); % 测量 A 一行的长度,得出 n for k=1:n-1% 循环,消元[a,t]=max(abs(A(k:n,k)));% 寻找最大值(记为 a) p=t+k-1; % 最大值所在的行记为 pif a==0% 若 a=0,则 A 为奇异阵,返回出错信息error(‘A is a bizarre matrix’); else%若 a 不等于 0,换行t1=A(k,:); A(k,:)=A(p,:); A(p,:)=t1;t2=b(k);b(k)=b(p);b(p)=t2; A,bfor j=k+1:n% 消元过程m=A(j,k)/A(k,k);A(j,:)=A(j,:)-m.*A(k,:); b(j)=b(j)-m*b(k);end A,bend endb(n)=b(n)/A(n,n); % 回代过程for i=1:n-1end q=(b(n-i)-sum(A(n-i,n-i+1:n).*b(n-i+1:n)))/A(n-i,n-i); b(n-i)=q;s=b; % 解放在s 中程序运行(略)2 程序的的调试与测试程序调试的目的是检查程序是否正确,即程序能否顺利运行并得到预期结果.在运行程序之前,应先设想到程序运行的各种情况,测试在各种情况下程序是否能正常运行.对初学编程的人来说,很难保证所编的每个程序都能一次性运行通过,而大多情况下都需要对程序进行反复的调试之后才能正确运行.所以,不要害怕程序出错,要时时准备着去查找错误,改正错误.2.1 程序常见的错误类型2.1.1 易犯的低级错误a 输入错误常见的输入错误除了在写程序时疏忽所导致的手误外,一般还有:①在输入某些标点时没有切换成英文状态;②表循环或判断语句的关键词“for”,“while”,“if”的个数与“end”的个数不对应(尤其是在多层循环嵌套语句中);③左右括号不对应等.b 对程序的修改不彻底导致的错误由于之前对程序中的某些部分(如变量或符号名称)做了修改,但后面又有用到它们或与之有关系的地方却没有做相应的修改.2.1.2 语法错误不符合MATLAB 语言的规定,即为语法错误.例如在用MATLAB 语句表示数学式“k1 ≤ x ≤ k2”时,不能直接写成“k1<=x<=k2”,而应写成“k1<=x&x<=k2”.此外,输入错误也可能导致语法错误.2.1.3 逻辑错误在程序设计中逻辑错误也是较为常见的一类错误,这类错误往往隐蔽性较强,不易查找,错误一旦发生,轻则使程序不够优化,进行很多不必要的计算,重则程序运行错误或无法运行.产生逻辑错误的原因通常是算法设计有误,这时需要对算法进行修改,但也可能算法没错,而是程序本身的问题. 下面通过一个例子来看一下发生逻辑错误的情形例分类统计_2 编写一个函数,统计出一组数字(可以是无序的)中每种数字的个数.分析:因为待排数组不一定有序,所以不能再像1.3中例1 那样在对x的遍历中只让x(i)与已测数字中的最后一个进行比较,而应与所有已测数字进行比较,当与某个数字相同时,对应计数器加 1,当与所有的数字都不同时才能说明测到新数. 如此,可设置状态标志变量来标志在每次遍历中是否测到新数.看如下程序:function [s,k]=FLTJ_2(x)% x 为待统计的一维数组,返回值s 的第一列为不同种类的数字,% s 的第二列为对应数字的个数, k 记录统计出的数字种类数目n=length(x);s1=x(1); % s1 记录测到的新数字,赋初值为x 的第一个数字s2=1; % s2 记录s1 中数字的个数,赋初值为1k=1; % k 记录已统计出的数字种类数,初值赋为1for i=2:n % 从第2 项开始遍历数组xflag=0; % 标示变量,标记是否测到新数字,此趟遍历开始前,其值应为假for j=1:kif x(i)==s1(j) % 如果x(i)与已测出的第j 个数字相同,s2(j)=s2(j)+1; % 则对应的计数器加1,并结束此次遍历break;else % 否则,则说明测到新数字,flag 置为真flag=1;endendif flag % 当flag 为真,即测到新数字,将此新数赋给%s 的第一列,对应的计数器为1,同时k 值加1end ends1=[s1;x(i)];s2=[s2;1];k=k+1;s=[s1,s2]; % 将s1 与s2 拼接成一个两列的数组此程序乍一看似乎顺理成章,看一下其运行结果>> x=[3,2,2,4,5,4]; ↵>> [s,k]=FLTJ_2(x) ↵s =3 12 22 14 25 14 1k =6输出结果显然是不对的,考虑一下问题出在哪了?事实上,当第二个“for”循环中的判断语句第一次不成立时并不能立即得出“测到新数”的结论,只有在对j 的循环结束(即循环进行到k)时,若判断语句仍不成立才能说明测到了新数.因此,应将第二个“for”循环内的判断语句修改如下(注意观察虚线框内的修改部分):if x(i)==s1(j)s2(j)=s2(j)+1;break;elseif j==k %对j 的循环进行到k 时判断语句仍不成立,%则说明测到新数,置flag 为1flag=1;end其实,还可以将标志变量flag 换一种方式使用,将程序中的循环改写如下:for i=2:n % 从第2 项开始遍历数组xflag=0; % 标示变量,标记是否测到新数字,此趟遍历开始前,其值应为假for j=1:kif x(i)==s1(j) % 如果x(i)与已测出的第j 个数字相同,s2(j)=s2(j)+1; % 则对应的计数器加1,flag=1; % 同时置flag 为1,并结束此次遍历break;endendif ~flag % 当flag 仍为假时,即测到新数字s1=[s1;x(i)];s2=[s2;1];k=k+1;end通过分析你会发现,这两种用法实际上是等效的.其实,此程序无需使用标志变量,可将循环直接写成如下形式.for i=2:nfor j=1:kif x(i)==s1(j);s2(j)=s2(j)+1;break;elseif j==ks1=[s1;x(i)];end endends2=[s2;1];k=k+1;修改后的程序运行如下:>> x=[3,2,2,4,5,4]; ↵>> [s,k]=FLTJ_2(x) ↵s =3 12 24 25 1k =4请思考一下,第一个”if”条件下如果没有”break”程序能否运行正确?想一想为什么?2.1.4 运行错误程序的运行错误通常包括不能正常运行和运行结果不正确,出错的原因一般有:① 数据不对,即输入的数据不符合算法要求(见下例).② 输入的矩阵大小不对,尤其是当输入的矩阵为一维数组时,应注意行向量与列向量在使用上的区别.③ 程序不完善,只能对“某些”数据运行正确,而对“另一些”数据则运行错误,或是根本无法正常运行,这有可能是算法考虑不周所致.看下面这个例子例在用1.3例3 中的折半查找程序做查找时输入一组命令运行如下:>> x=[3 5 2 4 7 6 11]; ↵>> s= BinarySearch (x,4) ↵s =4>> s=BinarySearch(x,5) ↵s =The number is not found分析:第一次对4 的查找返回了正确的结果,但第二次对5 进行查找时却出了错.原因是数组 x 并非有序数组,不符合折半查找的要求(要求数组为升序排列).对4 的查找正确,也仅仅是一个巧合而已,恰好在第一次“折半”中找到了它,而对5 的查找就会在4 的右边进行,自然是找不到的.2.2 程序查错的若干方法① 先查看程序中有无输入错误.② 善于利用程序运行时给出的出错信息来查找错误.③ 检查算法是否有误.④ 在一些适当的位置显示一些变量的值,看其运行情况,如果发现前面的运行正确则继续向后开设显示变量观察运行情况.⑤ 将循环控制变量的值设成某个常数,如将原来的“i=1:n”,改成“i=k”(k 为1~n 之间的一个数),再看其运行情况.下面来看一个例子,仍以折半查找算法为例.例如果在编写折半查找算法的程序时将“while ”循环下的“mid=fix((bott+top)/2)”语句写成了“mid=(bott+top)/2”,看一下其运行情况:>> x1=[1 3 4 6 8 9 12]; ↵>> s= BinarySearch(x1,8) ↵s =5>> s= BinarySearch(x1,3) ↵s =2>> x2=[1 3 4 6 8 9 12 15]; ↵>> s=BinarySearch(x2,8) ↵??? Attempted to access x2(4.5); index must be a positive integer or logical.Error in ==> BinarySearch at 12if a==x(mid) %若找到a通过上面的运行情况发现,在x1 中能正确查找,但在x2 中查找时却返回了出错信息,说是“试图访问 x2(4.5),下标必须为正整数或合乎常理”,因为数组x2 的长度为8,在第1 次“折半”时得到 (1+8)/2=4.5=mid,而数组的下标必须为整数,所以出错.事实上,当数组x 的长度n 是偶数时,第1 次“折半查找”就无法进行,因为(1+ n )/2 不是整数.当n 是奇数时,至少能进行一次,特别地当n = 2k -1 (k=1,2,3,…)时,对x 中所有元素的查找都能正常进行(分析一下,为什么?), 例如上面的x1 中恰有7 个元素,为k=3 时的情形.所以,这里还要强调的是:在对程序进行测试时,当你有幸输入了某些特殊的数据(比如,在此例中输入数组 x 的长度恰好为2k -1)发现运行正确,不要就此以为程序已经正确无误了.再回到原来的话题,通过上面的测试发现了问题所在,为了使程序对所有的n 都能正常运行,应加入对“(bott+top)/2”取整的操作,函数“fix”的作用是向0 方向取整,也可使用“floor”(朝负无穷大方向取整).3 算法与程序的优化如果一个程序通过各种测试都能正常运行并得到正确的结果,换句话说,这个程序没有任何错误,就能说它已经“完美”了吗?答案是:不一定.下面就来说一下有关算法和程序的优化问题.在设计算法和程序时往往容易只去注重算法和程序的可行性,而忽视对算法和程序的优化.当遇到一些问题需要庞大的计算量时,如果算法或程序不够优化,则难以在有限的时间内完成计算.(这一点我深有体会.)另外,虽然 MATLAB 有强大的计算功能,但这也给它带来了自身的缺点,它和其他高级程序语言相比, 程序的执行速度较慢,这就更需要去注重算法的优化问题了.即使对于那些不需要很大计算量的程序也要尽量做到优化,因为这体现了一个人的编程素质.所以要养成这样一种好的习惯,提高程序的质量.程序的优化本质上也是算法的优化,如果一个算法描述的比较详细的话,它几乎也就指定了程序的每一步.若算法本身描述的不够详细,在编程时会给某些步骤的实现方式留有较大空间,这样就需要找到尽量好的实现方式以达到程序优化的目的,但一般情况下认为算法是足够详细的.如果一个算法设计的足够“优” 的话,就等于从源头上控制了程序走向“劣质”.算法优化的一般要求是:不仅在形式上尽量做到步骤简化,简单易懂,更重要的是能用最少的时间复杂度和空间复杂度完成所需计算.包括巧妙的设计程序流程,灵活的控制循环过程(如及时跳出循环或结束本次循环),较好的搜索方式及正确的搜索对象等,以避免不必要的计算过程.例如在判断一个整数m 是否是素数时,可以看它能否被m /2 以前的整数整除,而更快的方法是,只需看它能否以前的整数整除就可以了.再比如,在求k1 与k2之间的所有素数时跳过偶数直接对奇数进行判断,这都体现了算法优化的思想.下面通过几个具体的例子来体会其中所包含的优化思想.例 1 冒泡排序算法冒泡排序是一种简单的交换排序,其基本思想是两两比较待排序记录,如果是逆序则进行交换,直到这个记录中没有逆序的元素. 该算法的基本操作是逐趟进行比较和交换.第一趟比较将最大记录放在 x[n]的位置.一般地,第i 趟从x[1]到x[n-i+1]依次比较相邻的两个记录,将这n-i+1 个记录中的最大者放在了第n-i+1 的位置上.其算法程序如下:function s=BubbleSort(x)% 冒泡排序,x 为待排序数组n=length(x);for i=1:n-1 % 最多做n-1 趟排序flag=0; % flag 为交换标志,本趟排序开始前,交换标志应为假for j=1:n-i % 每次从前向后扫描,j 从1 到 n-iif x(j)>x(j+1) % 如果前项大于后项则进行交换t=x(j+1);end end x(j+1)=x(j); x(j)=t; flag=1; % 当发生了交换,将交换标志置为真 end s=x; if (~flag) % 若本趟排序未发生交换, 则提前终止程序break ; end说明:本程序通过使用标志变量 flag 来标志在每一趟排序中是否发生了交换,若某趟排序中一次交换都没有发生则说明此时数组已经为有序(正序),应提 前终止算法(跳出循环).若不使用这样的标志变量来控制循环往往会增加不必 要的计算量.例 2 公交线路查询问题 设计一个查询算法,给出一个公交线路网中从起始站 s1 到终到站 s2 之间的最佳线路.其中一个最简单的情形就是查找直达线路,假设相邻公交车站的平均 行驶时间(包括停站时间)为 3 分钟,若以时间最少为择优标准,请在此简化条件 下完成查找直达线路的算法,并根据附录数据(数据 1),利用此算法求出以下起 始站到终到站之间的最佳路线.⑴ 242 → 105 ⑵ 117 → 53 ⑶ 179 → 201 ⑷ 16 → 162 分析:为了便于 MATLAB 程序计算,应先将线路信息转化为矩阵形式,导入 MATLAB (可先将原始数据经过文本导入 Excel ).每条线路可用一个一维数组来 表示,且将该线路终止站以后的节点用 0 来表示,每条线路从上往下顺序排列构 成矩阵 A.此算法的核心是线路选择问题,要找最佳线路,应先找到所有的可行线 路,然后再以所用的时间为关键字选出用时最少的线路.在寻找可行线路时,可先 在每条线路中搜索 s1,当找到 s1 则接着在该线路中搜索 s2,若又找到 s2,则该线 路为一可行线路,记录该线路及所需时间,并结束对该线路的搜索.另外,在搜索 s1 与 s2 时若遇到 0 节点,则停止对该数组的遍历.下面是实现这一算法的一个程序,看它是否做到了足够的优化.function [L,t]=DirectLineSearch(A,s1,s2)%直达线路查询%A 为线路信息矩阵,s1,s2 分别为起始站和终到站.%返回值L 为最佳线路,t 为所需时间[m,n]=size(A);L1=[];t1=[]; % L1 记录可行线路,t1 记录对应线路所需时间for i=1:mfor j=1:nif A(i,j)==s1 %若找到s1,则从下一站点开始寻找s2 for k=j+1:nif A(i,k)==0 %若此节点为0,则跳出循环break;elseif A(i,k)==s2 %若找到s2,记录该线路及所需时间,%然后跳出循环end endendendendL1=[L1,i];t1=[t1,(k-j)*3];break;m1=length(L1); %测可行线路的个数if m1==0 %若没有可行线路,则返回相应信息L='No direct line';t='Null';elseif m1==1L=L1;t=t1; %否则,存在可行线路,用L 存放最优线路,t 存放最小的时间elseL=L1(1);t=t1(1); %分别给L和t 赋初值为第一条可行线路和所需时间for i=2:m1if t1(i)<t %若第i 条可行线路的时间小于t,L=i; %则给L和t 重新赋值,t=t1(i);elseif t1(i)==t %若第i 条可行线路的时间等于t,L=[L,L1(i)]; %则将此线路并入Lend endend首先说明,这个程序能正常运行并得到正确结果,但仔细观察之后就会发现它的不足之处:一个是在对j 的循环中应先判断节点是否为0,若为0 则停止向后访问,转向下一条路的搜索.另一个是,对于一个二维的数组矩阵,用两层(不是两个)循环进行嵌套就可以遍历整个矩阵,得到所有需要的信息,而上面的程序中却出现了三层循环嵌套的局面.其实,在这种情况下,倘若找到了 s2,本该停止对此线路节点的访问,但这里的“break”只能跳出对k 的循环,而对该线路数组节点的访问(即对j 的循环)将会一直进行到n,做了大量的“无用功”.为了消除第三层的循环能否对第二个循环内的判断语句做如下修改:if A(i,j)==s1continue;if A(i,k)==s2L1=[L1,i];t1=[t1,(k-j)*3];break;endend这种做法企图控制流程在搜到 s1 时能继续向下走,搜索 s2,而不用再嵌套循环.但这样却是行不通的,因为即使s1 的后面有s2,也会被先被“ifA(i,j)==s1”拦截,“continue”后的语句将不被执行.所以,经过这番修改后得到的其实是一个错误的程序.事实上,若想消除第三层循环可将这第三层循环提出来放在第二层成为与“j”并列的循环,若在对j 的循环中找到了s1,可用一个标志变量对其进行标志, 然后再对s1 后的节点进行访问,查找s2.综上,可将第一个“for”循环内的语句修改如下:flag=0; % 用flag 标志是否找到s1,为其赋初值为假for j=1:nif A(i,j)==0 %若该节点为0,则停止对该线路的搜索,转向下一条线路break;elseif A(i,j)==s1 %否则,若找到s1,置flag 为真,并跳出循环flag=1;break;endendif flag %若flag 为真,则找到s1,从s1 的下一节点开始搜索s2 for k=j+1:nif A(i,k)==0break;elseif A(i,k)==s2 %若找到s2,记录该线路及所需时间,%然后跳出循环end endendL1=[L1,i];t1=[t1,(k-j)*3];break;若将程序中重叠的部分合并还可以得到一种形式上更简洁的方案:。