当前位置:文档之家› matlab-代码-规范

matlab-代码-规范

matlab-代码-规范
matlab-代码-规范

1.标识符命名原则

标识符的名字应当直观,其长度应当符合“最小长度,最大信息量”原则。

1)非矩阵变量:

?变量名应该以小写字母开头的大小写混合形式譬如:shadowFadingTable,servingSector,rxBufferForRe userID,userPriorityPro等

?循环变量应该以i、j、k等为前缀,如

for i_File = 1:nFiles

for j_Position = 1:nPositions

?避免仅用最后的字母s(表示单复数)区别两个变量, 例如point和points. 可以用类似pointArray的形式加以区别。

?避免使用一个关键字或者特殊意义的字作为变量名

?结构体的命名应该以一个大写字母开头,结构体的命名应该是暗示性的,并且不需要包括字段名(fieldname)应采用Segment.length,避免用Segment.SegmentLength 2)常数:

?命名常数(包括全局变量)应该采用大写字母,用下划线分割单词,如MAX_ITERA TIONS,COLOR_RED

?参数可以以某些通用类型名作为前缀,如COLOR_RED,COLOR_GREEN

3)草稿变量,含矩阵,结构体,元胞:

?应用范围比较大的变量应该具有有意义的变量名,作为“草稿变量”的的临时存储空间或者索引可以用短名字。程序员在读到这样的变量的时候,可以假定这个变量

的值在没有几行之后的代码中就不会再用到。通常的“草稿变量”整数的时候用i,

j,k,m,n(最好少用i,j,因为他们作为MA TLAB中的永久性常量表示虚数单

位的)。双精度数的时候常用x,y和z。m表示矩阵,没有m表示标量?命名上将cell, struct与MA TLAB中最常见的numeric array, 即数值矩阵区分开来.

?n用于整数变量, 如n_File.

?m用于一般的矩阵,如matrix_channelHFResponse;

?c用于cell array, 如cell_temp= cell(1, 4);

?s用于struct array, 如stuct_user= struct('field', {});

?matrix,cell,stuct后面的channelHFResponse,user用来表示有特定含义的中间变量,比如matrix_channelHFResponse,用来表示计算channelHFResponse时中间变量。4)函数:

?函数名应该采用小写字母,函数名应该是具有意义的,下划线分割单词

如采用:compute_total_width()避免compwid()

?前缀get/set 应该作为访问对象或者属性的保留前缀,如getobj(.)。

?前缀compute应该用在计算某些量的函数的地方computespread()。

?前缀is应该用在布尔函数的命名的地方,如iscomplete()。

?Find,initialize类似。

2.编码及文档注释要求及实例

2.1代码版式

2.1.1M文件函数说明

function [ 函数输出参数] = 函数名( 函数输入)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %此处为函数名,如果不是函数文件就取消此行

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %创建人:

%日期:

%修改人:

%日期:

%函数变量及功能的简单描述

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --函数主体

2.1.2编码设计

本部分说明了M文件编码的设计,包括以下几个方面:

垂直间隔,水平间隔,缩进与对齐,注释。

2.1.2.1垂直间隔

1、空行

空行起着分割块或段落的作用,块(段落)之间一般留一个或两个空行。

空行使用规则:

?逻辑块之间要留空行;

?结构体定义之间要留空行;

?函数定义体之间要留空行;

?函数体内,完整的控制结构和单独的语句块之间要留空行;

?逻辑上密切相关的语句序列之间不要留空行;

2、换行注意事项

?不在一行使用多个语句。唯一的例外是for语句。For语句的初始化,条件和循环都可以在一行中。例如

for (bcnl_num = 0; bcnl_num < count; bcnl_num++)

或者还有switch语句,如果动作很短并且相同的话(后面有详细描述)。

If语句并不是例外:执行语句总是另起一行。例如:

if (bcnl_num > count)

bcnl_num = count;

?{}与case总是独占一行。

2.1.2.2水平间隔

?逗号后面要有空格,但是不要在结构的成员与指针操作符前后有空格。例如:

foo.index

?在=,&&,+,-,>, <与|| 前后加上空格,包括:如

simpleAverage = (firstTerm + secondTerm) / two;

1 : nIterations

?另起一行时,后面一行和前面一行中要继续的地方对齐:

weithedPopulation = (doctorWeight * nDoctors) + …

(layerWeight * nLawyers) + …

(chiefWeight * nChiefs);...

function (param1,param2,…

param3)

2.1.2.3长行拆分

一行代码不能超过180个字符。长行拆分时,在逻辑断点处分行。拆分时,运算符放在被拆分行的尾部,而不是新行的首部。拆分后的新行应与被拆分行采用能够表现出逻辑关系的对齐方式。

示例:

if (((new_shape.x > left_border) &&

(new_shape.x < right_border)) &&

( (new_shape.y > bottom_border) &&

(new_shape.y < top_border))) {

d raw(new_shape);

}

2.1.2.4代码行及行内空格

(1)代码行中不运行出现中文。

