当前位置:文档之家› Matlab 7.0 Simulink 6.0应用实例仿真与高效算法开发(第一章)

Matlab 7.0 Simulink 6.0应用实例仿真与高效算法开发(第一章)

Matlab 7.0 Simulink 6.0应用实例仿真与高效算法开发(第一章)
Matlab 7.0 Simulink 6.0应用实例仿真与高效算法开发(第一章)

第一章 MATLAB 语言程序基础

本章旨在介绍关于MATLAB的基本知识,使读者可以更好的理解后续章节中的内容。其实,对于MATLAB的基本知识的介绍可以在市面是流行的各类MATLAB书籍中看到,那么本书中对于此部分的介绍又有哪些自己的特点呢?首先,省去了MATLAB中一些与高效率计算编程无关的赘述,使读者在能力理解和运用本书中心部分对于高效算法的介绍前提下,用最少的时间获得必须的预备知识;其次是对于一些后续章节中经常用到的基本概念和方法作了更为详细的介绍,这样读者在阅读完本章节以后可以更轻松的理解本章中对于算法介绍的内容。

本章主要内容包括:

◆MA TLAB的数据类型

◆基本数学运算

◆基本符号运算

◆基本的流程结构

◆函数编写与调试

◆图形的绘制

1.1 MATLAB 的数据类型

本节主要介绍MATLAB中的数据类型。不同类型的对象在计算机语言中可用不同类型的变量来描述。为使读者能够更好的理解后续章节的算法程序,本节专门对MATLAB的数据类型进行介绍。

1.1.1常量与变量

1.1.1.1.常量

MATLAB中,常量和变量是基本的语言元素。MATLAB的数值采用传统的十进制表示,可带负号或小数点。举例如下:

5 -87 0.001 3.1415 1.05457e-34 6..02e23

MATLAB还提供了一些内部常量,也可以理解为MATLAB默认的预定义变量。这些常量定义了编程和应用中经常用到的数据,如,圆周率、虚数单位等。随着MATLAB启动,这些常数就被产生。

表1-1 MATLAB中的一些内部常量

内部常量基本意义

ans 默认变量名或缺省变量名,MATLAB会自动将无指定输出变量的计算结果默认保存到ans变量中

eps 机器零阀值

Inf 或inf 表示无穷大的结算结果,如1/0

i 或j 虚数单位,有

pi 圆周率

NaN 或nan 非数值,通常表示不合法数值的值。如,0/0或inf/inf所得到的结果realmax(realmin) 最大(小)正实数

nargin(nargout) 函数输入(输出)宗量数目

computer 计算机类型

version MATLAB版本字符串

表1-1中所列常量可不必声明,直接调用。这里值得指出的是表1.1中所列常量的意义是在表中变量名未被用户赋值的情况下才成立的。假如用户对表中任何一个内部常量的字符串进行了赋值,那么该常量的默认意义或者默认值已被用户的新赋值所覆盖,只不过这种“覆盖”是临时的,如果用户运行了clear指令将MATLAB内存清空,或者MATLAB指令窗被重新启动,那么所有的内部常量又会恢复到系统默认的意义。

【例1-1】系统内部常量的调用和赋值

pi % 察看系统的默认值

ans =

3.1416

pi = ans + 1 % pi被重新赋值,不再是原系统默认值

pi =

5.1416

clear % 清空内存中的变量

pi % 重新察看pi的值

ans =

3.1416

可见,在无指定输出变量时候,系统自动把值赋给了ans。通过对pi进行重新赋值,原先默认值(圆周率)被覆盖,清空内存之后,pi又恢复到系统默认值。

1.1.1.2.变量

所有MATLAB中定义的变量都以数组或者矩阵形式保存,他提供的数据类型多达十余种,如逻辑型、字符型、数值型、单元数组、结构数组、函数句柄等。下面简单介绍一下几种数据类型。

●逻辑型此类数据类型只能包含1,0或者true,false。举例:

A = [1 3 5; 4 1 7; 2 6 9];

B = A>2

B =

0 1 1

1 0 1

0 1 1

●字符型又称字符串数组,如果没有串数组及其相应的操作,数据的可视化和构作MATLAB的宏指令都会遇到困难。字符串的创建也有值得注意的地方,就是必须首先将待建的字符置于英文状态下的“单引号对”中。例:

clear % 清除所有内存变量

A =’Hello, everyone!’% 对A进行赋值

A =

Hello, everyone!

●数值型数值数组及其运算始终是MATLAB的核心内容。数值型又可分为单精度数值型数组(single)、双精度数值型数组(double)和整型数组。MATLAB进行数值计算时,默认所有变量都为double型。使用format命令可以设置变量的输出格式,例如:

a =2.3609 %系统默认为double型

a =

2.3609

format long %设置系统为15位定点格式输出

a

a =

2.36090000000000

format long e %设置系统为15位浮点格式输出

a

a=

2.360900000000000e+000

在MATLAB中,变量的命名是要遵守一定规则的。首先,对变量命名要注意区分大小写,比如,Myname和myname表示两个不同的变量。pi代表系统默认的圆周率,但Pi、PI 和pI都不是;其次,在MATLAB中对变量进行命名时,第一个字符必须时英文字母,如0abc、_abc等都不是合法的;另外,MATLAB中在变量名的中间不能包含空格(backspace)、

标点和括号等,不过可以包含下划线,比如,ab_c是可以的,ab c或者ab,c等都不是合法的。

1.1.2 运算符

运算符从其功能来分大致有三种:算术运算符、比较运算符和逻辑运算符。现在分别介绍一下它们的构成和使用。

1.1.

2.1算术运算符

MATLAB中的运算符不只是完成传统意义上的算术所需的四则运算,另外还有幂、转置等运算。由于MATLAB具有强大的矩阵运算功能,所以它的很多运算符都是针对矩阵操作的。表达式所采用的运算符见表1-2。

表1-2 算术运算符及其功能

运算符功能运算符功能

+ 加- 减

.* 乘./ 右除

.\ 左除.^ 幂

. '转置'复数共轭转置

* 矩阵乘法/ 矩阵除法

^ 矩阵的幂:冒号操作符

要说明的是,一维的运算可以看作是矩阵运算的一种特殊形式,其运算符是一样的,例如一维运算中没有的转置,也可以看作是一维矩阵的转置,只是它转置后的结果不变罢了。此外,MATLAB中针对向量的算术操作专门设计了一类近似的运算符号,就是在一般的矩阵运算符前加“.”,它代表所参与运算的向量对应元素之间的运算。

1.1.

2.2 比较运算符

比较运算符的作用主要是用来比较两个数值的大小,它的写法与一般的手写比较运算符有所区别。具体见表1.3所示。

表1.3 比较运算符

指令功能指令功能

< 大于>= 大于等于

> 小于<= 小于等于

= = 等于~= 不等于

值得指出的是一般的表示等于的运算符在MATLAB中写为“= =”,传统意义上的等号“=”在MATLAB运算中用于赋值运算。此外,进行比较操作时注意以下两点:(1), 标量可与任何维数组进行比较。比较在此标量与数组每个元素之间进行,比较结果与参与比较的数组同维;(2), 参与比较的没有标量时,比较运算符两端的数组必须维数相同,比较在两数组对应位置上的元素间进行,因此比较结果将与参与比较的数组相同。举例说明:【例1-2】比较运算

A = [1 2 3 4 5];

B = [5 4 3 2 1];

C = (A<3)

C =

1 1 0 0 0

D = (A = = B)

D =

0 0 1 0 0

1.1.

2.3 逻辑运算符

逻辑运算符的主要功能是判断参与比较的对象之间的某种逻辑关系。表1-4列出了各种逻辑运算符及其对应的功能。

表1-4 逻辑运算符及其对应功能

指令函数含义举例

& and 与、和

A =

[1,1,1,0,0]

B =

[0,0,1,1,1] A&B ? [0,0,1,0,0]

| or 或A|B ? [1,1,1,1,1] ~ not 否、非~A = [0,0,0,1,1]

xor 元素相异返回1,元素相同返

回0

xor(A,B)= [0,0,1,0,0]

bitand 二进数位逻辑操作符,表示

与、和

A = 20=10100

B =12= 1100

bitand(A,B)=0100=4

bitor 二进数位逻辑操作符,表示

bitor(A,B)=11100=28

bitcmp 二进数位逻辑操作符,表示

否、非

~B = 0011=3

bitxor 二进数位逻辑操作符,相异

数返回1,相同数返回0

bitor(A,B)=11000=24

&&

如符号两端表达式皆为

真,返回true(1), 否则返回0。

(a~=0) && (a/b>3)

||

如符号两端表达式有一

式为真,返回true(1), 否则返

回0。

(a = = 0 ) || ( a/b>0)

这里说明一下,二进数位逻辑操作时,往往首先把运算量转换为二进制表示,然后逻辑运算在两个二进制数的自右到左相应数位间进行,输出的结果为运算所得的二进制数所对应的十进制数。当逻辑运算中没有标量时,参与运算的数组必须维数相同,运算在两数组的对应位置元素间进行。

