MATLAB入门实战版

2023-11-05

写在前面

众所周知,MATLAB是理工科不可不知的利器,其功能之广、之强可谓万金油。其在科研、数模竞赛、课设等当中有着广泛的用途,甚至也有地方专门开了MATLAB的相关课程。学习MATLAB,对于非计算机专业的理工科选手而言还是很有用的。

MATLAB的学习,也并不是过于复杂的,尤其是对于有编程基础的人而言。这里,我从多个方面入手,用一些比较基础的例子,来讲解MATLAB的m语言编程和simulink仿真中的多个问题。不过这里讲的比较浅,深入的建议参考一些相关的好书,如《MATLAB从入门到精通》等等。

当然,MATLAB的学习,仅靠看是不够的,最好的方法是一边看着资料,另一边也打开MATLAB进行实际操作,毕竟MATLAB是一种工具——只有自己动手去使用才能真正学会。此外MATLAB也博大精深、易学难精,入坑以后,慢慢探索吧。

此外,由于本人水平有限,以及该资料主要针对新手,如有觉得过于简单者,请不要介意。

目录

上篇 M语言编程

PART I    基础算术

PART II    程序设计

PART III    矩阵运算

PART IV    基础画图

PART V    图像处理

PART VI    高等数学

下篇 Simulink仿真

PART I    信号仿真

PART II    纯电路仿真

PART III    综合仿真



上篇 M语言编程

PART I    基础算术

MATLAB里的算术类似于很多常见编程语言,但是语法结构较简单一些,并存在一些内置函数,这里简单举例说明。

(1)首先是简单的清理和赋值,其中赋值只需要直接“a=1”,无需类型。语句需要分号结束(这里用python的注意一下)。

图1

(2)接下来是简单的加减乘除四则运算和乘方运算,乘方处的例子涉及到“()”的使用。

图2

图3

(3)当然MATLAB里还有其他一些算术方面的内置函数,这里以绝对值(模)、余数、自然对数为例。这些仅仅是一小部分,如需更深入了解,可参考《MATLAB》从入门到精通。

图4

图5

脚本代码

clc,clear            %命令行窗口、工作界面清除功能

a=1;b=1;             %数据定义

c=a+b;               %算术加

d=a-3;               %算术减

e=c*d;               %算术乘

f=e/(-c);            %算术除

g=(c+b)^2;           %算术乘方

h=abs(e);            %绝对值

i=mod(g,c);          %取余数

j=exp(a);            %e为底数的幂

PART II    程序设计

MATLAB中,程序设计部分内容较多,也类似于我们学过的编程课中所提到的,包括定义函数、条件结构、循环结构等内容。当然,这里只涉及其中一小部分典型的方法。

(1)函数定义,只需从左上角的加号新建函数即可。用function定义函数,n为自变量,a为因变量,Fac为函数名(多个变量要用逗号隔开),这里定义一个阶乘函数。其内容为n如何得到a即可,末尾要有end(完整性)。另外我这里的辅助变量L,是一种在有些情况比较好用的一种思路,即用变量对应值对应条件的一种情况,对该思路有兴趣的可以适当了解。

图1

(2)函数内部,这里是if条件结构和for循环结构。If条件结构又可分为仅有if的结构和if&else结构,一个结构只需一个end(if和elseif/else共用一个end),以此筛选掉不适用的数,并计算0!=1。下面的for循环中,i=1:n则为i从1开始逐次加1加到n,用此逐次计算阶乘即可。

图2

(3)然后可以设置各种运行结果,这里以设置错误、警告情况为例。对之前筛选出的情况,我们直接用error生成错误结果。此外,一定条件我们也可以用warning进行警告,当然此时是可以运行的。

图3

(4)新建脚本,代入函数,a分别设为4(对应图6)、6(对应图7)、1.5(对应图8)、-3(对应图8)、0(对应图9)、1(对应图10、图11),观察结果。

图5

图6

图7

图8

图9

图10

图11

脚本代码

clc,clear

a=4;

b=Fac(a);                    %调用函数

函数代码

function [a] = Fac(n)        %函数定义

L=0;                         %可以设一个辅助变量表示一种情况

                             %此处为函数如何实现