(2)关键字后要留空格。像const、inline、case等关键字后要留空格,以辨析关键字;像if、for、do、while、switch等关键字后要留空格再跟左括号“(”,以突出关键字。

(3)“(”若不在一行的开始,应与前面的字符空格。例如,if、while、do-while、switch、for 语句等控制结构块的“(”应与这些关键字语句之间空格。

(4)“,”之后要留空格;若“;”不是一行的结束符,后面也要留空格。

(5)“?”、“:”前后都要留空格。

(6)“(”、“[”向后紧跟,“]”、“,”、“;”、“)”向前紧跟,紧跟处不留空格。

(7)一元运算符与所作用的操作数之间不要加空格,如“!”、“~”、“++”、“&”、“*”等。(8)“.”、“->”这类运算符前后都不要留空格。

2.1.2.5缩进与对齐

?缩进的水平是一个TAB键,可将编辑器的TAB符定义为4个空格。

?嵌套块之间使用4个空格(一个TAB键)的缩进方式。

?模块和子程序头以及子程序声明从第一列起。

?下列情况下缩进一个水平:

?子程序声明

?条件(看下面)

?循环的结构

?switch语句

?case labels

?条件的else与if有相同的缩进。因此格式就是:

fid = fopen(e);

if(fid~ = -1)

statements

else

statements

end

?switch语句的一般格式:

switch(condition)

case ABC

处理语句;

case DEF

处理语句;

otherwise

处理语句;

end

?注释与它们作注释的代码部分有相同的缩进(见Comments)。

2.1.2.6注释

1)程序内部不同功能模块要空一行,同时附注释说明模块的作用、功能。这样程序结构清晰易

懂,便于同学间学习交流。

例如:

%% 注释说明下模块一的功能

…模块一…代码…

此处为空行

%% 注释说明下模块二的功能

…模块二…代码…

2)多层循环嵌套要在每一个结束的end 后加注释说明该层循环结束

例:

for %循环1

for %循环2

for %循环3

……

代码段

……

end %循环3结束

end %循环2结束

end %循环1结束

3)用于理解一小段代码含义的注释,统一写在代码上方,如

4)用于理解一句代码的意思可以写在代码后方,但是注意不能超过180字符。太长可以考虑写在代码上方。

5)大段代码,有完整的阶段性的运行结果,需要使用%% 形式,使用单元来注释。

3.软件编写说明写作规范

作为软件工程过程的一个阶段,程序编码是设计的继续。然而,在编码中所遇到的问题,如程序设计语言的特性和程序设计风格会深刻地影响软件的质量和可维护性。

3.1对源程序的质量要求

为了保证程序编码的质量,程序员必须深刻理解、熟练地掌握并正确运用程序设计语言的特性。然后,软件工程项目对代码编写的要求绝不仅仅是源程序语法上的正确性,也不只是源程序中没有各种错误,此外,还要求源程序具有良好的结构性和良好的程序设计风格。

例如写出的源程序便于阅读,又便于测试和排除所发现的程序故障,就能够有效地在开发期间消除绝大多数在程序中隐藏的故障,使得程序可以做到正常稳定地运行,极大地减小了运行期间软件失效的可能性,大大提高了软件的可靠性。

3.2结构化程序设计

程序编码这一阶段的工作是把软件的详细设计变换成用某一种程序设计语言编写的可实现的源程序,结构化程序设计就是在编写程序时首先必须考虑的问题。

3.2.1结构化程序设计的原则

1)使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。

2)选用的控制结构只准许有一个入口和一个出口。

3)程序语句组成容易识别的块,每块只有一个入口和一个出口。

4)复杂结构应该用基本控制结构进行组合嵌套来实现。

5)语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序在整个系统中

应前后一致。

3.3程序设计风格

随着软件规模的增大,复杂性增加,人们逐渐看到,在软件生存期中需要经常阅读程序。特别是在软件测试段和维护段,编写程序的人与参与测试、维护的人都要阅读程序。人们认识到,阅读程序是软件开发和维护过程中的重要组成部分,而且读程序的时间比写程序的时间还要多。

因此,程序实际上也是一种供人阅读的文章,所以就有风格问题。程序设计风格包括四个方面:源程序的文档化,数据说明的方法,语句结构和输入/输出方法中值得注意的问题。

3.3.1程序的文档化

源程序的文档化包括选择标识符(变量和标号)的名字、安排注释以及程序的视觉组织

等。

1)符号的命名

符号即标识符,包括模块名、变量名、子程序名以及数据区名、缓冲区名等。

这些名字应能反应它所代表的实际东西,应有一定的实际意义,使其能够见名知意,有助于对程序功能的理解。

2)程序的注释

夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。正确注释能够帮助读者理解程序,可为后续阶段进行测试和维护,提供明确的指导。大多数

程序设计语言允许用自然语言来注释,这就给阅读程序带来了很大的方便。一些正

规的程序文本中,注释行数量占到整个源程序的1/3到1/2,甚至更多。

注释分为序言性注释和功能性注释。

序言性注释通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于

理解程序具有引导作用。有关项目包括:程序标题;有关该模块功能和目的的说明;

主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述(重

要的变量及其用途,约束或限制条件,以及其他有关信息);模块的位置(在那一个

源文件中,或隶属于哪一个软件包);开发简历:模块设计者,复审者,复审日期,