此外,“&&”和“||”操作都有其特殊的性质,两者都属于先决逻辑操作符。“&&”操作时,先观察运算符左侧的参与运算的表达式是否为“假”;若是,则马上给出运算结果为“假”,而不必再观察运算符右侧的参与运算量。当左侧的运算量为“真”时,才接着对右侧运算量进行计算或者判断,进而执行“与”逻辑运算。“||”操作时,首先判断左侧的运算量是否为“真”;若是,立即给出计算结果“真”,而不必观察右侧参与运算量;若不是,则对右侧运算量进行观察,进而执行“与”操作。

1.1.3结构数组

结构数组(也有人称为构架数组)能在一个数组里存放任何类型的数据。结构数组的基本

单元(elment)是结构。数组中的每个单元以下标区分,他们之间是平等的。结构数组维数不受限制,可以为一维、二维或更高维。

结构数组的创建有两种方式,下面我们就看一个例子:

【例1-3】下面创建一个my_software结构数组,里面存储的是一个软件系统的信息。

首先看第一种方法,直接使用赋值语句构造结构数组

(1)直接对域进行赋值

my_https://www.doczj.com/doc/ea17922924.html, = 'MATLAB' ;

% 可以直接将字符串赋值给结构数组的域my_software.version = '7.0.0.19920(R14)' ;

my_https://www.doczj.com/doc/ea17922924.html,puter = 'PCWIN' ;

my_software.testdata.test1= [3.74 3.27 ; 3.56 3.41];

%可以直接将数组赋值给结构数组的域my_software.testdata.test2= [65.23 68.75 ; 63.06 61.18];

(2) 查看结果

my_software % 显示结构数组的内容

my_software =

name: 'MATLAB'

version: '7.0.0.19920(R14)'

system: 'PCWIN'

computer: 'PCWIN'

testdata: [1x1 struct]

my_software.testdata % 显示testdata域中的内容

ans =

test1: [2x2 double]

test2: [2x2 double]

my_software.testdata.test1 % 显示test1域中的内容,系统默认为double型

ans =

3.7400 3.2700

3.5600 3.4100

另外,还可通过MATLAB的一个专门的构造函数struct来创建结构数组。

(1) 使用struct函数构造结构数组

my_software = struct('name','MATLAB','version','7.0.0.19920(R14)','computer', 'PCWIN', 'testdata',[]); % 用‘[]’来预定义空域‘testdata’

my_software.testdata = struct('test1',[ 3.74 3.27 ; 3.56 3.41], 'test2',[ 65.23 68.75 ; 63.06 61.18]); % 再次调用‘struct’命令来对‘testdata’进行赋值

(2) 查看结果

my_software % 显示结构数组的内容

my_software =

name: 'MATLAB'

version: '7.0.0.19920(R14)'

system: 'PCWIN'

computer: 'PCWIN'

testdata: [1x1 struct]

事实上结构数组内的其他内容也是一样的,本例就是简单介绍了两种不同的创建方法。这里还要说明几点,(1) struct函数指令中的输入参数,第2、4、6等偶数项如为字符串需用单引号,或者为数组,数值数组或者字符数组均可; (2) 空数组…[]?可以用来创建新的空域,并且可以在接下来的语句中直接对其进行赋值操作。(3) struct命令不能创建多重的结构数组,如有需要可以多次调用struct命令或者嵌套调用struct函数。

接下来介绍结构数组中内容的提取和编辑。

【例1-4】结构数组内容的提取和编辑

首先建立一个简单的统计个人计算机信息的结构数组,

mycomputer.manufacturer = 'Lenovo';

mycomputer.type = '补天系列商用机';

mycomputer.cpu = 'Pentium(R) 4 3.000GHz';

mycomputer.system = 'window XP English version';

mycomputer

mycomputer =

manufacturer: 'Lenovo'

type: '补天系列商用机'

cpu: 'Pentium(R) 4 3.000GHz'

system: 'window XP English version'

如果要获得电脑是何系列的信息,并且将该信息单独另外存储,可以在结构名mycomputer后面跟一个小数点,接下来是要获取信息的字段名。如用MATLAB语句来表达,如下:

Pctype_informations = { mycomputer.manufacturer, mycomputer.type };

%将电脑的部分信息存入一个数组中

Pctype_informations %查看新的数组Pctype_informations =

'Lenovo' '补天系列商用机'

下面给读者演示如何在结构数组mycomputer上进行域的增添和删除操作。

【例1-5】对结构数据进行域的增添和删除

继续对例【1-4】中的结构数组进行操作。

mycomputer(2)https://www.doczj.com/doc/ea17922924.html,ertype = 'administrator';

mycompute % 查看mycomputer信息

mycomputer =

1x2 struct array with fields:

manufacturer

type

cpu

system

user

可见,对mycomputer(2)的赋值操作会影响到整个结构数组mycomputer的总体结构。在此类数组中任何一个结构上的域增添操作,都会对整个结构产生影响。

再查看结构数组mycomputer(1).user的内容。

mycomputer(1).user

ans =

[]

当我们再查看mycomputer(1).user的结构时,它并没有usertype这一项子域。可见对mycomputer(2)中的域user的子域usertype的赋值操作并没有对mycomputer(1).user子域产生影响,所以在结构数组中任何一个结构上的子域增添操作,对整个结构中的同级别的域并没有影响。

下面通过实例来总结结构数组的删除操作规律,

mycomputer(1)https://www.doczj.com/doc/ea17922924.html,ername = 'Guest';

mycomputer(1)https://www.doczj.com/doc/ea17922924.html,ertype = 'guest';

mycomputer(2)https://www.doczj.com/doc/ea17922924.html,ername = 'admin'

mycomputer(2).user = rmfield (mycomputer(2).user, 'usertype ');

% 删除usertype子域

mycomputer(2).user % 查看mycomputer(2).user的内容ans =

username: 'admin'

mycomputer(1).user % 查看mycomputer(1).user的内容ans =

username: 'Guest'

usertype: 'guest'

通过以上操作可以看出来删除子域的操作也只是影响到被操作的那个具体结构。

1.1.4 数组与矩阵的生成

MATLAB中,数值数组( Numeric Array)和数组运算(Array Operation)构成了其核心内容。本节主要介绍数组和矩阵的生成。

这里主要介绍一维数组的创建。大致可以分三种方法,直接构造法、增量法、函数构造法。

1. 直接构造法

又称逐个元素输入法,这种方法最直接也最简单。下面举例说明。

【例1-6】数组元素的直接构造法

a = [40 6.3 1/2 1e-2 sqrt(5)] %采用逐个元素输入法构造数组

a =

40.0000 6.3000 0.5000 0.0100 2.2361

这就构造了有五个元素的一维数组元素a。

2. 增量法

部分参考书称此方法为冒号生成法。它主要是利用MATLAB中提供的冒号运算符来实现赋值运算。举例说明入下:

【例1-7】数组元素构造的增量法

A = 1:9

A =

1 2 3 4 5 6 7 8 9

系统默认的增量为1,以上就生成了1?9的数组。

也可以设置增量的步长,举例如下:

A = 10.5:-1.5:3

A =

10.5000 9.0000 7.5000 6.0000 4.5000 3.0000

这样就生成了一组以-1.5为步长的递减数组。另外有一点值得说明,看下面一个数组:

b = 2;

A = 10.5 : -1.5 : b

A =

10.5000 9.0000 7.5000 6.0000 4.5000 3.0000

可见本例中后面的终止值发生变化时并没有影响到A的生成,当b的范围在1.5

从严格意义上讲,如二维数组带有线形变换含义时,该二维数组就是矩阵。矩阵的创建通常有两种方法,直接输入法和利用M文件创建。值得注意的是,首先输入数组时整个数组必须以方括号“[]”为其首尾;其次数组的行与行之间必须用分号或者回车键Enter隔离;另外数组元素由“,”或空格分隔。

1.2 基本数学运算. .

1.2.1 向量及其运算

如果一个向量A有1行,n列元素,那么称该向量为n阶行向量;如果向量A有1列,n行元素,那么该向量就为n阶列向量。MATLAB语言中定义了下面各种矩阵的基本代数运算:

A,如果矩阵A为n阶行向量,(1)向量转置。在数学公式中一般把一个矩阵的转置记作T

那么转置后为n阶列向量。转置的举例如下:

【例1-8】向量转置

>> A=[1 2 3]

A =

1 2 3

>> B=A'

B =

1

2

3

(2)向量的加减法运算。存在两个向量A和B,可由C=A+B和C=A-B命令执行向量的加减法。通常如A和B向量维数相同,它会自动地将A和B向量的相应元素相加减。举例如下:【例1-9】向量的加减运算

>> A=[2 3 4];

>> B=[1 2 3];

>> C=A+B

C =

3 5 7

还有一种情况是,参与加减操作的其中一个为标量结果会是什么结果呢?

>> D=5-A D =

3 2 1

(3) 向量乘法。存在两个向量A 和B ,如果两者分别为n 维列向量和行向量,那么该操作可表达为C A*B =,举例如下:

【例1-10】向量乘法

>> A=[1 2 3]; >> B=[2 3 4]'; >> C=A*B C = 20 >> D=B*A D =

2 4 6