if mod(n,1)==0               %if结构

    L=1;

    if n<0                   %if&else结构

        L=0;

    elseif n==0

        a=1;

    else

        a=L;

        for i=1:n            %for循环

            a=a*i;

        end

    end

end

if L==0

    error('输入不规范');      %出错

elseif n==1

    warning('太简单我看不起');%警告

end

end

PART III    矩阵运算

MATLAB中m语言的核心,实为通过分析矩阵解决问题。这些矩阵中,向量(一行或一列的矩阵)既基础又重要。这里则简要地讲讲向量和其他矩阵的定义和运算。

(1)向量定义中,先讲行向量,有三种典型的定义方法,如图所示即可,a1为最基本的列举法。当然,后两者a2、a3向量的定义仅限于向量的元素为等差数列的情况,但这也是很常用的情况,在后续的画图中有重要作用。b为列向量,“;”用于将行隔开。

图1

图2

图3

(2)向量的运算,首先是基本的——向量可与常数进行四则运算,以加法为例得c1。元素个数相同的行、列向量可以直接相乘,如c2,结果为《线性代数》中矩阵乘法的结果。然后c3为矩阵元素的使用案例,直接a1[i]这种格式即可,如果要元素替换也是类似的这种方法。当然这个c3案例实为m语言中“点乘”定义的代码形式,即两个向量/矩阵每个对应元素相乘所得向量/矩阵,当然在实际工程中只需用c4的“.*”即可,类似的还有“./”(右除)、“.\”(左除)、“.^”(点乘方)等。最后提一下,求转置只需“d=b’”即可。

图4

图5

图6

图7

(3)其他非向量矩阵的定义,简单的可以像A这样列举,或者像B这样(“[]”内的“[]”不算错误)。当然,也可以列举已有的向量来定义矩阵。

图8

图9

(4)矩阵的运算(线性代数运算)在MATLAB中有很多内置函数,这里举了六个简单的实例。当然这只是冰山一角,还有很多感兴趣可以深入了解。

图10 

图11

图12

图13

图14

脚本代码1

clc,clear

a1=[1 3 6 7];               %列举法

a2=1:2:7;                   %等差数列(首项、公差、末项)

a3=linspace(1,7,4);         %等差数列(首项、末项、个数)

b=[5;6;2;3];                %列向量的定义(行由分号隔开)

c1=a1+6;                    %向量/矩阵与常数的四则运算

c2=a1*b;                    %向量/矩阵乘法

for i=1:4

    c3(i)=a1(i)*a2(i);      %向量/矩阵元素的引用

end

c4=a1.*a2;                  %向量/矩阵点乘

d=b';                       %转置

脚本代码2

clc,clear

A=[1 0 0;0 2 0;0 0 3];

B=[[1 0 3];[0 2 1];[1 6 1]];

aa1=det(A);          %行列式

aa2=trace(A);        %迹

aa3=rank(A);         %秩

bb1=inv(B);          %逆矩阵

bb2=eig(B);          %特征值

bb3=orth(B);         %正交化

PART IV    基础画图

MATLAB的画图功能,因其常用性是一个重点。画图有很多种,有二维或三维,具体有线条图形、统计图形、矢量图形、曲面等等。此外,MATLAB画的图,也有各种各样的标注功能。以下,将以多个不同的例子具体介绍。

(1)首先定义一个自变量矩阵,这里的自变量为控制角——a;再来一个因变量,为功率因数——pf。有了这之后,直接plot(自变量,因变量,其他)即可画图(单因变量),其他可以注明颜色、形状。当然,“其他”部分的常见情况在三表中列出,同时表示颜色和形状可用‘.c’等格式。

图1

图2

表1

颜色

绿

表示

r

y

g

c

b

m

k

w

表2

线型

实线

虚线

点线

点画线

表示

-

--

-.

表3

点型

加号

圆圈

星号

实点

菱形

正方形

表示

+

O

*

.

x

d

s

点型

五角星

六角星

向上三角

向下三角

向左三角

向右三角

表示

p

H

^

v

>

<

(2)此时由单因变量到多因变量,只需plot(自变量1,因变量1,其他1,自变量2,因变量2,其他2)即可,这里的因变量2为电压比值——vv。

图3

图4

