一、M文件
1、脚本文件
(1)英文字母开头命名
(2)所产生的所有变量驻留在base workspace,只要不用clear,就只有关闭MATLAB,才会被删除
2、函数文件
(1)function
(2)函数调用完毕,function workspace删除
二、MATLAB程序流控制与调试
1、MATLAB程序流控制(几乎同C)
(1)if-else-end
(2)switch-case-otherwise-end
(3)for
>> for ix=[1 2 3;4 5 6;7 8 9]
a=ix,
end
打印列循环
(4)while
(5)try-catch
(6)continue,break,pause,return
2、MATLAB程序调试
(1)运行错误:
a.将可能出错语句后面的;去掉
b.如果是一个函数文件,注释function所在行,使其变成脚本文件,便于在命令窗口查看运行结果
c.clear 、 clear all清除以前的运行结果
d.keyboard 增加交互性
(2)断点设置方法(3‘):
a.’-‘点击后变红
b.放光标,F12
c.dbstop
三、示例
问题:
一只失明的小猫不幸掉进山洞里。山洞有三个门。其中第一个门进去后走2小时可以回到地面;第二个门进去后走4小时回到原点;第三个门进去后走6小时回到原点;.小猫由于失明,每次随机选择一个门。问题是:小猫走出山洞的期望时间?
分析:设期望时间为 t
t = 2*(1/3)+(4+t)*(1/3)+(6+t)*(1/3)
t = 12
思路(MATLAB):
输入正整数 n 为小猫出洞次数,生成一个 1*n 的数组 T 用来记录每次出洞时间,初始值为0;k 从 1 循环到 n ,T(k) 用来记录每次实际出洞时间;随机等概率生成{1,2,3} 中的一个数 c 。
c = 1 , T(k) = T(k) + 2 ,小猫出洞,开始下一次模拟(就是上地面上来了,结束掉了)
c = 2 , T(k) = T(k) + 4
c = 3 , T(k) = T(k) + 6 , 直到 c = 1 为止
n 次模拟之后,计算平均值求近似......
求解:
function T =cat_in_holl(varargin)
%varargin,是函数可以接受参数个数不定的输入
if ~isempty(varargin)%输入参数非空
n=varargin{1};%varargi为cell型数组,取其第一个元素赋值给n
end
%try-catch结构用法示例
try
%如果n是正整数,下面的语句不会发生错误,进而执行结构之后的语句
%否则会发生错误,执行catch引导的语句
if n>0&&mod(n,1)==0;%n为正整数
%空语句,不会报错
else
error;
end
catch ME %yongNE来记录发生错误的一些信息
disp(\'函数没有输入参数或者输入的参数不是正整数标量\');
T=[];%geiT赋空值
return;%函数后面语句不再执行
end
%switch-case-end
switch nargin %函数输入参数个数
case 1
T=zeros(1,n);
for k=1:n;
c=unidrnd(3,1);
while c~=1
if c==2
T(k)=T(k)+4;
else
T(k)=T(k)+6;
end
c=unidrnd(3,1);
end
T(k)=T(k)+2;
end
case 2
T=[];
disp(\'函数只能有一个输入参数,且为正整数\');
otherwise
T=[];
disp(\'函数输入的参数个数不能大于1,,且为正整数\');
end
>> n=1e4;
>> T=cat_in_holl(n);
>> mean(T)
ans =
11.8704
>> T=cat_in_holl(n);
>> mean(T)
ans =
11.8860
n越大, 越接近
四、匿名函数、子函数、嵌套函数
1、匿名函数:
fhandle=@(arglist)expr
fhandle:句柄
arglist:自变量
expr:表达式
2、子函数:
在同一函数文件中,主函数之后由 “function” 引导的函数,小心死循环
3、嵌套函数:
(1)开始以 function 声明,结尾+ end
(2)嵌套函数访问父函数的变量,可以在函数定义里直接拿过来用;父函数访问嵌套在其内的函数里的变量,必须调用
(3)彼此没有关系的嵌套函数间不能共享变量,只能通过父函数
(4)父函数只能调用嵌套在其中的第一重嵌套函数;但无论第几重嵌套函数,都可以调用其父函数,或其父函数的父函数
(5)总个小结:
父子可以相互求助;不能求助后代,可以求助直系祖宗,及其直系祖宗是亲兄弟的先人;可以求助自己的亲兄弟或者亲叔伯,不能求助侄子
五、四的应用示例
1、匿名函数:
>> f=@(a)@(x)exp(x)+x^a+x^(sqrt(x))-100;
>> format long
>> aa=0:0.01:2;
>> plot(aa,arrayfun(@(a)fzero(f(a),4),aa),\'b-\');
>> xlabel(\'$a$\',\'Interpreter\',\'latex\',\'FontSize\',15);
>> ylabel(\'$x$\',\'Interpreter\',\'latex\',\'FontSize\',15);
>> title(\'$\mathrm{e}^{x} + x^{\sqrt{x}} + x^a - 100$\',\'Interpreter\',\'latex\',\'FontSize\',15);
显示隐函数:
(ey+xy)1/y-x2y=0
>> y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);
求积分区域:
sin2x/x2的积分值为0.99pi,求其关于0对称的积分区域
>> u0=fzero(@(u)0.99*pi/2 - quadl(@(x)sin(x).^2./(x.^2),0,u),1)
u0 =
32.313810358217296
2、子函数,嵌套函数:
(1)积分上限
(2)gui:
%三角形 function triangle_table %生成界面,默认控件属性为\'normalized\',即随界面大小而变化 %figure的编号去掉,不显示菜单项 fig=figure(\'defaultuicontrolunits\',\'normalized\',\'name\',\'triangle_table\',... \'numbertitle\',\'off\',\'menubar\',\'none\'); %建立坐标轴,但是不显示 ah=axes(\'Pos\',[0.1,0.2,0.75,0.75],\'visible\',\'off\'); %建立滚动条,回调函数为change_color slider_h=uicontrol(\'style\',\'slider\',\'units\',\'normalized\',\'pos\',... [0.1,0.05,0.75,0.05],\'sliderstep\',[1/6,0.05],\'callback\',@change_color); %画网格并填好数字 hold on for k=0:6 plot(0:6-k,(6-k)*ones(1,(7-k)),\'k\'); plot(k*ones(1,(7-k)),k:6,\'k\'); end plot([0,6],[0,6],\'k\'); hold off; for x=1:5 for y=1:x text(y-0.5,x+0.5,num2str(x),\'color\',\'k\',\'tag\',\'number\'); end end for k=0:5 text(k+0.1,k+0.5,[num2str(k),\'.5\'],\'tag\',\'number\'); end %============滚动条的回调函数================ function change_color(hobject,eventdata) v=round(6*get(slider_h,\'value\')); num_h=findobj(\'tag\',\'number\'); num_pos=get(num_h,\'pos\'); red_num_logic=cellfun(@(x)(x(1)<=v && x(2)<=v),mun_pos); set(num_h(red_num_logic),\'color\',\'r\'); set(num_h(~red_num_logic),\'color\',\'k\'); end end
有点问题。。。