3 6 9

4 8 12

(4) 点运算。该运算是MATLAB 定义的一类特殊的操作。两个向量之间的点运算式他们对应元素的直接运算。

【例1-11】MATLAB 中的点运算

>> A.*B' ans =

2 6 12 >> A./B' ans =

0.5000 0.6667 0.7500

向量的乘方运算,举例

>> A.^2 ans =

1 4 9

除了代数运算,还有逻辑运算、比较运算等。

1.2.2 矩阵及其运算

如果一个矩阵有n 行、m 列元素,称该矩阵为n m ?矩阵。倘若n m =,则该矩阵又称为方阵。矩阵的基本数学运算包括代数运算、矩阵的逻辑运算和矩阵的比较运算。其中矩阵代数运算包括矩阵转置、加减法、矩阵乘法、矩阵左(右)除、矩阵翻转和矩阵乘方运算。

1.2.2.1 矩阵的基本代数运算

这里只简单介绍几类运算,矩阵的左(右)除和矩阵翻转。

(1) 矩阵的左除。MATLAB 中表示两个矩阵左除所用的运算符为‘\’,方程AX B =的解X 可用A 与B 的左除表示\A B 。倘若A 为非奇异的方阵,那么方程AX B =的解可以表示为1

X A B -=。

(2) 矩阵的右除。MATLAB 中表示矩阵右除的符号为‘/’,相当于求方程XA B =的解。当A 为非奇异方阵时1

/B A BA -=。

(3) 矩阵翻转。MATLAB 提供了一些矩阵翻转的特殊命令,下面通过实例来查看: 【例1-12】通过实例演示矩阵翻转

>> A=[1 2 3;4 5 6;7 8 9] A =

1 2 3 4 5 6 7 8 9 >> B=fliplr(A) B =

3 2 1 6 5

4 9 8 7

可见,fliplr 命令是完成的矩阵A 的左右翻转操作。

>> C=flipud(A) C =

7 8 9 4 5 6 1 2 3

明显,flipud 命令执行的是矩阵A 的上下翻转操作。

此外,MATLAB 中还有其他一些对矩阵执行翻转操作的命令,如命令rot90为将矩阵逆时针旋转90o 。

>> D=rot90(A) D =

3 6 9 2 5 8 1

4 7

1.2.2.2 矩阵的逻辑运算

一个数的值为0,则可认为它为逻辑0,否则为逻辑1。如果A 和B 均为n m ?矩阵,则MATLAB 中定义了如下的逻辑运算:

1. 矩阵的“与”运算。

通常用&表示矩阵的与运算。如用A &B 表示两个矩阵的与运算,如果两矩阵对应元素处均非0,那么结果元素为1,否则的话结果为0。

【例1-13】矩阵的“与”运算

>> A=[0 0 0 0;0 1 1 0;0 1 1 0;0 0 0 0] A =

0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0

>> B=eye(4)

B =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

>> and(A,B)

ans =

0 0 0 0

0 1 0 0

0 0 1 0

0 0 0 0

通过结果可以看出,两矩阵对应处元素执行了逻辑“与”运算。

2. 矩阵的“或”运算。

通常用‘|’表示矩阵的与运算。如用A|B表示两个矩阵的与运算,如果两矩阵对应元素处任一元素非0,那么结果元素为1;对应元素处皆为0,结果为0。

【例1-14】矩阵的“或”运算

>> or(A,B)

ans =

1 0 0 0

0 1 1 0

0 1 1 0

0 0 0 1

3. 矩阵的“非”运算。

MATLAB中用~号表示非运算。如矩阵元素为0,对应结果元素为1,否则为0。

【例1-15】矩阵的“非”运算

>> not(A)

ans =

1 1 1 1

1 0 0 1

1 0 0 1

1 1 1 1

4.矩阵的“异或”运算。

通常用命令xor(A,B),表示对应元素处两个数一个为0,一个非0,结果为0,否则结果为1。

【例1-16】矩阵的“异或”运算

>> xor(A,B)

ans =

1 0 0 0

0 0 1 0

0 1 0 0 0 0 0 1

1.2.2.2 矩阵的比较运算

如果用式C=A B >表达一类比较关系,则他们对应位置元素的关系是:如果满足

ij ij a b >,那么1ij c =,否则0ij c =。除此之外,MATLAB 语言还支持等于、大于等于和不

等于等比较关系。对于矩阵的比较运算,MATLAB 中提供了几个比较简单实用的指令,find 、all 和any 。他们各自的功能有所区别。

对于find 函数,它所返回的是满足条件的元素的下标,举例说明: 【例1-17】通过对矩阵

654=2781234??

????

????

A

进行比较运算,观察几个比较运算指令的功能。

>> A=[6 5 4;2 7 8;12 3 4]; >> find(A>=5) ans =

1 3 4 5 8

它所得到结果的意义是,将矩阵A 按列构成列向量,然后再判断哪些元素满足条件,它的

编号规则可用下图表示,假设A 是33?矩阵。

A ??

??=??

????

①④⑦②⑤⑧③⑥⑨

此外,还可以通过下面方法返回满足条件的元素的行坐标和列坐标。

>> [i,j]=find(A>=5); >> [i,j] ans = 1 1 3 1 1 2 2 2 2 3

下面看如何调用函数all 和any 。

>> all(A>=5) ans =

0 0 0 >> any(A>=5) ans =

1 1 1

它们返回的结果可以这样理解,当某列元素全部满足比较关系时,all 的相应元素为1,

否则为0;当某列元素有任一元素满足比较关系,any 的相应元素为1,否则为0。

1.2.3 多项式的化简与变换.

MATLAB中进行符号运算,其计算结果往往冗长不堪,完全不符合用户的需要。此时,由于结果不是最简形式,对结果进行化简处理就显得十分重要。MATLAB提供的化简指令是simple()函数。调用格式如下:

simple()

P s

=

其中,s为原始的表达式,P为化简后表达式。

如果要查看采用何种化简方法可以用以下调用格式,

[,]simple()

s s

=

how

该调用格式中,how为实际采用的化简方式。

当然,用于化简的函数除了simple(),还有其他一些专门的化简函数,如合并同类项的collect(),多项式展开的expand(),因式分解factor(),提取多项式的分子分母numden()和三角函数化简sincos()等。具体的功能详见1.3.5节,这里就不再赘述。

【例1-18】对于多项式

65432

()1813149410201096480

f x x x x x x x

=++++++

1

1

s

x

s

-

=

+

将()

f x替换成s的函数。

>> syms x

>> f=x^6+18*x^5+131*x^4+494*x^3+1020*x^2+1096*x+480

f =

x^6+18*x^5+131*x^4+494*x^3+1020*x^2+1096*x+480

>> P=simple(f)

P =

(x+3)*(x+4)*(x+5)*(x+2)^3

查看另一种调用方法:

>> [a,m]=simple(f)

a =

(x+3)*(x+4)*(x+5)*(x+2)^3

m =

factor

此外,我们还可以调用函数subs(),将多项式中的某一个符号变量替换为新的表达式。

它的调用格式为

subs(,,)*

=

1

P P x x

其中,P为被替换的表达式,

1

P为生成的关于*x新的表达式,x为原变量。

>> F=subs(f,x,(s-1)/(s+1))

F=

(s-1)^6/(s+1)^6+18*(s-1)^5/(s+1)^5+131*(s-1)^4/(s+1)^4+494*(s-1)^3/(s+1)^3+1020*(s-1)^2/ (s+1)^2+

1096*(s-1)/(s+1)+480

>> P1=simple(F)

P1 =

4*(3*s+2)*(2*s+1)*(5*s+3)*(3*s+1)^3/(s+1)^6

这样就得到了关于s的新函数P1。

1.3 基本符号运算.

在MATLAB中,符号常数、符号变量、符号函数、符号操作等是用来形成符号表达式,其运算的特点是严格按照代数、微积分的的计算法则、公式进行运算,并尽可能的给出解析表达式。除此之外,它的运算以推理解析的方式进行,故不受计算误差积累问题的影响,当然,它的缺点是计算所需要的时间比较长。

1.3.1 符号对象和表达式

进行符号运算时,首先要定义基本的符号对象,它可以是常数、变量、表达式。符号表达式由这些基本符号对象去构成。运算中,凡由包含符号对象的表达式所生成的对象也都为符号对象。

MATLAB中定义符号对象的指令有两个:sym,syms。表1.5中列出了这两个指令的常用格式。

表1.5 sym、syms指令的常用格式

指令功能

f = sym (parameter) 把表达式、数字或字符串parameter转换为

符号对象f

f = sym (parameter_n, format) 把数值或数值表达式parameter_n转化为

format格式的符号对象

syms ('parameter1 ', 'parameter2 ', 'parameter3 ') 把字符parameter1,parameter2,parameter3定

义为基本符号对象

syms parameter4 parameter5 parameter6 把字符parameter4,parameter5,parameter6定

义为基本符号对象

下面再举例说明将符号表达式转换为符号变量

转换为符号变量。

【例1-19】将字符表达式sin(x)cos(x)

y = sym('sin(x)*cos(x) ') %把字符表达式转换为符号变量