(3)完成之后可以简单给图加上标注,标题为title(‘标题内容’),坐标为xlabel(‘横坐标内容’)、ylabel(‘纵坐标内容’),多变量时用legend(‘变量1’,‘变量2’)区分变量即可。

图5

图6

(4)以上为二维折/曲线图现在延伸到三维折/曲线图,只需定义三个向量a1、a2、a3,再使用plot3函数即可,和plot基本类似,为plot3(x,y,z,其他)。当然,如需多线条、标注操作,则类似于(2)(3)的操作在三维方面适当调整即可。

图7

图8

(5)接下来的内容为多图和特殊图形,多图的函数为subplot(行数,列数,第几个),特殊图形中有饼状图、柱状图、矢量图等,各有其对应的函数,如图中所示,直接使用即可。

图9

  

图10

(6)给图加标注的补充内容。坐标限制,用axis([xmin xmax ymin ymax])即可;文字标注,用text(x坐标,y坐标,‘文字内容’)即可。

图11

图12

(7)三维曲面图,以山峰为例,先用meshgrid(min:分度:max)定义一个曲面网格,再定义曲面函数(二元),最后使用surf函数画图即可。

图13

图14

(8)可以再加上灯光,用light函数,里面可以多种设定,如(‘position’,位置坐标)确定灯光方向、(‘color’,颜色)确定灯光颜色等等。

图15

图16

脚本代码1

clc,clear

a=[0 30 60 90 120 150 180];              %控制角数据

pf=[1 0.971 0.898 0.707 0.427 0.17 0];   %功率因数

%plot(a,pf,'r');                          %画图(单线)

vv=(2^0.5)*(1+cos(a*pi/180))/pi;         %电压比值

plot(a,pf,'r',a,vv,'g');                 %画图(多线)

title('单相全波整流分析');                %标题

xlabel('控制角');ylabel('数值');          %坐标

legend('功率因数','电压比值');            %图例

脚本代码2

clc,clear

a=[220 330 500 750 1000 2000];      %x坐标

b=[400 303 278 256 250 250];        %y坐标

c=[121 360 900 2200 4000 16000];    %z坐标

plot3(a,b,c,'b:p');                 %三维plot函数

脚本代码3

clc,clear

EM=[107.98 1.8 5];

subplot(2,3,1);                                %多图函数(行数,列数,第几个)

pie(EM);                                       %饼状图

legend('电磁功率','定子铜耗','铁耗');

subplot(2,3,2);

bar(EM);                                       %柱状图

axis([0 4 0 150]);                             %坐标限制

text(0,127.98,'电磁功率');                      %文字标注

text(1,21.8,'定子铜耗');

text(2.5,55,'铁耗');

subplot(2,3,3);

bar3(EM);                                       %三维柱状图

ES=[7.825 122.015 6.493;4.579 113.189 6.023]';

subplot(2,3,4);

bar(ES);                                        %多变量柱状图(横)

subplot(2,3,5);