修改日期及有关的说明等。(参照软件工程中相应的例子)

功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,也就

是解释下面要“做什么”,或是执行了下面的语句会怎么样。而不需要解释下面怎么做,因为解释怎么做常常是与程序重复的,并且对阅读者理解程序没有什么帮助。书写

功能性注释,要注意以下几点:

?用于描述一段程序,而不是每一个语句;

?用缩进和空行,使程序与注释容易区别;

?注释要正确。

3)视觉组织――空格、空行和缩进

一个程序如果写得密密麻麻,分不出层次来常常是很难看懂的。优秀的程序员在利

用空格、空行和缩进的技巧上显示了他们的经验。恰当的利用空格,可以突出运算

的优先性,避免发生运算的错误。

3.3.2数据说明

虽然在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。为了是程序中数据说明更易于理解和维护,必须注意以下几点:

1)数据说明的次序应当规范化。使数据属性容易查找,也有利于测试,排错和维护。

原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护

的需要,最好使其规范化,是说明的次序先后次序固定。

推荐,

常量说明->简单变量类型说明->数组说明->公用数据块说明->所有文件说明。类型说明还可以按照以下顺序:整型变量说明->实型变量说明->字符变量说

明->逻辑变量说明。

2)当多个变量名用一个语句说明时,应当对这些变量按字母的顺序排序。

3)如果设计了一个复杂的数据结构,应使用注释说明在程序实现时这个数据结构的特

点。例如对C链表结构等都应当在注释中做必要的补充说明。

3.3.3语句结构

在设计阶段确定了软件的逻辑结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句结构复杂化。

1)在一行内只写一条语句,并采取适当的缩进格式,是程序的逻辑和功能变得更加明

确。

2)程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写的过于紧凑。软

件工程技术要求软件生产工程化、规范化,为了提高程序的可读性,减少出错的可能性,提高测试与维护的效率,要求把程序的清晰性放在首位。因此写出的程序必须让人很容易读懂。

3)除非对效率有特殊的要求,程序编写要做到清晰第一,效率第二。

4)程序编写得要简单清楚,直截了当地说明程序员的用意。

5)首先要保证程序的正确,然后才要求提高速度。

6)尽量使用库函数。

7)避免使用临时变量而使可读性下降。

8)尽量使用公共过程或子程序去代替重复的功能代码段。要注意,这段代码应具有一

个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。

9)用调用公共函数去代替重复使用的表达式。

10)使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序。

11)尽量只采用三种基本的控制结构来编写程序。

12)采用逻辑表达式代替分支嵌套。

13)尽量减少使用“否定”条件的条件语句。

14)避免采用过于复杂的条件测试。

15)避免使用空ELSE语句和IF…THEN…IF的语句。

16)避免过多的循环嵌套和条件嵌套。

17)数据结构要有利于程序的简化。

18)要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见。

19)不要修补不好的程序,要重新编写。也不要一味地追求代码的重用,要重新组织。

20)利用信息隐蔽,确保每一模块的独立性。

21)对太大的程序,要分块编写,测试,然后集成。

22)注意计算机浮点运算的特点。

23)不要单独进行浮点数的比较。

24)避免不恰当地追求程序效率,在改进效率前,要作出有关效率的定量估计。

25)确保所有变量在使用前都进行初始化。

26)经常反躬自省:“如果自己不是编码的人,那么能看懂它吗?”

3.3.4输入和输出

输入输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能的方便用户的使用。一定要避免因设计不当给用户带来的麻烦。因此,在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。系统能否为用户接受,有时就取决于输入和输出的风格。

在设计和程序编码时都应考虑下列原则:

1)对所有的输入数据都进行检验,从而识别错误的输入,以保证每个数据的有效性。

2)检查输入项的各种重要组合的合理性,必要时报告输入状态信息。

3)使得输入的步骤和操作尽可能简单,并保持简单的输入格式。

4)输入数据时,应允许使用自由格式输入。

5)应允许缺省值。

6)输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目。

7)在以交互式输入方式进行输入时,要在屏幕上使用提示符明确提示交互输入的请求,

指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时要

要在屏幕上给出状态信息;

8)当程序语言对输入格式有严格的要求时,应保持输入格式与输入语句要求的一致性。

9)给所有的输出加注释,并设计输出报表格式。

在交互式系统中(网管可能需要),这些要求应称为软件需求的一部分,并通过设计和编码,在用户和系统之间建立良好的通信接口。

总之,要从程序编码的实践中,积累编制程序的经验,培养和学习良好的程序设计风格,使编写出来的程序清晰易懂,易于测试和维护。在程序编码阶段改善和提高软件的质量。

matlab编程实现二分法,牛顿法,黄金分割法,最速下降matlab程序代码