y = simple(y) %按规则把已有的y符号表达式化成最简形式y =

sin(x)*cos(x)

y =

1/2*sin(2*x)

本例中并未另外单独定义x,但MATLAB仍然将其作为独立符号变量进行运算。在符号运算中,如果我们事先未定义表达式中的独立符号变量,那么MATLAB会自动识别哪些字符是运算过程中的符号函数,哪些是变量符号,一般是把英文字母表中离x 最近的字母认作为独立符号变量。

MATLAB中用来构成符号计算表达式的算符和基本函数,不管在名称、表示方式上,还是在使用规则上,皆与数值计算中的算符和基本函数几乎完全相同。下面简要说明一下符号计算中基本的算符和函数。

(1) 基本运算符。

实现矩阵的加、减、乘、左除、右除、求幂运算的算符分别为“+”、“-”、“*”、“\”、“/”、“^”。此外MATLAB中实现“元素对元素”的数组乘、除、求幂运算的算符也与数值计算中的相同。

(2) 关系运算符。

值得注意的是,在符号对象的比较中,没有“大于”、“大于等于”、“小于”、“小于等于”的概念,而只是有是否“等于”的概念。用于算符两边的对象进行“相等”、“不等”比较的算符分别为“= =”、“~ =”。是,返回结果为1,否,返回结果为0。

其余比如三角函数、指数、对数、矩阵代数指令等运算的算符也与数值计算中的算符和基本函数基本完全相同,这里就不再一一说明。

1.3.2 符号函数的操作

符号函数的操作一般就是求反函数和函数复合。所谓“求反”是指:对函数f(x),求一个函数g(x),使得g(f(x))=x成立。函数复合是指:对于函数f(x)和x=g(y),构造一个函数f(g(y))。对于以上操作MATLAB分别提供了指令:finverse和compose。下面就分别这两个指令的功能的用法作简要介绍,见表1.6。

表1.6 finverse、compose指令的功能

指令功能

g = finverse (f , x) 对函数f(x),指定自变量为x,求反函数g(x)

g = finverse (f) 对缺省自变量的函数f求反函数g

f_g = compose(f, g, x, z, t) 对f(x)和x=g(z)求复合函数f_g = f(g(z))|z=t

f_g = compose(f, g) 求复合函数f_g = f(g(?)),其中“?”为缺省自变量

【例1-20】求f=

syms x ; %定义基本符号变量x

f = x^(1/3); %定义符号函数f(x)

g = finverse(f) %对f求反函数g,x为缺省自变量

g =

x^3

f_g = simple(compose(g,f)) %演算g(f(x))是否等于x

f_g =

x

【例1-21】求

2

2

x

f

1+z

=,g sin(y alpha)

=+的复合函数。

(1) 由系统默认自变量syms x y z alpha t;

f = x^2/(1+z^2);

g = sin(y+alpha); f_g_1 = compose(f, g) f_g_1 =

sin(y+alpha)^2/(1+z^2)

(2) 用户指定自变量

f_g_2 = compose(f, g,z,alpha,t) f_g_2 =

x^2/(1+sin(y+t)^2)

1.3.3 符号对象和其它数据的转换

数值、符号、字符为MATLAB 中的三种不同数据类型。在科学计算中,往往要涉及到很多三种数据类型的转换,所以有必要了解和掌握这些数据类型之间的转换指令。MATLAB 中针对每种数据类型提供了各自特定的生成指令和操作指令,同时为实现他们之间的交互,MATLAB 也向广大用户提供了一系列的转换指令。比较常用的转换指令如图1-1所示

int2str ,num2str mat2str ,sprintf

sscanf

图1-1符号、数值、字符串间的转换指令

【例1-22】符号、数值间的转换。

x = sym((3+sqrt(2))/2) %把数值对象转换成符号对象

double(x) %把符号常数转换为双精度存储的数值 x =

4969962638659315*2^(-51) ans =

2.2071

【例1-23】各种多项式表示形式之间的转换。

syms x; %定义基本符号对象 f = -x + x^2-6*x^3+10; %生成符号多项式

signal = sym2poly(f) % 由符号多项式产生数值系数行向量 signal_easy_read = poly2str(signal, 'x') %把系数行向量变成易读表达式 signal_rebuild = poly2sym(signal) %把数值系数行向量再转换为符号多项式 pretty(f, 'x') %显示符号多项式的易读表示形式 signal =

-6 1 -1 10

signal_easy_read =

-6 x^3 + x^2 - 1 x + 10

signal_rebuild =

-x+x^2-6*x^3+10

2 3

-x + x - 6 x + 10

1.3.4 符号矩阵的生成

MATLAB中生成符号向量或符号矩阵的输入方法与数值类型的向量或者矩阵在形式上很相似。MATLAB中生成符号矩阵大致有两种比较简单的方法,一是利用符号矩阵定义函数sym,二是先用syms命令定义一些必要的符号变量,然后再像定义普通数值矩阵一样输入符号矩阵。下面就举例说明两种声称方法:

1.用命令sym定义矩阵

此时的指令sym实际是在定义一个符号表达式,符号矩阵中的元素可以为任何的合法符号或者是表达式,并且没有长度限制,不过要将方括号置于用于创建符号表达式的单引号中,举例说明。

【例1-24】用sym指令定义矩阵。

sym_matrix = sym('[a b c;This,way,please!]')%定义符号矩阵sym_matrix

sym_matrix =

[ a, b, c]

[ This, way, please!]

sym_digits=sym('[1 2 3; x y z; sin(x), cos(x), tan(z)]') %运用sym指令定义矩阵sym_digits sym_digits =

[ 1, 2, 3]

[ x, y, z]

[ sin(x), cos(x), tan(z)]

2.用命令syms定义矩阵

首先将矩阵中的每个基本变量定义为符号变量,然后像一般数值矩阵一样输入,举例说明。

【例1-25】用指令syms定义矩阵。

syms a b c; %用syms指令定义符号对象a, b, c

sym1 = sym('blue');

sym2 = sym('red');

sym3 = sym('yellow');

syms_matrix = [a b c; sym1,sym2,sym3]

syms_matrix =

[ a, b, c]

[ blue, red, yellow]

syms x y z w; %用syms指令定义符号对象x, y, z

syms_digits = [1, 2, 3, 4; x, y ,z, w; sin(x)+2*cos(y), sec(y+z), tan(x+3*w), sin(w)] %x, y, z 为基本符号变量

syms_digits =

[ 1, 2, 3, 4]

[ x, y, z, w]

[ sin(x)+2*cos(y), sec(y+z), tan(x+3*w), sin(w)]

接下来研究如何把数值矩阵转化成相应的符号矩阵。数值型矩阵和符号型矩阵在MATLAB中是不相同的,它们之间不能直接进行转化。MATLAB提供了一个将数值型转化成符号型的命令sym。

【例1-26】符号矩阵、数值矩阵间的转换。

Digit_Matrix = [1/7 sqrt(3) 3.1415; exp(0.25) log(10) 13^(-1.4) ] %生成数值矩阵Digit_Matrix =

0.1429 1.7321 3.1415

1.2840

2.3026 0.0276

Syms_Matrix = sym(Digit_Matrix)

%用sym指令将数值矩阵Digit_Matrix转换为符号矩阵Syms_Matrix =

[ 1/7, sqrt(3), 6283/2000] [ 5782736388129158*2^(-52), 5184960683398422*2^(-51), 7947289897240437*2^(-58)]

1.3.5 符号表达式的操作

通常工程中和科学计算中,符号运算的结果较复杂、繁冗,不便于读者的阅读、理解和存储。此时,针对于符号运算的简化、分解、展开等一系列提高符号表达式可读性的一些操作指令的应用就越来越多。本节中就介绍一下各个功能函数(见表1.7),并就实际的例子进行说明:

表1.7 符号表达式运算的功能函数

函数功能

collect(polynomial,s) 对多项式表达式polynomial对指定的对象s的同幂项系数进行合并

expand(polynomial) 对多项式表达式polynomial进行多项式、三角函数和指数对数函数等展开

factor(polynomial) 对表达式polynomial进行因式分解

horner(polynomial) 将多项式polynomial分解成嵌套形式

[n,d]=numden(polynomial) 提取表达式的最小分母公因式d和相应的分子多项式simplify(polynomial) 对表达式polynomial进行综合简化

simple(polynomial) 对表达式polynomial转换成最简形式

pretty(polynomial) 以直观的方式显示polynomial表达式

【例1-27】用不同的方法合并同幂项

>> syms t

>> polynomial=(2*x^3+2*x*exp(-2*t)+1)*(x+exp(-2*t)) %定义符号表达式

polynomial =

(2*x^3+2*x*exp(-2*t)+1)*(x+exp(-2*t))

>> polynomial1=collect(polynomial) %对符号表达式polynomial进行合并同类项polynomial1 =

2*x^4+2*exp(-2*t)*x^3+2*exp(-2*t)*x^2+(1+2*exp(-2*t)^2)*x+exp(-2*t) >> polynomial2=collect(polynomial,'exp(-2*t)')

%对符号表达式polynomial,对指定的对象进行进行合并同类项操作polynomial2 =