bar(ES','stack');                               %多变量柱状图(竖)

x=linspace(0,2*pi,10);

y=sin(x);

subplot(2,3,6);

feather(x,y);                                   %羽毛图(矢量)

脚本代码4

clc,clear

[x,y]=meshgrid(-4:0.1:4);                %网格定义

z=peaks(x,y);                            %曲面函数

surf(x,y,z);                             %画曲面图

light('position',[-1,-1,1],'color','g'); %调节灯光

PART V    图像处理

除了画图,MATLAB也有进行图像处理的能力。对于已有的图像文件,MATLAB可以进行读图、显示、转换成灰度图、拼接、读取图片信息等操作。当然,这些操作与之前不同的是,这回需要现有的图片文件。

(1)这一部分从读图开始,MATLAB可识别的图像文件格式有bmp、jpg、png、pgm等多种格式。先准备一个名为‘eastlake1’的文件,在代码中用‘文件名.文件格式’表示图像文件。用imread(文件)函数读取文件成为矩阵形式,imwrite(矩阵,文件)生成新文件,这一功能可用于改变文件格式等等。

图1

图2

图3 

(2)当然图片也可以用于显示于MATLAB的plot结果中(当然不是用plot函数)。用image(矩阵)函数将图片置于坐标系,如不需要坐标系则用imshow(矩阵)。另外,用如果rgb2gray(矩阵)可生成灰度图(黑白灰)。此外,对于矩阵结构相同的图片,可以用矩阵拼接的方法拼图。

图4

图5

(3)当然,用imfinfo(文件)可以读取文件信息。

图6

图7

图8

图9

脚本代码

clc,clear

a=imread('eastlake1.jpg');    %读取图片文件(矩阵)

imwrite(a,'dusk.png');        %按指定格式生成新的图片文件

subplot(2,2,1);

image(a);                     %将矩阵以图像形式显示于坐标系

subplot(2,2,2);

imshow(a);                    %显示图片

b=rgb2gray(a);                %生成灰度图

subplot(2,2,3);

imshow(b);

a1=imread('eastlake2.jpg');

a2=imread('eastlake3.jpg');

a3=imread('eastlake4.jpg');

a4=imread('eastlake5.jpg');

A=[a1 a2;a3 a4];              %图片拼接

subplot(2,2,4);

imshow(A);

aa=imfinfo('eastlake1.jpg');  %读取图片信息

bb=imfinfo('dusk.png');

PART VI    高等数学

作为一个强大的数学软件,MATLAB自然可以解决很多高等数学中的问题,如极限、求导、积分等。这一应用,也是MATLAB的一个重点,在工程计算和数学建模中较为常见。这里我们举了一些典型的极限、导数、积分、微分方程、级数问题。当然这块内容博大精深,其涉及面之广之深并非可以一时讲清的,建议感兴趣的可以更深入了解。

(1)首先定义一个函数变量x,这种定义需要在前面加上“syms”,有了这之后可以按y=f(x)格式直接定义函数,如这里的f1、f2、f3,或是f4=f(x,x0)。对于求极限,可以用limit(f(x),x,x所趋于的值)求极限。如果用limit(f(x),x,x所趋于的值,‘left’)或limit(f(x),x,x所趋于的值,‘right’)则可求左、右极限。对于求导,可以用diff(f(x),x)直接求一阶导或用diff(f(x),x,n)求n阶导,求偏导亦然。此外,MATLAB中的一些基本数学符号如表中所示。

图1

图2

图3

表1

数学概念

正无穷

负无穷

无意义

表示

Inf

- Inf

NaN

(2)当然,MATLAB也可以输入指定函数求各种积分,对于一元积分主要用int函数。定积分和反常积分,直接int(被积函数,下限,上限)即可。要求不定积分时,可以int(被积函数)或int(被积函数,积分变量),后者可用于多元函数。若需要求简单的二重积分,可以按标准格式先定义一个函数名柄,再将其代入integral2(被积函数,x下限,x上限,y下限,y上限)。

图4

图5

图6

图7

(3)微分方程是解决很多数学建模问题的重中之重,MATLAB也是解微分方程的利器。其中,这里以最常见的常微分方程为例介绍。首先定义自变量x和待解函数y(x),对于微分方程f(y(x))=0,列方程的代码格式为:方程名= f(y(x))==0。求解常微分方程的函数为dsolve,求通解只需y1=dsolve(方程名,‘自变量’)即可。若要根据初始得出特解,则需要用y2=dsolve(方程名,‘初始条件’,‘自变量’)。

图8

图9

(4)高等数学还有一个很重要的内容——级数。对于数列前n项和以及无穷级数求和,用函数symsum(通项,自变量(n),1,末项)即可。级数的展开,分为泰勒展开和傅里叶展开。泰勒展开用taylor函数,有多种用法:taylor(f(x))在x=0处展开成六阶,taylor(f(x),‘order’,n)在x=0处展开成n阶,taylor(f(x),x,a,‘order’,n)在x=a处展开成n阶。傅里叶展开我们定义一个Fou函数(这里以区间[0,2π]为例),代入f(x)求出定义即得。

图10

图11

图12

图13

图14

(5)再来讲一讲一个大重点积分变换。傅里叶变换F[f(x)]=F(w)用fourier(f(x))函数求,其逆变换则用函数fourier(F(w))即可;拉普拉斯变换L[f(t)]=F(s)用fourier(f(t))函数求,其逆变换则用函数fourier(F(s))即可。

图15

图16

脚本代码1

clc,clear

syms x x0;                 %自变量x的定义

f1=sin(x)/x;               %函数定义

L1=limit(f1,x,0);          %求极限

f2=abs(x)/x;

L2=limit(f2,x,0);

L3=limit(f2,x,0,'left');   %求左极限

L4=limit(f2,x,0,'right');  %求右极限

f3=x^2;

f4=x*x0;

D1=diff(f3,x);             %求导

D2=diff(f3,x,2);           %高阶求导

D3=diff(f4,x);             %求偏导

L=[L1 L2 L3 L4];

D=[D1 D2 D3];

脚本代码2

clc,clear

syms x y;

f1=4*x;

f2=x^(-2);

I1=int(f1,0,2);              %求定积分

I2=int(f2,2,inf);            %求反常积分

I=[I1 I2];

II1=int(f1);                 %求不定积分

II2=int(f2*y,x);             %对x求不定积分

II=[II1 II2];

f3=@(x,y)(x+y);              %定义函数名柄(求二重积分用)

Is=integral2(f3,0,1,0,1);    %求二重积分

脚本代码3

clc,clear

syms x y(x);                 %定义x和y(x)

eq=diff(y,x)-2*x==0;         %常微分方程

y1=dsolve(eq,'x');           %求通解

y2=dsolve(eq,'y(0)=0','x');  %代条件求特解

脚本代码4

clc,clear

syms n x;

a1=1/n;                       %数列/级数定义

a2=a1/(n+1);

s1=symsum(a1,n,1,3);          %数列求前n项和

s2=symsum(a1,n,1,inf);        %无穷级数求和

s3=symsum(a2,n,1,inf);

s=[s1 s2 s3];

g=exp(x);

t1=taylor(g);                 %x=0处泰勒展开

t2=taylor(g,'order',3);       %x=0处控制阶数泰勒展开

t3=taylor(g,x,2,'order',3);   %x≠0处控制阶数泰勒展开

h=x^2;

[a0,an,bn]=Fou(h);            %展开成傅里叶级数

脚本代码5

clc,clear

syms x w t s;

fx1=exp(-x^2);

Fw1=fourier(fx1);   %求傅里叶变换

Fw2=exp(-w^2/4);

fx2=ifourier(Fw2);  %求傅里叶逆变换

lt1=exp(-2*t);

Ls1=laplace(lt1);   %求拉普拉斯变换

Ls2=(s+1)/(s^2+1);

lt2=ilaplace(Ls2);  %求拉普拉斯逆变换

展开成傅里叶级数函数代码f

unction [a0,an,bn] = Fou(fff)

%在[0,2*pi]展开成傅里叶级数

syms x n;

a0=int(fff,0,2*pi)/pi;

an=int(fff*cos(n*x),0,2*pi)/pi;

bn=int(fff*sin(n*x),0,2*pi)/pi;

end

下篇 Simulink仿真

PART I    信号仿真

SIMULINK里的功能为仿真,其基础为信号仿真,需要足够的实践来理解。这里举一个简单的负反馈自动控制系统数学模型仿真全过程的例子,以简要说明其仿真的大致步骤和常用功能。

(1)首先要点击library browser(左上角)以打开元件库,里面有各路仿真元件。将第一个simulink栏展开,此处为信号仿真相关元件。

图1

(2)最先放置的为信号源,只需从source栏里挑选即可,如这里所挑选的是单位阶跃信号源。选定后,移至放置区域即可。

图2

(3)接下来放置一些简单的信号处理元件,这里是以continuous里的元件为例,放置两个连续时间信号处理元件。

图3

(4)再者从sinks里找出scope即示波器,可以(但不仅限于)用于检测输出信号,一样的放置。放置好后,直接简单用鼠标连接即可,可得到一个用于开环控制的简单的信号处理系统,其传递函数为G1(s)=1/(s(s+1))。

图4

图5

(5)点击绿色run按钮仿真即可,当然刚打开时第一次仿真则需要等待较长时间(尤其如果仿真模型较为复杂的情况)。如果运行成功,则可以直接双击示波器打开以观察波形,其开环传递函数的单位阶跃响应如图所示。

图6

(6)根据《自动控制原理》,为使输出稳定,可以加上负反馈信号。只需打开库中的数学计算元件栏,选择求和元件即可,按图示方式连接起来。当然,这个时候的系统只能算是正反馈控制系统,还尚不能达到输出稳定的效果。

图7

图8

(7)对此,通过调节元件本身性质的方法便可以将正反馈变为负反馈。双击求和元件,将“++”改为“+-”,即得到负反馈效果。此时再运行,得到的信号则为负反馈控制系统的输出信号。(其他各路元件的调整也是双击即可)

图9

图10

(8)输出信号虽然正确,却不完美,看得出明显的线段,这和采样频率较低是有关的。此时在空白处右键然后点图示按钮,弹出全局设置界面后,于solver处即可调整。其最上面为运行时间,可自行根据需要设置。而我们现在需要的,是把selection改为fixed-step,在details中调整采样时间即可,最终调整后运行结果如图所示,此时图像可谓完美。

图11

图12

图13

图14

PART II    纯电路仿真

SIMULINK也有电路仿真的功能,可以与multisim、psim等其他电路仿真软件进行对比。个人认为,SIMULINK有着较好的电路与信号结合能力以及结合m语言编程的能力,当然这一切的基础除了m语言和信号仿真外,还有纯电路仿真。Simulink有很多电路元件库,本人比较建议按本节步骤使用,随意选择比较容易碰到“黑蓝互斥”这样的情况,这是一个比较麻烦又容易出现的问题。

(1)首先我们先设计一个如图所示的电路作为此次仿真的例子(图为用multisim所作)。这里的Us可以为直流和交流电源(考虑图片数量只放一个交流电源的图),给L、C并联再串上一个R的电路,数值如图所示。分别在直流、交流谐振、交流非谐振的情况下测量L上的电流和L、C并联支路上的电压。

  

图1

(2)打开元件库,从simscape-electrical-specialized power systems中选取各种电路元件。最先放置的为powergui,放置好后可双击,调成“discrete”(离散)模式(常用),如有需要也可以调整采样时间。

  

图2

图3

图4

(3)其次为电源,只需从electrical source栏里挑选即可,这里有直流、交流等多种电源。我们先选一个直流电源,然后只需双击设置其电压值即可,这里为4V。

图5

图6

图7

(4)接下来放置一些简单的电路元件——电阻、电容电感,我们直接去elements中取RLC元件来用即可。置于相应位置后,双击打开,根据需要,可设置元件为R、L、C、RL等多种,这里分别为R、L、C,并标上对应的值即可。设置好后,直接连接,便得到了我们需要的电路的拓扑结构。

图8

图9

图10

图11

(5)该设置测量部分了,从measurements中取电压、电流测量工具置于相应位置并合理连接即可。其输出端,应当连于示波器scope上。

图12

图13

(6)仿真,稳定后打开示波器,此时电压、电流波形如图所示。

图14

(7)我们将直流电源换成交流电压源,调整参数(此时为谐振频率),再次运行,可观察如图所示谐振时的电压、电流波形。

  

图15

 

图16

图17

图18

(8)我们还可以调整频率至非谐振状态,再度观察其波形。

  

图19

图20

PART III    综合仿真

在实际工程中,根据具体情况,SIMULINK的仿真经常要将信号、电路、m语言综合起来。这种综合,既是SIMULINK的一个重要优势,又是SIMULINK学习的一大难点。在本人看来,学习了如何将这些综合起来仿真,才算是学到了MATLAB的精髓。

(1)此次仿真的例子以一个开环Buck电路(图为用multisim所作)为基础展开,电路的拓扑结构和参数如图所示。该电路的基本原理为:设电源电压为U,通过占空比为D的PWM波来控制开关S的开合,并结合二极管的续流作用和LC滤波器的滤波作用,使负载R上生成Uo=DU的输出直流电压,实现直流降压功能。该例我们取负载R上的电压、电流为基本测量量。

图1

图2

(2)打开元件库,从simscape-electrical-specialized power systems中选取各种电路元件来放置Buck电路的拓扑结构,按以上要求设置元件参数。注意开关管和二极管在power electronics中,常用的开关管可以用mosfet或igbt,这里我们选用mosfet。

图3

图4

(3)从信号源库中选取方波源给开关管提供PWM,这里将周期调成1/20000s,即频率20kHz。占空比调成50%。

图5

图6

图7

(4)可以设置基本测量部分了,老样子取电压、电流测量工具置于相应位置并合理连接即可,其输出端仍连于示波器scope上。运行,观察波形。考虑到这个例子到后面仿真结构较大,上面的stop time可以从默认的10s调到0.1s(毕竟Buck电路到稳态的时间是很短的)。

图8

图9

(5)增加测功率部分。取simulink-math operations库中的信号相乘元件,将电压信号和电流信号相乘起来,接至示波器,此时得到负载瞬时功率信号。再仿真,稳定后打开示波器,此时电压、电流、功率波形如图所示。

图10

图11

图12

(6)现实中,Buck电路少不了保护措施。对此,我们还可以设置简单的过电压、过电流、过热(功率)保护措施。而保护在瞬时(超调)和稳态中也有不同的要求。先设置瞬时保护,假定瞬时保护临界值分别为60V、2A、120W。我们的方法为:将所测量是否超标转化为易观测的信号,如不超标为零超标则不然,当然这里的三个信号必须区分开来。从simulink-defined functions中选取MATLAB函数放置,双击进入m语言编程,输入为u、i、p,输出为y1、y2、y3。此后,将u、i、p连至电压、电流、功率信号,将y1、y2、y3连于新的示波器。仿真,观察y1、y2、y3信号,正常时为零。此时皆为零,说明安全。

图13

图14

图15

图16

图17

(7)可以把输入电压调至80V再观察该函数的输出值,有一小段时间y1、y2、y3不为零,这便是瞬时保护函数在异常时发出的相应信号。

图18

(8)我们还可以加一个稳态保护,假定稳态保护临界值分别为40V、1.2A、50W。先把输入电压U调回60V,再重复刚才的步骤,建立另一个MATLAB函数。为了确保在稳态之后再开始测u、i、p,我在这设了个单位延时阶跃信号源,设置其阶跃时间为0.01s(根据前面的u、i、p的图像可得0.01s后已达稳态),作为除u、i、p外的另一个该函数的输入,并于代码中增加“*k”。此时再运行,观察稳态保护函数对应的示波器上的波形。此时皆为零,说明安全。

图19

图20

图21

图22

图23

(9)调节输入电压分别为90V,观察该示波器波形。当0.01s后z1、z2、z3持续不为零时,这便是稳态保护函数在对应测量值异常时发出的相应信号。

图24

瞬时保护函数代码

function [y1,y2,y3] = fcn(u,i,p)

y1=0;y2=0;y3=0;

if u>60

    y1=1;

end

if i>2

    y2=2;

end

if p>120

    y3=3;

end

稳态保护函数代码

function [z1,z2,z3] = fcn(u,i,p,k)

z1=0;z2=0;z3=0;

if u*k>40

    z1=1;

end

if i*k>1.2

    z2=2;

end

if p*k>50

    z3=3;

end

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB入门实战版 的相关文章

  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 如何使用matlab生成不同频率的正弦波?

    对于我的项目 我需要使用 matlab 生成一个正弦波 它有 100 000 个样本 并且频率在每 10 000 个样本后随机变化 采样率和频率可以根据方便而定 matlab中有没有函数可以生成这个 好的另一个例子 生成 5 个随机频率 r
  • 在另一列中添加具有特定条件的一列,如 excel 的 sumif

    我有一个像这样的矩阵 A 1 2 2 3 3 4 4 5 5 6 6 8 7 9 8 5 9 4 现在我想添加第二列 条件是如果 limit 0 interval 3 且 limit limit interval 或者换句话说 当第 1 列
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • Simulink 仿真引擎如何工作?

    我想了解 Simulink 仿真引擎的工作原理 它是否使用离散事件模拟机制 那么如何处理连续时间 它是否依赖于基于静态循环的代码生成 或者 在第一个周期之前 它会计算出块的执行顺序 从不需要任何其他块输入的块开始 每个周期 它都会根据输入和
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • “Desort”向量(撤消排序)

    在Matlab中 sort返回排序后的向量和索引向量 显示哪个向量元素已移动到以下位置 v ix sort u Here v是一个包含所有元素的向量u 但已排序 ix是一个向量 显示每个元素的原始位置v in u 使用 Matlab 的语法
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof

随机推荐