用二 4224min ()f t t t t =--[,.]t ∈内的极小值点,要求准 1. function [t d]=erfenfa(a,b) k=1; %记录循环次数 while abs(a-b)>0.0005 c=(a+b)/2; C(k)=c; %存储每次循环中点c 的值 if ff(c)<0 a=c; end if ff(c)==0 t1=c; break ; end if ff(c)>0 b=c; end k=k+1; end t=(a+b)/2; %最终符合要求的值 d=f(t); %最优解 C k function y=f(t) y=t^4-2*t^2-4*t; function y=ff(t) y=4*t^3-4*t-4; 运行结果 >> [t d]=erfenfa(1,1.5) C = Columns 1 through 9 1.2500 1.3750 1.3125 1.3438 1.3281 1.3203 1.3242 1.3262 1.3252 Column 10 1.3247 k = 11

t = 1.3250 d = -5.7290 2.黄金分割法 f (x)=x3-2x+1 初始区间[0, 3],收敛精度0.5 function [t,f]=huangjinfenge(a,b) m=1-(sqrt(5)-1)/2; t2=a+m*(b-a) f2=g(t2); t1=a+b-t2 f1=g(t1); while abs(t1-t2)>0.5 if f1 [t,f]=huangjinfenge(0,3) t2 = 1.1459 t1 = 1.8541

matlab程序大全答案

频率特性类题目 1 一个系统的开环传递函数为 ,试绘制其当K=5、30时系统的开环频率特性Nyquist 图,并判断系统的稳定性。 w=linspace(0.5,5,1000)*pi; sys1=zpk([],[0 -10 -2],100) sys2=zpk([],[0 -10 -2],600) figure(1) nyquist(sys1,w) title('system nyquist charts with k=5') figure(2) nyquist(sys2,w) title('system nyquist charts with k=30') 由图可知K=5时,开环Nyquist 曲线没有包围(-1,j0)点,所以系统稳定。 K=30时,开环Nyquist 曲线包围(-1,j0)点,所以系统不稳定。 2系统开环传递函数为 ,建立其零极点增益模型, 然后分别绘制当K=5、K=30时系统的开环频率特性Bode 图,并判断系统的稳定性。 sys1=zpk([],[0 -10 -2],100) sys2=zpk([],[0 -10 -2],600) figure(1) [Gm1,Pm1,Wcg1,Wcp1]=margin(sys1) bode(sys1) title('system bode charts with k=5'),grid figure(2) [Gm2,Pm2,Wcg2,Wcp2]=margin(sys2) bode(sys2) title('system bode charts with k=30'),grid 因为K=5时,Wcg>Wcp,所以系统稳定。 K=10时,Wcg

matlab相关图形实现代码

根据数据点绘制饼图和针状图: x=[1 2 3 4 5 6]; >> subplot(2,2,1);pie(x); >> subplot(2,2,2);pie3(x); >> subplot(2,2,3);stem(x); >>subplot(2,2,4);stem3(x); 5% 10% 14% 19% 24% 29% 24% 29% 19% 5%14% 10%0 2 4 6 2 4 6 5 10 01 2 05 10

根据数据点绘制向量场图、羽状图和罗盘图: x=[1 2 3 4 5 6];y=[1 2 3 4 5 6]; u=[1 2 3 4 5 6];v=[1 2 3 4 5 6]; subplot(2,2,1);quiver(x,y,u,v); subplot(2,2,2);quiver(x,y,u,v,'r'); subplot(2,2,3);feather(u,v); subplot(2,2,4);compass(u,v); 024680 246 802468 246 80 5 10 15 2 4 6 5 10 30 210 60240 90270 120 300 150330 180

rand(m,n)产生m ×n 均匀分布的随机矩阵,元素取值在0.0~1.0。 randn 函数:产生标准正态分布的随机数或矩阵的函数。 Y = randn(m,n) 或 Y = randn([m n])返回一个m*n 的随机项矩阵。 > theta=10*rand(1,50); %确定50个随机数theta >> Z=peaks; %确定Z 为峰值函数peaks >> x=0:0.01:2*pi;y=sin(x); %确定正弦函数数据点x.y >> t=randn(1000,1); %确定1000个随机数t >> subplot(2,2,1);rose(theta); %关于(theta )的玫瑰花图 >> subplot(2,2,2);area(x,y); %关于(x,y)的面积图 >> subplot(2,2,3);contour(Z); %关于Z 的等值线图(未填充) >> subplot(2,2,4);hist(t); %关于t 的柱状图 5 10 30 210 60 240 90270 120300150330 18000246 -1 -0.500.5 110 20 30 40 10 2030 40-4 -2 2 4 100 200 300

二分法、简单迭代法的matlab代码实现

实验一非线性方程的数值解法(一) 信息与计算科学金融崔振威201002034031一、实验目的: 熟悉二分法和简单迭代法的算法实现。 二、实验内容: 教材P40 2.1.5 三、实验要求 1根据实验内容编写二分法和简单迭代法的算法实现 2简单比较分析两种算法的误差 3试构造不同的迭代格式,分析比较其收敛性 (一)、二分法程序: function ef=bisect(fx,xa,xb ,n, delta) % fx是由方程转化的关于x的函数,有fx=0。 % xa解区间上限 % xb解区间下限 % n最多循环步数,防止死循环。 %delta为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); disp(' [ n xa xb xc fc ]'); for i=1: n xc=(xa+xb)/2;x=xc;fc=eval(fx); X=[i,xa,xb,xc,fc]; disp(X), if fc*fa<0 xb=xc; else xa=xc; end if (xb-xa)