2*x*exp(-2*t)^2+(2*x^3+1+2*x^2)*exp(-2*t)+(2*x^3+1)*x

【例1-28】factor指令的使用

>> syms x a b c

>> P1=x^4-15*x^2-10*x+24;

>> factor(P1)

ans =

(x-1)*(x+2)*(x+3)*(x-4)

该命令是对已知符号表达式进行因式分解操作。

如果表达式中含有其他的变量,那么,

>> P2=x^3+x^2*c+x^2*b+x*b*c+x^2*a+x*a*c+x*a*b+a*b*c;

>> factor(P2)

ans =

(x+a)*(x+b)*(x+c)

【例1-29】写出矩阵

3

2

1

47

2

5

4

1

x

x

x

x

??

+

+

??

??

+

??

??

-

??

各个元素的分子、分母多项式。

>> [N,D]=numden(A)

N =

[ x^3+1, 4*x+7]

[ x^2+5, 4]

N为矩阵各元素的分子多项式。

D =

[ 2, 1]

[ x-1, 1]

D为矩阵各元素的分母多项式。

另外还有simple( )和simplify( )指令,前面已经介绍过。值得说明的是,simple( )可以给出比simplify( )更短,更简单的结果;如多次使用simple( )指令,可找到最少字母的简化式。

【例1-30】对多项式进行嵌套型分解。

>> syms t

>> P3=3+4*t+5*t^2-6*t^3+t^4;

>> horner(P3)

ans =

3+(4+(5+(-6+t)*t)*t)*t

基于Matlab/Simulink 的BOOST电路仿真 姓名: 学号: 班级: 时间:2010年12月7日

1引言 BOOST 电路又称为升压型电路, 是一种直流- 直流变换电路, 其电路结构如图1 所示。此电路在开关电源领域内占有非常重要的地位, 长期以来广泛的应用于各种电源设备的设计中。对它工作过程的理解掌握关系到对整个开关电源领域各种电路工作过程的理解, 然而现有的书本上仅仅给出电路在理想情况下稳态工作过程的分析, 而没有提及电路从启动到稳定之间暂态的工作过程, 不利于读者理解电路的整个工作过程和升压原理。采用matlab仿真分析方法, 可直观、详细的描述BOOST 电路由启动到达稳态的工作过程, 并对其中各种现象进行细致深入的分析, 便于我们真正掌握BOO ST 电路的工作特性。 图1BOO ST 电路的结构 2电路的工作状态 BOO ST 电路的工作模式分为电感电流连续工作模式和电感电流断续工作模式。其中电流连续模式的电路工作状态如图2 (a) 和图2 (b) 所示, 电流断续模式的电路工作状态如图2 (a)、(b)、(c) 所示, 两种工作模式的前两个工作状态相同, 电流断续型模式比电流连续型模式多出一个电感电流为零的工作状态。 (a) 开关状态1 (S 闭合) (b) 开关状态2 (S 关断) (c) 开关状态3 (电感电流为零) 图2BOO ST 电路的工作状态

3matlab仿真分析 matlab 是一种功能强大的仿真软件, 它可以进行各种各样的模拟电路和数字电路仿真,并给出波形输出和数据输出, 无论对哪种器件和哪种电路进行仿真, 均可以得到精确的仿真结果。本文应用基于matlab软件对BOO ST 电路仿真, 仿真图如图3 所示,其中IGBT作为开关, 以脉冲发生器脉冲周期T=0.2ms,脉冲宽度为50%的通断来仿真图2 中开关S的通断过程。 图3BOO ST 电路的PSp ice 模型 3.1电路工作原理 在电路中IGBT导通时,电流由E经升压电感L和V形成回路,电感L储能;当IGBT关断时,电感产生的反电动势和直流电源电压方向相同互相叠加,从而在负载侧得到高于电源的电压,二极管的作用是阻断IGBT导通是,电容的放电回路。调节开关器件V的通断周期,可以调整负载侧输出电流和电压的大小。负载侧输出电压的平均值为: (3-1) 式(3-1)中T为开关周期, 为导通时间,为关断时间。

东南大学自动化学院 智能控制概论 神经网络学习算法研究 学院: 姓名: 学号: 日期:

目录 1 任务要求叙述 ..................................................... 错误!未定义书签。 2 系统分析及设计原理 ......................................... 错误!未定义书签。 3 设计实现.............................................................. 错误!未定义书签。4仿真验证.. (6) 5 讨论与分析.......................................................... 错误!未定义书签。

一.任务要求叙述 (1)任务 (a) 运行算法,观察和分析现有学习算法的性能; clear all;close all; nu=20;pi=3.1415926; for i=1:nu p(i)=2*pi*i/nu; t(i)=0.5*(1+cos(p(i))); end minmax=[min(p(:)) max(p(:))] net = newff([ 0 7],[6 1],{'logsig' 'purelin'},'traingd');% traingd traingdm trainlm net.trainParam.epochs = 10000; net.trainParam.goal = 0.0001; net.trainParam.show=200; net.trainParam.lr=0.1; net.trainParam.mc=0.6; %0.9 default value; available for momentum net = train(net,p,t); y1 = sim(net,p); figure(2); plot(p,t,'*-',p,y1,'r--') %************** test data ****************** nu2=nu*3/2; for i=1:(nu2) p2(i)=2*pi*i/(nu2); t2(i)=0.5*(1+cos(p2(i))); end y2 = sim(net,p2); figure(3); plot(t2,'*-');hold on; plot(y2,'r'); xlabel('times');ylabel('outputs'); figure(4); plot(t2-y2); xlabel('times');ylabel('error'); (b) 为了进一步提高学习逼近效果,可以采取那些措施,调节规律如何?根据所提的每种措施,修改算法程序,给出仿真效果验证、过程以及相应的曲线图,给出适当的评述;(c) 联系、结合前向神经网络的算法样本学习、测试等过程,谈谈本人对神经网络系统的一些认识和看法。

时域有限差分法的Matlab仿真 关键词: Matlab 矩形波导时域有限差分法 摘要:介绍了时域有限差分法的基本原理,并利用Matlab仿真,对矩形波导谐振腔中的电磁场作了模拟和分析。 关键词:时域有限差分法;Matlab;矩形波导;谐振腔 目前,电磁场的时域计算方法越来越引人注目。时域有限差分(Finite Difference Time Domain,FDTD)法[1]作为一种主要的电磁场时域计算方法,最早是在1966年由K. S. Yee提出的。这种方法通过将Maxwell旋度方程转化为有限差分式而直接在时域求解,通过建立时间离散的递进序列,在相互交织的网格空间中交替计算电场和磁场。经过三十多年的发展,这种方法已经广泛应用到各种电磁问题的分析之中。 Matlab作为一种工程仿真工具得到了广泛应用[2]。用于时域有限差分法,可以简化编程,使研究者的研究重心放在FDTD法本身上,而不必在编程上花费过多的时间。 下面将采用FDTD法,利用Matlab仿真来分析矩形波导谐振腔的电磁场,说明了将二者结合起来的优越性。 1FDTD法基本原理 时域有限差分法的主要思想是把Maxwell方程在空间、时间上离散化,用差分方程代替一阶偏微分方程,求解差分方程组,从而得出各网格单元的场值。FDTD 空间网格单元上电场和磁场各分量的分布如图1所示。 电场和磁场被交叉放置,电场分量位于网格单元每条棱的中心,磁场分量位于网格单元每个面的中心,每个磁场(电场)分量都有4个电场(磁场)分量环绕。这样不仅保证了介质分界面上切向场分量的连续性条件得到自然满足,而且

还允许旋度方程在空间上进行中心差分运算,同时也满足了法拉第电磁感应定律和安培环路积分定律,也可以很恰当地模拟电磁波的实际传播过程。 1.1Maxwell方程的差分形式 旋度方程为: 将其标量化,并将问题空间沿3个轴向分成若干网格单元,用Δx,Δy和Δz 分别表示每个网格单元沿3个轴向的长度,用Δt表示时间步长。网格单元顶点的坐标(x,y,z)可记为: 其中:i,j,k和n为整数。 同时利用二阶精度的中心有限差分式来表示函数对空间和时间的偏导数,即可得到如下FDTD基本差分式: 由于方程式里出现了半个网格和半个时间步,为了便于编程,将上面的差分式改写成如下形式:

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta ,Rho,Q) %%===================================================== ==================== %% ACATSP.m %% Ant Colony Algorithm for Traveling Salesman Problem %% ChengAihua,PLA Information Engineering University,ZhengZhou,China %% Email:aihuacheng@https://www.doczj.com/doc/ea17922924.html, %% All rights reserved %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×4的矩阵 %% NC_max 最大迭代次数 %% m 蚂蚁个数 %% Alpha 表征信息素重要程度的参数 %% Beta 表征启发式因子重要程度的参数 %% Rho 信息素蒸发系数 %% Q 信息素增加强度系数 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%===================================================== ==================== %%第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=max( ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5,min(abs(C(i,3)-C(j,3)),144- abs(C(i,3)-C(j,3))) );%计算城市间距离 else D(i,j)=eps; end D(j,i)=D(i,j); end end Eta=1./D;%Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n);%Tau为信息素矩阵 Tabu=zeros(m,n);%存储并记录路径的生成 NC=1;%迭代计数器 R_best=zeros(NC_max,n);%各代最佳路线

