matlab中choll,matlab程序设计 - osc_popfjd1t的个人空间 - OSCHINA - 中文开源技术交流社区...

一、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为正整数%空语句,不会报错elseerror;

endcatch ME %yongNE来记录发生错误的一些信息

disp('函数没有输入参数或者输入的参数不是正整数标量');

T=[];%geiT赋空值return;%函数后面语句不再执行

end%switch-case-endswitch nargin %函数输入参数个数case 1T=zeros(1,n);for k=1:n;

c=unidrnd(3,1);while c~=1

if c==2T(k)=T(k)+4;elseT(k)=T(k)+6;

end

c=unidrnd(3,1);

end

T(k)=T(k)+2;

endcase 2T=[];

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 onfor k=0:6plot(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

endfor k=0:5text(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

有点问题。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值