k=0; while abs(x-xO)>eps & k> fplot('[x A5-3*x A3-2*x A2+2]',[-3,3]);grid 得下图: 由上图可得知:方程在[-3,3]区间有根。 (2 )、二分法输出结果 >> f='xA5-3*xA3-2*xA2+2' f = X A5-3*X A3-2*X A2+2 >> bisect(f,-3,3,20,10A(-12)) 2.0000 - 3.0000 0 -1.5000 0.0313

matlab代码大全

MATLAB主要命令汇总 MATLAB函数参考 附录1.1 管理用命令 函数名功能描述函数名功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文件 doc 装入超文本文档 version 显示Matlab的版本号 help 启动联机帮助 what 列出当前目录下的有关文件 lasterr 显示最后一条信息 whatsnew 显示Matlab的新特性 lookfor 搜索关键词的帮助 which 造出函数与文件所在的目录 path 设置或查询Matlab路径 附录1.2管理变量与工作空间用命令 函数名功能描述函数名功能描述 clear 删除内存中的变量与函数 pack 整理工作空间内存 disp 显示矩阵与文本 save 将工作空间中的变量存盘 length 查询向量的维数 size 查询矩阵的维数 load 从文件中装入数据 who,whos 列出工作空间中的变量名 附录1.3文件与操作系统处理命令 函数名功能描述函数名功能描述 cd 改变当前工作目录 edit 编辑.M文件 delete 删除文件 matlabroot 获得Matlab的安装根目录 diary 将Matlab运行命令存盘 tempdir 获得系统的缓存目录 dir 列出当前目录的内容 tempname 获得一个缓存(temp)文件 ! 执行操作系统命令 附录1.4窗口控制命令 函数名功能描述函数名功能描述 echo 显示文件中的Matlab中的命令 more 控制命令窗口的输出页面format 设置输出格式 附录1.5启动与退出命令 函数名功能描述函数名功能描述 matlabrc 启动主程序 quit 退出Matlab环境 startup Matlab自启动程序 附录2 运算符号与特殊字符附录 2.1运算符号与特殊字符 函数名功能描述函数名功能描述

matlab 二分法汇总

二分法的matlab主程序 function [k,x,wuca,yx]=erfen(a,b,abtol) a(1)=a; b(1)=b; ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数if ya* yb>0, disp('注意:ya*yb>0,请重新调整区间端点a和b.'), return end max1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil是上取整for k=1: max1+1 a;ya=fun(a); b;yb=fun(b); x=(a+b)/2; yx=fun(x); wuca=abs(b-a)/2; k=k-1; [k,a,b,x,wuca,ya,yb,yx] if yx==0 a=x; b=x; elseif yb*yx>0 b=x;yb=yx; else a=x; ya=yx; end if b-a< abtol , return, end end k=max1; x; wuca; yx=fun(x);

