Matlab仿真技术

乔世坤

目录

  • 1 实验一Matlab基础与入门
    • 1.1 Matlab简介
    • 1.2 变量与数值
    • 1.3 矩阵运算
    • 1.4 数组运算
    • 1.5 常用数学函数
    • 1.6 Matlab帮助系统
    • 1.7 实验内容
    • 1.8 思考题
  • 2 实验二 Matlab程序设计基础
    • 2.1 M文件
    • 2.2 Matlab程序流控制
    • 2.3 实验内容
    • 2.4 思考题
  • 3 实验三Matlab图形绘制
    • 3.1 二维曲线的绘制
    • 3.2 三维曲线的绘制
    • 3.3 实验内容
    • 3.4 思考题
  • 4 MATLAB数值计算与符号运算
    • 4.1 线性代数中的应用
    • 4.2 多项式运算
    • 4.3 数据分析与统计
    • 4.4 功能函数
    • 4.5 常微分方程的数值求值
    • 4.6 符号运算
    • 4.7 Matlab数值计算部分实验题
    • 4.8 Matlab符号运算部分实验题
    • 4.9 Matlab程序设计部分实验题
    • 4.10 思考题
  • 5 Simulink仿真基础
    • 5.1 Simulink概述
    • 5.2 Simulink建模与仿真
    • 5.3 子系统及其封装技术
    • 5.4 SIMULINK模块库简介
    • 5.5 Simulink仿真基础实验题
    • 5.6 Simulink仿真应用实验题
    • 5.7 思考题
  • 6 Matlab在电路分析中的应用
    • 6.1 Matlab在电路中的仿真应用
    • 6.2 数字逻辑电路仿真
    • 6.3 实验内容
    • 6.4 思考题
  • 7 MATLAB在信号与系统中的应用
    • 7.1 连续时间信号及其表示
    • 7.2 线性时不变系统
    • 7.3 线性时不变系统的时域分析
    • 7.4 线性时不变系统的频域分析
    • 7.5 实验内容
    • 7.6 思考题
  • 8 Matlab在数字信号处理中的应用
    • 8.1 信号的表示与信号的基本运算
    • 8.2 实验内容
    • 8.3 思考题
  • 9 MATLAB在通信原理中的应用
    • 9.1 脉冲编码调制仿真
    • 9.2 实验内容
Matlab程序流控制
  • 1 文档
  • 2 视频
  • 3 PPT
  • 4 小测试



2.2 Matlab程序流控制

同其他计算机语言一样,Matlab提供了通过判断来控制程序流的语句。对于任何功能程序,均可由顺序、循环和选择三种基本结构组合实现。下面分别介绍。

2.2.1if语句

if语句称为条件分支语句。

1.单分支if语句

最简单的选择结构语句,其基本格式为:

if 表达式

  语句组 

end

说明:表达式多为关系或逻辑表达式。执时该语句时,判断表达式的逻辑性,如果表达式为真(非零),就执行ifend之间的语句组;如果表达式为假(零),就跳过语句组。

2.双分支if语句

Matlab还提供了双分支if语句结构。其基本格式为:

if 表达式

     语句组1

else

   语句组2

end

说明:执时该语句时,判断表达式的逻辑性,如果表达式为真(非零),则执行语句组1;如果表达式假(为零),则执行语句组2

3.多分支if语句

当有三个或更多的选择时,可采用if语句的嵌套,也可以采用多分支if语句。其基本格式为:

if 表达式1

  语句组1

elseif 表达式2

  语句组2

  …

elseif 表达式n

  语句组n

else

  语句组n+1

end

说明:执时该语句时,首先判断表达式1,若为真,则执行语句组1,执行完后,跳出该选择结构,继续执行end 后的语句;当表达式1的值为假时,跳过语句组1,进而判断表达式2,若为真,则执行语句组2,然后继续执行end 后的语句;如果表达式2的值也为假,则跳过语句组2,继续判断表达式3,如此下去,若所有表达式都为假,则执行else后的语句组n+1,再执行end后的语句。else语句可以缺省。

[2-3]统计数组中奇数与偶数数据的个数。

enum=0;                                                  % enum用于保存偶数个数

onum=0;                                                  %onum用于保存奇数个数

znum=0;                                                  %znum用于保存零的个数

n=fix(rand(1,100)*100);

for i=1:100

    if rem(n(i),2)==0                               %除以2的余数为0是偶数

        enum=enum+1;     

    elseif rem(n(i),2)==1

        onum=onum+1;

    else

        znum=znum+1;

    end

end

2.2.2 switch语句

switch语句是多分支选择语句。switch语句的基本格式为:

switch  开关表达式