3.3.2 各种BP学习算法MATLAB仿真 根据上面一节对BP神经网络的MATLAB设计,可以得出下面的通用的MATLAB程序段,由于各种BP学习算法采用了不同的学习函数,所以只需要更改学习函数即可。 MATLAB程序段如下: x=-4:0.01:4; y1=sin((1/2)*pi*x)+sin(pi*x); %trainlm函数可以选择替换 net=newff(minmax(x),[1,15,1],{'tansig','tansig','purelin'},'trainlm'); net.trainparam.epochs=2000; net.trainparam.goal=0.00001; net=train(net,x,y1); y2=sim(net,x); err=y2-y1; res=norm(err); %暂停,按任意键继续 Pause %绘图,原图(蓝色光滑线)和仿真效果图(红色+号点线) plot(x,y1); hold on plot(x,y2,'r+'); 注意:由于各种不确定因素,可能对网络训练有不同程度的影响,产生不同的效果。如图3-8。 标准BP算法(traingd)

图3-8 标准BP算法的训练过程以及结果(原图蓝色线,仿真图+号线)增加动量法(traingdm) 如图3-9。 图3-9 增加动量法的训练过程以及结果(原图蓝色线,仿真图+号线)弹性BP算法(trainrp)如图3-10 图3-10 弹性BP算法的训练过程以及结果(原图蓝色线,仿真图+号线)

动量及自适应学习速率法(traingdx)如图3-11。 图3-11 动量及自适应学习速率法的训练过程以及结果(原图蓝色线,仿真图+号线)共轭梯度法(traincgf)如图3-12。

本文前言 MA TLAB的简介 MATLAB是一种适用于工程应用的各领域分析设计与复杂计算的科学计算软件,由美国Mathworks公司于1984年正式推出,1988年退出3.X(DOS)版本,19992年推出4.X(Windows)版本;19997年腿5.1(Windows)版本,2000年下半年,Mathworks公司推出了他们的最新产品MATLAB6.0(R12)试用版,并于2001年初推出了正式版。随着版本的升级,内容不断扩充,功能更加强大。近几年来,Mathworks公司将推出MATLAB语言运用于系统仿真和实时运行等方面,取得了很多成绩,更扩大了它的应用前景。MATLAB已成为美国和其他发达国家大学教学和科学研究中最常见而且必不可少的工具。 MATLAB是“矩阵实验室”(Matrix Laboratory)的缩写,它是一种以矩阵运算为基础的交互式程序语言,着重针对科学计算、工程计算和绘图的需要。在MATLAB中,每个变量代表一个矩阵,可以有n*m个元素,每个元素都被看做复数摸索有的运算都对矩阵和复数有效,输入算式立即可得结果,无需编译。MATLAB强大而简易的做图功能,能根据输入数据自动确定坐标绘图,能自定义多种坐标系(极坐标系、对数坐标系等),讷讷感绘制三维坐标中的曲线和曲面,可设置不同的颜色、线形、视角等。如果数据齐全,MATLAB通常只需要一条命令即可做图,功能丰富,可扩展性强。MATLAB软件包括基本部分和专业扩展部分,基本部分包括矩阵的运算和各种变换、代数和超越方程的求解、数据处理和傅立叶变换及数值积分风,可以满足大学理工科学生的计算需要,扩展部分称为工具箱,它实际上使用MATLAB的基本语句编成的各种子程序集,用于解决某一方面的问题,或实现某一类的新算法。现在已经有控制系统、信号处理、图象处理、系统辨识、模糊集合、神经元网络及小波分析等多种工具箱,并且向公式推倒、系统仿真和实时运行等领域发展。MATLAB语言的难点是函数较多,仅基本部分就有七百多个,其中常用的有二三百个。 MATLAB在国内外的大学中,特别是数值计算应用最广的电气信息类学科中,已成为每个学生都应该掌握的工具。MATLAB大大提高了课程教学、解题作业、分析研究的效率。

先新建一个主程序M文件ACATSP.m 代码如下: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q) %%================================================== ======================= %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 %% NC_max 蚁群算法MATLAB程序最大迭代次数 %% m 蚂蚁个数 %% Alpha 表征信息素重要程度的参数 %% Beta 表征启发式因子重要程度的参数 %% Rho 信息素蒸发系数 %% Q 表示蚁群算法MATLAB程序信息素增加强度系数 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%================================================== =======================

%% 蚁群算法MATLAB程序第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; % i = j 时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示 end D(j,i)=D(i,j); %对称矩阵 end end Eta=1./D; %Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n); %Tau为信息素矩阵 Tabu=zeros(m,n); %存储并记录路径的生成

tic figure(1);hold on ezplot('x*sin(10*pi*x)+2',[-1,2]); %% 参数设置 fishnum=50; %生成50只人工鱼 MAXGEN=50; %最多迭代次数 try_number=100;%最多试探次数 visual=1; %感知距离 delta=0.618; %拥挤度因子 step=0.1; %步长 %% 初始化鱼群 lb_ub=[-1,2,1]; X=AF_init(fishnum,lb_ub); LBUB=[]; fori=1:size(lb_ub,1) LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)]; end gen=1; BestY=-1*ones(1,MAXGEN); %每步中最优的函数值 BestX=-1*ones(1,MAXGEN); %每步中最优的自变量 besty=-100; %最优函数值 Y=AF_foodconsistence(X); while gen<=MAXGEN fprintf(1,'%d\n',gen) fori=1:fishnum %% 聚群行为 [Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y); %% 追尾行为 [Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y); if Yi1>Yi2 X(:,i)=Xi1; Y(1,i)=Yi1; else X(:,i)=Xi2; Y(1,i)=Yi2; end end [Ymax,index]=max(Y); figure(1); plot(X(1,index),Ymax,'.','color',[gen/MAXGEN,0,0]) ifYmax>besty besty=Ymax; bestx=X(:,index); BestY(gen)=Ymax;

编程方式实现: 1.惩罚函数 function f=fun(x,r) f=x(1,1)^2+x(2,1)^2-r*log(x(1,1)-1); 2.步长的函数 function f=fh(x0,h,s,r) %h为步长 %s为方向 %r为惩罚因子 x1=x0+h*s; f=fun(x1,r); 3. 步长寻优函数 function h=fsearchh(x0,r,s) %利用进退法确定高低高区间,利用黄金分割法进行求解h1=0;%步长的初始点 st=0.001; %步长的步长 h2=h1+st; f1=fh(x0,h1,s,r); f2=fh(x0,h2,s,r); if f1>f2 h3=h2+st; f3=fh(x0,h3,s,r); while f2>f3 h1=h2; h2=h3; h3=h3+st; f2=f3; f3=fh(x0,h3,s,r); end else st=-st; v=h1; h1=h2; h2=v; v=f1; f1=f2; f2=v; h3=h2+st; f3=fh(x0,h3,s,r); while f2>f3 h1=h2; h2=h3; h3=h3+st; f2=f3;

f3=fh(x0,h3,s,r); end end %得到高低高的区间 a=min(h1,h3); b=max(h1,h3); %利用黄金分割点法进行求解 h1=1+0.382*(b-a); h2=1+0.618*(b-a); f1=fh(x0,h1,s,r); f2=fh(x0,h2,s,r); while abs(a-b)>0.0001 if f1>f2 a=h1; h1=h2; f1=f2; h2=a+0.618*(b-a); f2=fh(x0,h2,s,r); else b=h2; h2=h1; f2=f1; h1=a+0.382*(b-a); f1=fh(x0,h1,s,r); end end h=0.5*(a+b); 4. 迭代点的寻优函数 function f=fsearchx(x0,r,epson) x00=x0; m=length(x0); s=zeros(m,1); for i=1:m s(i)=1; h=fsearchh(x0,r,s); x1=x0+h*s; s(i)=0; x0=x1; end while norm(x1-x00)>epson x00=x1; for i=1:m s(i)=1; h=fsearchh(x0,r,s);

M文件: k=1; Int_F=inline('t','t'); for x=[1,3,5] f_x(k)=x^3+x+log(x)*sin(x)+quad8(Int_F,0,x); k=k+1; end f_x >> Calcfx Warning: QUAD8 is obsolete. We use QUADL instead. > In quad8 at 35 In Calcfx at 4 f_x = 2.5000 34.6550 140.9567 M文件: function[mean,stdev]=stat(x) n=length(x); mean=sum(x)/n; stdev=sqrt(sum(x-mean).^2/n); >> x=[1,3,2]; >> [k,l]=stat(x) k = 2 l = 微积分方程组的MA TLAB函数: 文件funcforex123.m function xdot=funcforex123(t,x,flag,r,l,c) xdot=zeros(2,1); xdot(1)=-r/l*x(1)-1/l*x(2)+1/l*f(t); xdot(2)=1/c*x(1); function in=f(t) in=(t>0)*1; 文件Ex123.m l=1; c=0.1; for r=[1.5 3 5]