区间二分法: 与对分查找法相同 1 区间二分法求出的仅仅是方程的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根 2 通常用区间二分法为一些迭代法提供靠近x^*的初始选代值; 3 区间二分法的缺点是不能求方程的复数根。 format long a=5; b=6; x1=a; x2=b; f1=4*cos(x1)+4*sin(x1)+0.5*x1-2; f2=4*cos(x2)+4*sin(x2)+0.5*x2-2; step=0.000001; ii=0; while abs(x1-x2)>step ii=ii+1; x3=(x1+x2)/2; f3=4*cos(x3)+4*sin(x3)+0.5*x3-2; if f3~=0 if f1*f3<0 x2=x3; else x1=x3; end end end x3 f=[4*cos(x3)+4*sin(x3)+0.5*x3] disp(['迭代次数:',num2str(ii),'次']) 牛顿迭代法求解: 在方程f(x)=0有实数根的情况下,若能够将方程等价地转化成x=g(x)的形式,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推 x(k+1)=g(x(k)) 可以得到一个序列xk,通常称g(x)为迭代函数,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。 同一个方程,不同等价形式的转换产生的迭代法可能收敛,也有可能发散.关于迭代法的敛散性判定有下面的定理(也称李普希兹(Lipschitz定理): 如果迭代函数g(x)在区间[a,b]上连续,且满足以下条件, 1 对于任意的x=[a,b],有g(x)=[a,b]

MATLAB简单程序大全

MATLAB简单程序大全 求特征值特征向量 A=[2 3 4;1 5 9;8 5 2] det(A) A' rank(A) inv(A) rref(A) eig(A)%求特征值和特征向量 卫星运行问题 h=200,H=51000,R=6378; a=(h+H+2*R)/2; c=(H-h)/2; b=(a^2-c^2)^(1/2); e=c/a; f=sqrt(1-exp(2).*cos(t)^2); l=int(f,t,0,pi/2) L=4*a.*l 动态玫瑰线 n=3;N=10000; theta=2*pi*(0:N)/N; r=cos(n*theta); x=r.*cos(theta); y=r.*sin(theta); comet(x,y) 二重积分 syms x y f=x^2*sin(y); int(int(f,x,0,1),y,0,pi) ezmesh(f,[0,1,0,pi]) 函数画图 syms x;f=exp(-0.2*x)*sin(0.5*x); ezplot(f,[0,8*pi])

玫瑰线 theta=0:0.01:2*pi; r=cos(3*theta); polar(theta,r,'r') 求x^2+y^2=1和x^2+z^2=1所围成的体积 syms x y z R r=1; Z=sqrt(1-x^2); y0=Z; V=8*int(int(Z,y,0,y0),x,0,1) 求导数及图像 f='1/(5+4*cos(x))'; subplot(1,2,1);ezplot(f) f1=diff(f) subplot(1,2,2);ezplot(f1) 绕x轴旋转 t=(0:20)*pi/10; r=exp(-.2*t).*sin(.5*t); theta=t; x=t'*ones(size(t)); y=r'*cos(theta); z=r'*sin(theta); mesh(x,y,z) colormap([0 0 0]) 某年是否闰年 year=input('input year:='); n1=year/4; n2=year/100; n3=year/400; if n1==fix(n1)&n2~=fix(n2) disp('是闰年') elseif n1==fix(n1)&n3==fix(n3) disp('是闰年') else

遗传算法经典MATLAB代码

遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程

%----------------------------------------------- % 初始化(编码) % 函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength 表示染色体的长度(二值数的长度), % 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 计算目标函数值 % 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制

matlab程序设计例题及答案

1.编写程序:计算1/3+2/5+3/7+……+10/21 法一: s=0; for i=1:10 s=s+i/(2*i+1); end s s = 4.4096 法二: sum((1:10)./(3:2:21)) ans = 4.4096 2.编写程序:计算1~100中即能被3整除,又能被7整除的所有数之和。 s=0; for i=1:100 if mod(i,3)==0&&mod(i,7)==0 s=s+i; end,end s s = 210 3.画出y=n!的图(1<=n<=10),阶乘的函数自己编写,禁用MATLAB自带的阶乘函数。 x=1:10; for i=1:10 try y(i)=y(i-1)*i; catch y(i)=1; end,end plot(x,y)

12345678910 0.511.522.533.54x 10 6 4.一个数恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,而6=1+2+3,因此6就是一个完数。编程找出2000以内的所有完数。 g=[]; for n=2:2000 s=0; for r=1:n-1 if mod(n,r)==0 s=s+r; end end if s==n g=[g n]; end end g g =6 28 496

5.编写一个函数,模拟numel函数的功能,函数中调用size函数。 function y=numelnumel(x) m=size(x); y=m(1)*m(2); numelnumel([1 2 3;4 5 6]) ans = 6 6. 编写一个函数,模拟length函数的功能,函数中调用size函数。 function y=lengthlength(x) m=size(x); y=max(m(1),m(2)); lengthlength([1 2 3;4 5 6]) ans = 3 7.求矩阵rand(5)的所有元素和及各行平均值,各列平均值。 s=rand(5); sum=sum(sum(s)) mean2=mean(s,2) mean1=mean(s) sum = 13.8469

matlab快捷键大全

1.使用“Tab”键可以在Matlab进行命令输入时补全变量名或者命令名; 2.使用“Ctrl+C”组合键能够强制从运行的或者进入死循环的Matlab程序中退出; 3.使用“上”“下”方向键能够调用Matlab的历史命令; 4.Matlab的变量命名规则注意: a.区分大小写; b.必须以字母开头; c.中间不能有空格、标点符号等; 5.在一条命令或语句的末尾加上一个分号,则Matlab就不会在屏幕上显示这条命令计算的结果; 6.在Matlab中,“...”(3个句点)称为“续行符”,表示同一语句的延续输入; 注意:只有当续行符出现在变量名和运算符之间,才能起到语句延续的作用。出现在一个变量名中间时,是不能实现语句延续的。换句话说,变量名不能分割成两行书写。 7.在进行三角函数运算时,Matlab使用的是“弧度制”而不是“角度制”; 8.选择需要注释的语句块以后,使用“Ctrl+R”可以进行Matlab语句注释;使用“Ctrl+T”可以进行语句块的解注释; 9.Matlab数组的下标是从“1”开始的,这点与C语言不同; 1 0.使用空格和逗号隔开的元素指定的是同一行的元素,使用分号或者回车分开的元素指定的是不同行的元素。 Q1:matlab有没有监视内存的方法? A:用函数whos。 Q2:如何解决matlab7.0命令窗口跳出一大堆java错误...

A:换matlab7的sp2。 Q3:自从安装matlab,一开机就在进程里有matlab。 能不能开机的时候进程就不运行matlab? A:开始-->控制面板-->管理工具-->服务 把MATLAB Server的属性改成“手动”就行了。 Q4:退出matlab7程序运行的快捷键。 A:ctrl+q Q5:matlab7远程控制是否有限制? A:不能远程控制,不过你可以先在你的remote机器上打开,然后就可以用了。 Q6:Matlab占用资源太多怎么办? A:用matlab-nojvm启动(如果不需要图形界面)。 Q7:怎样给matlab添加新的toolbox? A:在matlab的文件菜单里边添加路径,选set path。 Q8:请问matlab有没有命令可以调出历史输入啊? A:command history窗口。 Q9:matlab7.0不能在64位的cpu下运行? A:matlab应该是依赖于自己的虚拟机的 但是好像这个虚拟机是在IA32里面作出来的,所以,应该找个带64位的java虚拟机替换原来的,不过不一定能行or so,记不清了) Q10:matlab有没有注释一段的功能? A:选中一段代码,ctrl r就是区段注释 选中一段代码,ctrl t取消区段注释