case 情况表达式

   语句组

case情况表达式2

   语句组2

 case情况表达式n

      语句组n

 otherwise

语句组n+1

end

说明:

1. 首先计算开关表达式的值,然后将该值与case后的情况表达式进行比较,如果与其中之一相等则执行情况表达式后的语句组,执行完后跳到end,执行end后续语句,不再继续比较。

2. 当开关表达式的值不等于任何一个情况表达式时,程序将执行otherwise后的语句组。

3. 开关表达式只能是标量或字符串,情况表达式可以是标量、字符串或元胞数组,如果情况表达式是元胞数组时,开关表达式与元胞数组中的所有元素比较,只要开关表达式与元胞数组某个元素相等,就执行其后的语句组。

[2-4] 编写计算学生绩点程序。

for i=1:10                                          % 产生四个元胞数组,每个元胞数组十个元素。

    a{i}=89+i;

    b{i}=79+i;

   c{i}=69+i;

   d{i}=59+i;

end;

x=rand(1,10)*100;y=round(x);            % 随机产生10位同学百分成绩

%randint(1,10,[50,99])                       % 随机产生10位同学50-99分之间成绩

for i=1:10

    switchy(i)

        case a

           mark(i)=4;

        caseb

           mark(i)=3;

        case c

            mark(i)=2;

        case d

            mark(i)=1;

       otherwise

           mark(i)=0;

    end;

end

disp(y);disp(mark);

2.2.3 while语句

while语句是条件循环语句,在条件(多为关系表达式)控制下重复执行,直到条件不成立为止。while循环的一般形式是:

while 表达式

  语句组

end

说明:先计算表达式的值,如果非零,语句组就执行一次;执行完毕再次计算表达式的值,如果仍然非零,语句组就再执行一次;如此循环,直到表达式的值为零。如果表达式的值总是非零,该循环将永远进行(即死循环),程序设计时一定要避免。

[2-5] 已知,求n大于多少时,级数和与差值小于0.01

ssum=0;                                                          %存放结果

n=1;                                                                      %记录次数

while abs(ssum-pi*pi/8)>0.01

    ssum=ssum+1./((2*n-1).^2)

       n=n+1;

end

disp(n)

[2-6] 角谷猜想,输入任意整数n,若它是偶数,则用2除,若是奇数,则乘3再加1,按此法则重复运算,最终结果是1,编写函数实现。

function c=collatz(n)

%角谷猜想

c=n;

while n>1

    ifrem(n,2)==0

        n=n/2;

    else

       n=3*n+1;

    end

    c=[cn];               

end

在命令窗口调用函数,结果如下。

>> collatz(13)

ans =

    13    40   20    10     5   16     8     4    2     1

2.2.4 for语句

for语句为指定次数的循环语句,通常情况下,循环条件是有规律变化的,通常把循环条件初值、终值和变化步长放在循环语句的开头,这种形式就是for语句的循环结构。for循环的一般形式是:

for 循环变量名=表达式1:表达式2:表达式3

  语句体

end

说明:

1. 其中表达式1的值是循环变量的初值,表达式2的值是循环步长,表达式3的值是循环变量的终值。

2. 不能通过在循环体内给循环变量重新赋值来终止for循环。

m=0;

for n=1:7

   x(n)=sin(n*pi/10);

    n=5;

   m=m+1;

end

运行结束m结果等于7,说明语句“n=5;”并不影响循环变量的值。

3. for语句被执行之前,预先为诸如输出变量等分配内存空间,可以提高程序运行效率。

x=zeros(1,10)

for n=1:10

   x(n)=sin(n*pi/10); 

end

disp(x)

4. 当有一个等效数组方法能解决给定问题,应避免用for循环。

n=1:10;

x(n)=sin(n*pi/10)

5. for循环可以接收数组。

sum=zeros(3,1);

for n=magic(3)

    sum=sum+n;

end;

6. 循环可以嵌套,任一种循环语句的循环体部分都可以包含另一个循环语句,多重循环嵌套的层数可以是任意的。处于内部的循环叫做内循环,处于外部的循环叫做外循环。在设计多重循环时,要特别注意内、外循环之间的关系,以及语句放置次序,不要搞错。

for m=1:3

    forn=1:4

       a(m,n)=m*n;

    end

end

[2-7]计算1-100中所有素数的和。

clear;close all;

sum=2;

ss=0;                                      % 标记没有被整除

l=[2];                                                       %变量l用于存放素数

for n=3:100

    for m=2:fix(sqrt(n))

        if rem(n,m)==0

            ss=1;

            break;

        else

            ss=0;

        end

    end

    if ss==1

        continue;

    else

       sum=sum+n;

       l=[l n];

    end