[t,x]=ode45('funcforex123',[-1,10],[0;0],[],r,l,c); figure(1);plot(t,x(:,1));hold on;xlabel('time sec'); text(0.9,0.17,'\lefttarrow i_L(t)');grid; figure(2);plot(t,x(:,2));hold on;xlabel('time sec'); text(0.5,0.3,'\leftarrow u_C(t)');grid; End >> ex123 Warning: Unable to interpret TeX string "\lefttarrow i_L(t)". > In ex123 at 5 Warning: Unable to interpret TeX string "\lefttarrow i_L(t)". > In ex123 at 7 Warning: Unable to interpret TeX string "\lefttarrow i_L(t)". > In ex123 at 7

蚁群算法的matlab源码,同时请指出为何不能优化到已知的最好解 % % % the procedure of ant colony algorithm for VRP % % % % % % % % % % % % %initialize the parameters of ant colony algorithms load data.txt; d=data(:,2:3); g=data(:,4); m=31; % 蚂蚁数 alpha=1; belta=4;% 决定tao和miu重要性的参数 lmda=0; rou=0.9; %衰减系数 q0=0.95; % 概率 tao0=1/(31*841.04);%初始信息素 Q=1;% 蚂蚁循环一周所释放的信息素 defined_phrm=15.0; % initial pheromone level value QV=100; % 车辆容量 vehicle_best=round(sum(g)/QV)+1; %所完成任务所需的最少车数V=40; % 计算两点的距离 for i=1:32; for j=1:32;

dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2); end; end; %给tao miu赋初值 for i=1:32; for j=1:32; if i~=j; %s(i,j)=dist(i,1)+dist(1,j)-dist(i,j); tao(i,j)=defined_phrm; miu(i,j)=1/dist(i,j); end; end; end; for k=1:32; for k=1:32; deltao(i,j)=0; end; end; best_cost=10000; for n_gen=1:50; print_head(n_gen); for i=1:m; %best_solution=[]; print_head2(i);

PID 控制算法的matlab 仿真 PID 控制算法就是实际工业控制中应用最为广泛的控制算法,它具有控制器设计简单,控制效果好等优点。PID 控制器参数的设置就是否合适对其控制效果具有很大的影响,在本课程设计中一具有较大惯性时间常数与纯滞后的一阶惯性环节作为被控对象的模型对PID 控制算法进行研究。被控对象的传递函数如下: ()1d s f Ke G s T s τ-= + 其中各参数分别为30,630,60f d K T τ===。MATLAB 仿真框图如图1所示。 图1 2 具体内容及实现功能 2、1 PID 参数整定 PID 控制器的控制参数对其控制效果起着决定性的作用,合理设置控制参数就是取得较好的控制效果的先决条件。常用的PID 参数整定方法有理论整定法与实验整定法两类,其中常用的实验整定法由扩充临界比例度法、试凑法等。在此处选用扩充临界比例度法对PID 进行整定,其过程如下: 1) 选择采样周期 由于被控对象中含有纯滞后,且其滞后时间常数为 60d τ=,故可选择采样周期1s T =。 2) 令积分时间常数i T =∞,微分时间常数0d T =,从小到大调节比例系数K , 使得系统发生等幅震荡,记下此时的比例系数k K 与振荡周期k T 。 3) 选择控制度为 1.05Q =,按下面公式计算各参数:

0.630.490.140.014p k i k d k s k K K T T T T T T ==== 通过仿真可得在1s T =时,0.567,233k k K T ==,故可得: 0.357,114.17,32.62, 3.262p i d s K T T T ==== 0.0053.57 p s i i p d d s K T K T K T K T === = 按此组控制参数得到的系统阶跃响应曲线如图2所示。 01002003004005006007008009001000 0.20.40.60.811.21.41.6 1.8 图2 由响应曲线可知,此时系统虽然稳定,但就是暂态性能较差,超调量过大,且响应曲线不平滑。根据以下原则对控制器参数进行调整以改善系统的暂态过程: 1) 通过减小采样周期,使响应曲线平滑。 2) 减小采样周期后,通过增大积分时间常数来保证系统稳定。 3) 减小比例系数与微分时间常数,以减小系统的超调。 改变控制器参数后得到系统的阶跃响应曲线如图3所示,系统的暂态性能得到明显改善、

实验一 典型环节的MATLAB 仿真 一、实验目的 1.熟悉MATLAB 桌面和命令窗口,初步了解SIMULINK 功能模块的使用方法。 2.通过观察典型环节在单位阶跃信号作用下的动态特性,加深对各典型环节响应曲线的理解。 3.定性了解各参数变化对典型环节动态特性的影响。 二、SIMULINK 的使用 MATLAB 中SIMULINK 是一个用来对动态系统进行建模、仿真和分析的软件包。利用SIMULINK 功能模块可以快速的建立控制系统的模型,进行仿真和调试。 1.运行MATLAB 软件,在命令窗口栏“>>”提示符下键入simulink 命令,按Enter 键或在工具栏单击按钮,即可进入如图1-1所示的SIMULINK 仿真 环境下。 2.选择File 菜单下New 下的Model 命令,新建一个simulink 仿真环境常规模板。 3.在simulink 仿真环境下,创建所需要的系统 三、实验内容 按下列各典型环节的传递函数,建立相应的SIMULINK 仿真模型,观察并记录其单位阶跃响应波形。 ① 比例环节1)(1=s G 和2)(1=s G 实验处理:1)(1=s G SIMULINK 仿真模型

波形图为: 实验处理:2)(1=s G SIMULINK 仿真模型 波形图为: 实验结果分析:增加比例函数环节以后,系统的输出型号将输入信号成倍数放大. ② 惯性环节11)(1+= s s G 和15.01)(2+=s s G 实验处理:1 1 )(1+=s s G SIMULINK 仿真模型

波形图为: 实验处理:1 5.01 )(2+= s s G SIMULINK 仿真模型 波形图为: 实验结果分析:当1 1 )(1+= s s G 时,系统达到稳定需要时间接近5s,当

实验六 基于Simulink 的简单电力系统仿真 实验目的 1) 熟悉Simulink 的工作环境; 2) 掌握Simulink 电力系统工具箱的使用; 3) 掌握在Simulink 的工作环境中建立简单电力系统的仿真模型 实验内容 输电线路电路参数建模时采用电力系统分析中常用的π型等值电路,搭建如图1所示的一个简单交流单相电力系统,在仿真进行中,负载通过断路器切除并再次投入。π型等值电路具体元件参数如下:Ω=2.5R ,H L 138.0=, F C C μ967.021==。 图1 简单电力系统仿真示意图 1) 在Simulink 中建立简单交流单相电力系统模型,并进行仿真,观测负载电流和输电线路末端电压; 2) 结合理论知识分析上述观测信号变化的原因; 3) 比较不同功率因数,如cos φ=1、cos φ=0.8(感性)、cos φ=0.8(容性)负载条件下的仿真结果 实验原理与方法 1、系统的仿真电路图 实验步骤 根据所得建立模型,给定参数,得到仿真结果 cos φ=1 cos φ=0.8(感性) cos φ=0.8(容性)

实验结果与分析 cosφ=1 cosφ=0.8(感性) cosφ=0.8(容性) 仿真结果分析 (1)在纯阻性负载电路中,电压相位与电流相位相同;与感性负载相比,断路器重新闭合后电流没有额外的直流分量。 (2)在感性负载中,电压相位超前电流相位;断路器重新闭合时,交变的电流瞬间增加了一个直流分量,随后逐渐减小。 (3)在容性负载中,电压相位滞后于电流相位;断路器重新闭合时,电流瞬间突变至极大;与感性负载和纯阻性负载相比,断路器断开时的末端电压由于有电容放电作用,电压波形畸变很小。 (4)当断路器断开时,线路断路,电流突变为0,但电压行波仍在进行,因此在末端能够测量到连续的电压波形,但断路器断开对电压波形造成了影响,产生了畸变。这是由于能量是通过电磁场传递的,线路断开时电压继续向前传递。 总括:L和C对输出波形振荡的频率和幅度影响程度不同,当变化相同幅度时,电容对振荡频率和幅度的影响要比电感的大。 感想:Matlab中Simulik通过拖拉建模方式对电路进行仿真,具有快捷、方便、灵活的特点。Simulink的仿真电路简洁、参数调整方便。仿真结果直观。 通过本次实验,我认识到了建模与仿真的一般性方法,收获甚多,也更进一步了解了Matlab,Matlab不仅仅在平时的编程方面功能强大,在仿真方面也熠熠生辉。

function [y,val]=QACStic load att48 att48; MAXIT=300; % 最大循环次数 NC=48; % 城市个数 tao=ones(48,48);% 初始时刻各边上的信息最为1 rho=0.2; % 挥发系数 alpha=1; beta=2; Q=100; mant=20; % 蚂蚁数量 iter=0; % 记录迭代次数 for i=1:NC % 计算各城市间的距离 for j=1:NC distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2); end end bestroute=zeros(1,48); % 用来记录最优路径 routelength=inf; % 用来记录当前找到的最优路径长度 % for i=1:mant % 确定各蚂蚁初始的位置 % end for ite=1:MAXIT for ka=1:mant %考查第K只蚂蚁 deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零 [routek,lengthk]=travel(distance,tao,alpha,beta); if lengthk