遗传算法经典MATLAB代码资料讲解

遗传算法经典学习Matlab代码 遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程 %----------------------------------------------- % 2.1初始化(编码) % initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),

% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 2.2 计算目标函数值 % 2.2.1 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: decodebinary.m %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和列数 for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2); %求pop1的每行之和 % 2.2.2 将二进制编码转化为十进制数(2) % decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置

matlab代码大全教学文案

m a t l a b代码大全

MATLAB主要命令汇总 MATLAB函数参考 附录1.1 管理用命令 函数名功能描述函数名功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文件 doc 装入超文本文档 version 显示Matlab的版本号 help 启动联机帮助 what 列出当前目录下的有关文件 lasterr 显示最后一条信息 whatsnew 显示Matlab的新特性 lookfor 搜索关键词的帮助 which 造出函数与文件所在的目录 path 设置或查询Matlab路径 附录1.2管理变量与工作空间用命令 函数名功能描述函数名功能描述 clear 删除内存中的变量与函数 pack 整理工作空间内存 disp 显示矩阵与文本 save 将工作空间中的变量存盘 length 查询向量的维数 size 查询矩阵的维数 load 从文件中装入数据 who,whos 列出工作空间中的变量名 附录1.3文件与操作系统处理命令 函数名功能描述函数名功能描述 cd 改变当前工作目录 edit 编辑.M文件 delete 删除文件 matlabroot 获得Matlab的安装根目录 diary 将Matlab运行命令存盘 tempdir 获得系统的缓存目录 dir 列出当前目录的内容 tempname 获得一个缓存(temp)文件 ! 执行操作系统命令 附录1.4窗口控制命令 函数名功能描述函数名功能描述 echo 显示文件中的Matlab中的命令 more 控制命令窗口的输出页面format 设置输出格式 附录1.5启动与退出命令 函数名功能描述函数名功能描述 matlabrc 启动主程序 quit 退出Matlab环境 startup Matlab自启动程序 附录2 运算符号与特殊字符附录

matlab信道仿真经典源程序

% % % Rayleigh Fading Channel Signal Generator % Using the Dent Model (a modification to the Jakes Model) % % Last Modified 10/18/05 % % Author: Avetis Ioannisyan (avetis@https://www.doczj.com/doc/3a17162200.html,) % % % Usage: % [omega_mTau, Tk] = % ai_RayCh(NumAngles, Length, SymbolRate, NumWaveforms, CarrierFreq, Velocity) % % Where the output omega_mTau is a time scaling factor for plotting % normalized correlations. The LAGS value output by [C,LAGS] = XCORR(...) % should be multiplied by the omega_mTau scaling factor to properly display % axis. Tk is a two dimensional vector [M, N] = SIZE(Tk) with % M=numWaverorms and N=Length specified in the RayCh(...) function call % % And the input variables are: % % NumAngles - scalar power of 2, NumAngles > 2^7 is used to specify the % number of equally strong rays arriving at the receiver. It used to % compute the number of oscillators in the Dent model with N0 = numAngles/4 % % Length - scalar preferably power of 2 for faster computation, Length > 2^17 % is used to specify the length of the generated sequence. Lengths near 1E6 % are close to realistic signals % % SymbolRate - scalar power of 2 and is in kilo-symbols-per-sec is used to % specify what should be the transmission data rate. Slower rates will % provide slowly fading channels. Normal voice and soem data rates are % 64-256 ksps % % NumWaveforms - scalar used to specify how many 'k' waveforms to generate % in the model. NumWaveforms > 2 to properly display plots % % CarrierFreq - scalar expressed in MHz is the carrier frequency of the % tranmitter. Normally 800 or 1900 MHz for mobile comms % % Velocity - scalar expressed in km/hr is the speed of the receiver. % 100 km/hr = 65 mi/hr. Normal values are 20-130 km/hr %

matlab的编码大全

附录Matlab源程序 附录A 信息熵 % 函数说明:% % H=entropy(P,r) 为信息熵函数% % P为信源的概率矢量, r为进制数% % H为信息熵% %****************************** % function H=entropy(P,r) if (length(find(P<=0))~=0) error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件end if (abs(sum(P)-1)>10e-10) error('Not a prob.vector,component do not add up to 1'); end H=(sum(-P.*log2(P)))/(log2(r)+eps); 附录B 离散无记忆信道容量的迭代计算 % 信道容量C的迭代算法% % 函数说明:% % [CC,Paa]=ChannelCap(P,k) 为信道容量函数% % 变量说明:% % P:输入的正向转移概率矩阵,k:迭代计算精度% % CC:最佳信道容量,Paa:最佳输入概率矩阵% % Pa:初始输入概率矩阵,Pba:正向转移概率矩阵% % Pb:输出概率矩阵,Pab:反向转移概率矩阵% % C:初始信道容量,r:输入符号数,s:输出符号数% %************************************************** % function [CC,Paa]=ChannelCap(P,k) % 提示错误信息 if (length(find(P<0)) ~=0) error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件end

二分法matlab程序

二分法基本思路 一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。 解方程即要求f(x)的所有零点。 假定f(x)在区间(x ,y )上连续 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2], 现在假设f(a)<0,f(b)>0,a=a ,从①开始继续使用 ② 中点函数值判断。 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。 这样就可以不断接近零点。 通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。 从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。另外,二分法不能计算复根和重根。 二分法步骤 用二分法求方程()0f x =的根*x 的近似值k x 的步骤 ① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。 ② 取,a b 的中点12 a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算, 运行后输出结果*1x x = 若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。取111,a a b x ==; 若1()()0f a f x >,则取111,a x b b ==;