end

disp('素数和'),disp(sum)

disp('素数是'),disp(l)

2.2.5其他语句

1. continue语句

continue语句用于控制for循环或while循环跳过某些执行语句当出现continue语句时则跳过循环体中所有剩余的语句继续下一次循环即结束本次循环。

2. break语句

break语句用于终止for循环或while循环的执行。在循环体内遇到break语句时,则退出循环体,继续执行循环体外的下一个语句,即终止循环。在嵌套循环中,break往往存在于内层的循环中。

3. try语句

Matlab提供了try语句,这是一种试探性执行语句。语句格式为:

try

     语句组1

catch

    语句组2

end

说明:先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给lasterr变量,并转去执行语句组2。这种试探性执行语句是其他高级语言所没有的。例如执行如下命令。

try

    x

catch

    x=100

end

如果原工作空间中不存在x变量,错误提示信息将保存在lasterr中,并执行catch后语句,产生x变量,赋值为100。在提示符>>后输入lasterr,显示结果如下:

>> lasterr

ans =

未定义函数或变量 'x'

当内存中有x变量时,再执行上面的try-catch-end语句,不会产生新的lasterr,也不会改变原来x的值。

4. input语句

input是输入语句,其语句格式为:

result = input(prompt)

str = input(prompt,'s')

说明:该语句执行时,“控制权”交给键盘,待输入结束,按回车键,“控制权”交还给Matlab

prompt是提示用的字符串,第一种格式用于键入数值、字符串等数据;第二种格式不管键入什么总以字符串的形式赋给变量str。例如:

 >>x=input('please input a number:')

please input a number:

光标停留在冒号后,等待用户输入数据,回车后,数据赋给x。如果未输入任何字符,按回车键,则返回一个空矩阵。又例如:

>> x=input('please input a string:\n','s')

please input a string:

'\n'字符串代表换行,光标将出现在“please input a string:”的下一行开头,即使此时输入的是数值,x也是“char”类型。

5. disp语句

disp是输出语句,其语句格式为:

disp(变量名)

例如:

>> disp(23+454-29*15);disp(1:10)

    42

     1     2    3     4     5    6     7     8    9   10           

>>  disp('this is astring')

this is a string

6. keyboard语句

此语句停止文件的执行并将控制权交给键盘,此时命令窗口的提示符变成“K>>”,用户可以从键盘输入各种Matlab命令,仅当用户输入return语句,“控制权”才交还给程序。

7. pause语句

此语句用来暂时停止程序运行。其常用格式如下

pause

pause(n)

pause on

pause off

说明:(1pause暂时停止程序执行按任意键继续;(2pause(n)表示暂停n秒后继续执行程序;(3pause on表示允许后续的pausepause(n)语句执行,pause off表示禁止后续的pausepause(n)语句执行一般程序调试时设置pause on而程序调试成功后设置为pause off

8. return语句

return语句使所在函数结束执行,返回调用它的代码段,否则只有待整个被调用文件执行完后,才会转出。

下面应用控制结构语句再举几例。

[2-8]利用二分法编程实现求在区间[03]上的根。

a=0;

fa=-1;

b=3;

fb=1;

while b-a>eps*b         

      x=(a+b)/2;

      fx=x^3-2*x-5;

       if sign(fx)==sign(fa)

          a=x;fa=fx;

       else

          b=x;fb=fx;

       end

end

disp(x)

[2-9] 如果一个n位正整数恰好等于它的n位上数字的n次方之和,则称该数是n位自方幂数,其中,三位自方幂数又称水仙花数,四位自方幂数又称玫瑰花数。求1000以内的水仙花数。

h=0;t=0;b=0;

for n=100:999

   h=floor(n/100);

   t=floor((n-100*h)/10);

   b=n-100*h-10*t;

    ifn==h^3+t^3+b^3

       disp(n);

    end

end

从程序运行结果可知水仙花数有153370371407。同法可求玫瑰花数。

[2-10] 编写递归函数输出斐波那契数列,f(2)=1f(3)=2n>2时,

function f=dgdg(n)

if n==2

    f=1; return;

end

if n==3

    f=2; return;

end;

f=dgdg(n-1)+dgdg(n-2);

    递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口,递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,递归次数过多容易造成栈溢出,所以一般不提倡用递归算法设计程序。

[2-11] 冒泡法排序

function result=maopao(a)

n=length(a);

for i=1:n

    swap=0;

    for j=1:n-1

        if a(j)>a(j+1)

            temp=a(j);

           a(j)=a(j+1);

           a(j+1)=temp;

            swap=1;

        end

    end

    if (~swap)

        break;

    end

end

result=a;