自适应滤波器 MATLAB仿真 摘要 : 本文介绍了自适应滤波器的工作原理,以及推导了著名的LMS( Least mean squares )算法。以一个例子演示了自适应滤波器的滤波效果。实验结果表明,该滤波器滤波效果较好。 关键词:自适应滤波器 MATLAB7.0 LMS 算法 Simulate of adaptive filter based on MATLAB7.0 Abstract: This article described the working principle of adaptive filter and deduced the well-known LMS algorithm. Take an example to demonstrate the adaptive filters filtering effects. The results show that the filter has an effective way to filter single. Key words: LMS algorithm Adaptive Filter Matlab7.0 1引言 由 Widrow B 等提出的自适应滤波理论,是在维纳滤波、卡尔曼滤波等线性滤波基础上发展起来的一种最佳滤波方法。由于它具有更强的适应性和更优的滤波性能,从而广泛应用于通信、系统辨识、回波消除、自适应谱线增强、自适应信道均衡、语音线性预测和自适应天线阵等诸多领域[1]。自适应滤波器最大的优点在于不需要知道信号和噪声的统计特性的先验知识就可以实现信号的最佳滤波处理。本文通过一个具体例子和结果论证了自适应滤波器的滤波效果。 2自适应滤波原理及 LMS算法 2.1 自适应滤波原理 图 1 自适应滤波原理图 在自适应滤波器中,参数可调的数字滤波器一般为 FIR 数字滤波器, IIR 数字滤波器或格型数字滤波器。自适应滤波分 2 个过程。第一,输入信号想 x(n) 通过参数可调的数字滤波器后得输出信号 y(n) ,y(n) 与参考信号 d(n) 进行比较得误差信号 e(n) ;第二,通过一种自适应算法和 x(n) 和 e(n) 的值来调节参数可调的数字滤波器的参数,即加权系

一.信道均衡的概念 实际的基带传输系统不可能完全满足无码间串扰传输条件,因而码间串扰是不可避免的。当串扰严重时,必须对系统的传输函数 进行校正,使其达到或接近无码间串扰要求的特性。理论和实践表明,在基带系统中插入一种可调滤波器就可以补偿整个系统的幅频,和相频特性从而减小码间串扰的影响这个对系统校正的过程称为均衡,实现均衡的滤波器称为均衡器。 均衡分为频域均衡和时域均衡。频域均衡是从频率响应考虑,使包括均衡器在内的整个系统的总传输函数满足无失真传输条件。而时域均衡,则是直接从时间响应考虑,使包括均衡器在内的整个系统的冲激响应满足无码间串扰条件。 频域均衡在信道特性不变,且传输低速率数据时是适用的,而时域均衡可以根据信道特性的变化进行调整,能够有效地减小码间串扰,故在高速数据传输中得以广泛应用。 时域均衡的实现方法有多种,但从实现的原理上看,大致可分为预置式自动均衡和自适应式自动均衡。预置式均衡是在实际传数之前先传输预先规定的测试脉冲(如重复频率很低的周期性的单脉冲波形),然后按“迫零调整原理”自动或手动调整抽头增益;自适应式均衡是在传数过程中连续测出距最佳调整值的误差电压,并据此电压去调整各抽头增益。一般地,自适应均衡不仅可以使调整精度提高,而且当信道特性随时间变化时又能有一定的自适应性,因此很受重视。这种均衡器过去实现起来比较复杂,但随着大规模、超大规模集成电路和微处理机的应用,其发展十分迅速。 二.信道均衡的应用 1.考虑如图所示的基带等效数据传输系统,发送信号k x 经过ISI 失真信道传输,叠加高斯加性噪声。 图1基带等效数据传输模型 设发送信号采用QPSK 调制,即(1)k x j =±±ISI 信道的冲击响应以向量的形式表示为h 2211[,,,]T L L L h h h --+=???。典型的ISI 信道响应向量有三种: h [0.04,0.05,0.07,0.21,0.5,0.72,0.36,0,0.21,0.03,0.07]T A =--- h [0.407,0.815,0.407]T B = h [0.227,0.46,0.6888,0.46,0.227]T C = k ω为实部与虚部独立的复高斯白噪声,其均值为零,方差为2 ωσ。 2.实现目的

蚁群算法matlab精讲及仿真 4.1基本蚁群算法 4.1.1基本蚁群算法的原理 蚁群算法是上世纪90年代意大利学者M.Dorigo,v.Maneizz。等人提出来的,在越来越多的领域里得到广泛应用。蚁群算法,是一种模拟生物活动的智能算法,蚁群算法的运作机理来源于现实世界中蚂蚁的真实行为,该算法是由Marco Dorigo 首先提出并进行相关研究的,蚂蚁这种小生物,个体能力非常有限,但实际的活动中却可以搬动自己大几十倍的物体,其有序的合作能力可以与人类的集体完成浩大的工程非常相似,它们之前可以进行信息的交流,各自负责自己的任务,整个运作过程统一有序,在一只蚂蚁找食物的过程中,在自己走过的足迹上洒下某种物质,以传达信息给伙伴,吸引同伴向自己走过的路径上靠拢,当有一只蚂蚁找到食物后,它还可以沿着自己走过的路径返回,这样一来找到食物的蚂蚁走过的路径上信息传递物质的量就比较大,更多的蚂蚁就可能以更大的机率来选择这条路径,越来越多的蚂蚁都集中在这条路径上,蚂蚁就会成群结队在蚁窝与食物间的路径上工作。当然,信息传递物质会随着时间的推移而消失掉一部分,留下一部分,其含量是处于动态变化之中,起初,在没有蚂蚁找到食物的时候,其实所有从蚁窝出发的蚂蚁是保持一种随机的运动状态而进行食物搜索的,因此,这时,各蚂蚁间信息传递物质的参考其实是没有价值的,当有一只蚂蚁找到食物后,该蚂蚁一般就会向着出发地返回,这样,该蚂蚁来回一趟在自己的路径上留下的信息传递物质就相对较多,蚂蚁向着信息传递物质比较高的路径上运动,更多的蚂蚁就会选择找到食物的路径,而蚂蚁有时不一定向着信

息传递物质量高的路径走,可能搜索其它的路径。这样如果搜索到更短的路径后,蚂蚁又会往更短的路径上靠拢,最终多数蚂蚁在最短路径上工作。【基于蚁群算法和遗传算法的机器人路径规划研究】 该算法的特点: (1)自我组织能力,蚂蚁不需要知道整体环境信息,只需要得到自己周围的信息,并且通过信息传递物质来作用于周围的环境,根据其他蚂蚁的信息素来判断自己的路径。 (2)正反馈机制,蚂蚁在运动的过程中,收到其他蚂蚁的信息素影响,对于某路径上信息素越强的路径,其转向该路径的概率就越大,从而更容易使得蚁群寻找到最短的避障路径。 (3)易于与其他算法结合,现实中蚂蚁的工作过程简单,单位蚂蚁的任务也比较单一,因而蚁群算法的规则也比较简单,稳定性好,易于和其他算法结合使得避障路径规划效果更好。 (4)具有并行搜索能力探索过程彼此独立又相互影响,具备并行搜索能力,这样既可以保持解的多样性,又能够加速最优解的发现。 4.1.2 基本蚁群算法的生物仿真模型 a为蚂蚁所在洞穴,food为食物所在区,假设abde为一条路径,eadf为另外一条路径,蚂蚁走过后会留下信息素,5分钟后蚂蚁在两条路径上留下的信息素的量都为3,概率可以认为相同,而30分钟后baed路径上的信息素的量为60,明显大于eadf路径上的信息素的量。最终蚂蚁会完全选择abed这条最短路径,由此可见,

河北北方学院 毕业论文 题目:数字调制系统的SIMULINK实现研究 三种基本调制制度的功率谱密度研究院系:信息工程系 专业:信息工程 年级:07级 河北北方学院教务处制 三种基本调制制度的功率谱密度研究 摘要 随着通信系统的规模和复杂度不断增加,传统的设计方法已经不能适应发展的需要,通信系统的模拟仿真技术越来越受到重视。而通信系统的计算机模拟仿真技

术是一种全新的系统设计方法,它可以让用户在很短的时间内建立整个通信系统模型,并对其进行模拟仿真。本文首先介绍了SIMULINK应用及通信技术的发展状况。然后对SIMULINK的工作原理及使用方法进行阐述,接着介绍基本的数字调制系统并分析三种调制制度2ASK、2FSK和2PSK的基本原理。再对三种调制制度的功率谱密度进行分析,最后利用SIMULINK建立系统模型对三种调制制度的功率谱密度进行模拟仿真并分析结果。 关键词:调制制度 SIMULINK 功率谱密度系统模型 Abstract As communications systems continue to increase in size and complexity, traditional design methods have been unable to meet the needs of development, communication system simulation technology more and more attention. Er Communication System Computer simulation technology is a new design method, which allows users in a very short period of time to establish the communication system model, and its

相关主题
文本预览
相关文档 最新文档