数字图像处理代码大全

1.图像反转 MATLAB程序实现如下: I=imread('xian.bmp'); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序实现如下: I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像'); axis([50,250,50,200]); axis on; %显示坐标系 I1=rgb2gray(I); subplot(2,2,2),imshow(I1); title('灰度图像'); axis([50,250,50,200]); axis on; %显示坐标系 J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]的灰度拉伸为[0 1]

subplot(2,2,3),imshow(J); title('线性变换图像[0.1 0.5]'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]的灰度拉伸为[0 1] subplot(2,2,4),imshow(K); title('线性变换图像[0.3 0.7]'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 3.非线性变换 MATLAB程序实现如下: I=imread('xian.bmp'); I1=rgb2gray(I); subplot(1,2,1),imshow(I1); title('灰度图像'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 J=double(I1);

(完整版)MATLAB典型去雾算法代码..

本节主要介绍基于Retinex理论的雾霭天气图像增强及其实现。 1.3.1 Rentinex理论 Retinex(视网膜“Retina”和大脑皮层“Cortex”的缩写)理论是一种建立在科学实验和科学分析基础上的基于人类视觉系统(Human Visual System)的图像增强理论。该算法的基本原理模型最早是由Edwin Land(埃德温?兰德)于1971年提出的一种被称为的色彩的理论,并在颜色恒常性的基础上提出的一种图像增强方法。Retinex 理论的基本内容是物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。 根据Edwin Land提出的理论,一幅给定的图像S(x,y)分解成两幅不同的图像:反射物体图像R(x,y)和入射光图像L(x,y),其原理示意图如图8.3-1所示。 图1.3-1 Retinex理论示意图 对于观察图像S中的每个点(x,y),用公式可以表示为: S(x,y)=R(x,y)×L(x,y) (1.3.1)实际上,Retinex理论就是通过图像S来得到物体的反射性质R,也就是去除了入射光L的性质从而得到物体原本该有的样子。 1.3.2 基于Retinex理论的图像增强的基本步骤 步骤一: 利用取对数的方法将照射光分量和反射光分量分离,即: S'(x, y)=r(x, y)+l(x, y)=log(R(x, y))+log(L(x, y)); 步骤二:用高斯模板对原图像做卷积,即相当于对原图像做低通滤波,得到低通滤波后的图像D(x,y),F(x, y)表示高斯滤波函数: D(x, y)=S(x, y) *F(x, y); 步骤三:在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像G (x, y): G(x,y)=S'(x, y)-log(D(x, y)) ; 步骤四:对G(x,y)取反对数,得到增强后的图像R(x, y):

二分法、简单迭代法的matlab代码实现教学文案

实验一非线性方程的数值解法(一)信息与计算科学金融崔振威201002034031 一、实验目的: 熟悉二分法和简单迭代法的算法实现。 二、实验内容: 教材P40 2.1.5 三、实验要求 1 根据实验内容编写二分法和简单迭代法的算法实现 2 简单比较分析两种算法的误差 3 试构造不同的迭代格式,分析比较其收敛性 (一)、二分法程序: function ef=bisect(fx,xa,xb,n,delta) % fx是由方程转化的关于x的函数,有fx=0。 % xa 解区间上限 % xb 解区间下限 % n 最多循环步数,防止死循环。 %delta 为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); disp(' [ n xa xb xc fc ]'); for i=1:n xc=(xa+xb)/2;x=xc;fc=eval(fx); X=[i,xa,xb,xc,fc]; disp(X), if fc*fa<0 xb=xc; else xa=xc; end if (xb-xa)

k=0; while abs(x-x0)>eps & k> fplot('[x^5-3*x^3-2*x^2+2]',[-3,3]);grid 得下图: 由上图可得知:方程在[-3,3]区间有根。 (2)、二分法输出结果 >> f='x^5-3*x^3-2*x^2+2' f = x^5-3*x^3-2*x^2+2 >> bisect(f,-3,3,20,10^(-12)) 2.0000 - 3.0000 0 -1.5000 0.0313

相关主题
文本预览