范例
当前位置:首页 > 其他范文 > 范例 > 列表页

matlab范例

小草范文网  发布于:2017-05-11  分类: 范例 手机版

篇一:MATLAB经典实例

MATLAB

一、用MATLAB求解线性微分方程和化简系统方框图

1、MATLAB中数学模型的表示

传递函数:

P = [1 0 2 4] ;

>>A = [1 , 3] ;

>>B = [10 , 20 , 3] ;

>>C = conv(A , B)/* C = (A * B)*/

C =10 50 63 9

W(s) = 4(s+2)(s+3)(s+4)

>>W = 4 * conv([1 , 2] , conv([1 , 3],[1 , 4]))

W = 4 36104 96

Sys = tf(num , den)

>>num = [1 , 2 , 3 ,4];

>> den = [1 , 0 , 1];

>> W = tf(num , den)

Transfer function:

s^3 + 2 s^2 + 3 s + 4

---------------------

s^2 + 1

传递函数的特征根:

roots(P)

>>p = [1 3 0 4] ;

>>r = roots(p)

>>r =

-3.3553

0.1777 + 1.0773i

0.1777 - 1.0773i

>> poly(r)

>>ans =

1.0000 3.0000 0.0000

polyval(p,a)

>> n = conv([3 2 1],[1 4]);

>> value = polyval(n , -5)

>>value = -66

4.0000

线性系统的零极点模型:

>>z = [-1 -2 -3] ;

>>p = [-2 -5] ;

>>W = zpk(z , p , k)

Zero/pole/gain:

k(s+1) (s+2) (s+3)

-------------------

(s+2) (s+5)

2、用MATLAB求解线性微分方程

[r , p , k] = residue(num , den)

>>num = [2 1 6 10 24];

>> den = [1 10 35 50 24];

>> [r , p , k] = residue(num , den)

r =

-88.0000

91.5000

-26.0000

3.5000

p =

-4.0000

-3.0000

-2.0000

-1.0000

k =

2

>>num = 1 ;

>> den = [conv(conv([1 -1],[1 4]),[2 -3 1])];

>> [r , p , k] = residue(num , [den 0 ]) (R(s)= 1/s) r =

0.0011

-0.6400

0.2000

0.8889

-0.2500

p =

-4.0000

1.0000

1.0000

0.5000

k =

[]

>> num = 1 ;

>>den = [conv(conv([1 -1],[1 4]),[2 -3 1])];

>>[r , p , k] = residue(num , [den 0 0])(R(s)= 1/s^2)

r =

-0.0003

-0.8400

0.2000

1.7778

-0.9375

-0.2500

p =

-4.0000

1.0000

1.0000

0.5000

k =

[]

3、MATLAB在系统方框图化简中的应用

串联连接结构:

[num , den] = series(num1,den1,num2,den2) [

并联连接结构:

[num , den] =parallel (num1,den1,num2,den2)

反馈连接结构:

[num , den] =feedback (num1,den1,num2,den2,sign)

num1 = [1 1] ;

>> den1 = [1 2] ;

>> num2 = [1] ;

>> den2 = [1 0];

>> [num , den] =feedback (num1,den1,num2,den2,-1) num =

1 1 0

den =

1 3 1

>> printsys(num , den)

num/den =

s^2 + s

-------------

s^2 + 3 s + 1

二、用MATLAB进行系统时域分析

1、典型输入信号的MATLAB实现

单位脉冲响应:

[y , x , t] =impulse(num , den , t) 或 impulse(num , den) >>t = [0 : 0.1 : 10] ;

>> num = [ 1 ];

>> den = [1 1 1] ;

>> [y , x , t] =impulse(num , den , t) ;

>> plot(t , y) ;

>> grid ;(%绘制网格)

>> xlabel('t') ;

>> ylabel('y') ;

>> title('单位脉冲响应')

单位阶跃响应:

[y , x , t] =step (num , den , t) 或step(num , den) >>t = [0 : 0.1 : 10] ;

>> num = [ 1 ];

>> den = [1 0.5 1] ;

>> [y , x , t] =step(num , den , t) ;

>> plot(t , y) ;

>> grid ;(%绘制网格)

>> xlabel('t') ;

>> ylabel('y') ;

>> title('单位阶跃响应

')

篇二:matlab应用实例

大学课程考查报告

课程名称学 院年 级专 业学 年学 期姓 名学 号QQ 数 学 实 验理 学 院2009级 数学与应用数学2011至2012学年 第 二 学 期 不帅你报警000000000000404986421(吴亭廷)

2012年6月28日

数学实验考核题目

1、任意输入一个n(n?4)阶方阵A,并求方阵A的行列式、秩、逆、特征值及相应的特征向量;解:任取4阶方阵A如下

?2,5,6,4??1,5,3,8?

? A??

?2,4,7,3????2,4,3,9?

第一步:在matlab命令窗口输入a=[2 5 6 41 5 3 82 4 7 32 4 3 9] 第二步:回车得 a =

2 5 6 4

1 5 3 82 4 7 32 4 3 9 第三步:输入det(a) %求矩阵a得行列式得值, 回车得: ans =

58

然后按照以上步骤可以求出:rank(a)%求矩阵a得秩, ans =

4 inv(a)%求矩阵a得逆, ans =

1.2069-1.0690-0.8793 0.7069 0.7931 0.0690-0.6207-0.2069 -0.6207 0.2069 0.6379-0.1207 -0.4138 0.1379 0.2586 0.0862 [V,D]=eig(a)%求矩阵a的特征值和特征向量, V =

-0.4916-0.2770 + 0.5374i -0.2770 - 0.5374i -0.4193 -0.5087-0.6420-0.6420 0.4251 -0.4571 0.3863 - 0.0976i0.3863 + 0.0976i -0.7406 -0.5391 0.2400 - 0.0769i0.2400 + 0.0769i0.3082 D =

17.1409000 0 0.6357 + 0.5775i 00 00 0.6357 - 0.5775i 0 000 4.5878

由以上步骤可知,方阵A的行列式的值为58、秩为4、A?1等于矩阵a、特征值为

?1?17.1409,?2?0.6357,?3?0.6357,?4?4.5878.

相应的特征向量为?1?(?0.4916,?0.5087,?0.4571,?0.5391),

?2?(?0.2770,?0.6420,0.3863,0.2400),

?3?(?0.2770,?0.6420,0.3863,0.2400), ?4?(?0.4193,0.4251,?0.7406,0.3082).

2、将屏幕作灵活分割,先分割为左右两大块,再将右边那块分割成上下两块,最后将右下块分割成左右两小块,在每块分别画上四个任意不同函数的图形,并标注坐标、函数等标签;

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

a=cos(x);b=sin(x);c=sin(x).*cos(x);d=1./(x.^2+1); subplot(1,2,1);%选择1×2个区中的1号区 plot(x,a)

title('cos(x)')

subplot(2,2,2);%选择2×2个区中的2号区 plot(x,b)

title('sin(x)')

subplot(2,4,7);%选择2×4个区中的7号区 plot(x,c)

title('sin(x)cos(x)')

subplot(2,4,8);%选择2×4个区中的8区 plot(x,d)

title('1/(x^2+1)')

运行得到:

3、分别用Matlab和Lingo解线性规划

max z?3x

1

?x2?3x3

??x1?2x2?x3?4,?4x2?3x3?2,

s.t. ? ?

? x1?3x2?2x3?3,??x1 , x2 , x3?0.

用Matlab解线性规划

c=[-3 -1 -3];% 为目标函数系数 A=[-1 2 1;0 4 -3;1 -3 2]; %为

b=[4 2 3]; Aeq=[]; beq=[]; vlb=[0;0;0]; vub=[];

[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)

运行后输出结果 x =

5.3333 3.0000 3.3333

fval =

-29.0000 用lingo求解:

目标函数max=3*x1+x2+3*x3;-x1+2*x2+x3<=4;4*x2-3*x3<=2; x1-3*x2+2*x3<=3; x1>=0; x2>=0; x3>=0; end

运行得到:

Global optimal solution found.

Objective value:29.00000 Total s(本文来自:WwW.xiaOCaofAnweN.Com 小草范文 网:matlab范例)olver iterations: 3

Variable Value Reduced CostX1 5.3333330.000000X2 3.0000000.000000X3 3.3333330.000000

Row Slack or SurplusDual Price 1 29.000001.000000 2 0.0000002.000000 3 0.0000003.000000 4 0.0000005.000000 5 5.3333330.000000 6 3.0000000.000000 7 3.3333330.000000

4、求f?X??x

21

22

?4x2?9x3?2x1?18x2的极值点;

解:首先设f?X?的极小值为minf(x),极大值为maxf(x)。 然后先求minf(x),建立M文件如下: function f=fun(x)

f=x(1)^2+4*x(2)^2+9*x(3)^2-2*x(1)+18*x(2) 再建立M文件: x0=[-1,0,1];

篇三:matlab程序设计实例

MATLAB 程序设计方法及若干程序实例

樊双喜 (河南大学数学与

信息科学学院 开封 475004)

摘 要 本文通过对 MATLAB 程序设计中的若干典型问题做简要的分析和总结,并 在此基础上着重讨论了有关算法设计、程序的调试与测试、算法与程序的优化以 及循环控制等方面的问题.还通过对一些程序实例做具体解析,来方便读者进行 编程训练并掌握一些有关 MATLAB 程序设计方面的基本概念、基本方法以及某些 问题的处理技巧等.此外,在文章的最后还给出了几个常用数学方法的算法程序, 供读者参考使用.希望能对初学者进行 MATLAB 编程训练提供一些可供参考的材 料,并起到一定的指导和激励作用,进而为 MATLAB 编程入门打下好的基础. 关键字

算法设计;程序调试与测试;程序优化;循环控制

1 算法与程序

1.1 算法与程序的关系 算法被称为程序的灵魂,因此在介绍程序之前应先了解什么是算法.所谓算

法就是对特定问题求解步骤的一种描述.对于一个较复杂的计算或是数据处理的 问题,通常是先设计出在理论上可行的算法,即程序的操作步骤,然后再按照算法 逐步翻译成相应的程序语言,即计算机可识别的语言.

所谓程序设计,就是使用在计算机上可执行的程序代码来有效的描述用于 解决特定问题算法的过程.简单来说,程序就是指令的集合.结构化程序设计由于 采用了模块分化与功能分解,自顶向下,即分而治之的方法,因而可将一个较复杂 的问题分解为若干子问题,逐步求精.算法是操作的过程,而程序结构和程序流程 则是算法的具体体现.

1.2 MATLAB 语言的特点

MATLAB 语言简洁紧凑,使用方便灵活,库函数极其丰富,其语法规则与科技 人员的思维和书写习惯相近,便于操作.MATLAB 程序书写形式自由,利用其丰富

的库函数避开繁杂的子程序编程任务,压缩了很多不必要的编程工作.另外,它的 语法限制不严格,程序设计自由度大.其最大的特点是以矩阵运算为最强,而数值 的矩阵化又为运算和处理提供了方便.除此之外,MATLAB 还有着非常强大的绘图 功能.

1.3 MATLAB 程序设计练习

MATLAB 有着丰富的库函数,一般情况下应了解并学会使用一些常用的库函 数,至少应熟悉函数库中都有哪些常用函数,当需要时可以现学现用.或者能对一 些经典函数做一定的改造,以达到解决某一特定问题的目的.但,在大多情况下还 需要自己编写程序去处理形形色色的问题.下面就先从一些较简单的程序入手来 熟悉 MATLAB 的编程方式.

例1 一个分类统计函数的设计(分类统计_1) 编写一个函数,统计出一组有序(按升序或降序排列)数字中每种数字的个

数,并返回数字种类数.

分析:设待统计数组为 x,因为 x 有序,所以在设计算法时应抓住这个特点. 若用 s1 记录已统计出的数字,则,在对 x 中的数字进行遍历时,每次只需让 x(i) 与 s1 中的最后一个数字进行比较就可以了,若相等,则对应计数器加 1,若不等, 则说明测到新数,应开辟新的存储单元.其算法程序如下:

function [s,k]=FLTJ_1(x)

%x 为待统计的一组有序数,返回值s为2 列的数组, 第一列为不同种类的数字

%第二列为对应数字的个数, k 记录统计出的数字种类数目

n=length(x);

s1=x(1); % s1 记录测到的新数字,给其赋初值为 x 的第一个数字

s2=1; % s2 记录 s1 中每个数字的个数,赋初值为 x(1)的初始个数 1 k=1;% k 记录已统计出的数字种类数,初值赋为 1

for i=2:n % 从第 2 项开始遍历数组 x

if x(i)==s1(k) % 如果 x(i)与已测出的最后 1 个数字相同,

s2(k)=s2(k)+1; % 则对应的计数器加 1

else % 否则,则说明测到新数字

end

k=k+1; % k 值加 1 s1=[s1;x(i)]; % 将此新数并入 s1, s2=[s2;1]; end %对应的计数器为 1

s=[s1,s2]; % 将 s1 与 s2 拼接成一个两列的数组 s

程序运行如下(“ ??”代表回车,下同.)

>> x=[1,2,2,3,3,4,5,5]; ??

>> [s,k]=FLTJ_1(x) ??

s =

1

2

3

4

5

k =

5 1 2 2 1 2

例2 一个数字游戏的设计

有这样一个数字游戏:在一个 20 ??10 的矩阵中,0~99 这 100 个数顺序排列

在奇数列中(每 20 个数组成一列),另有 100 个图案排列在偶数列中,这样每个 数字右边就对应一个图案.你任意想一个两位数 a,再让 a 减去它的个位数字与十 位数字之和得到一个数 b,然后,在上述矩阵的奇数列中找到 b,将 b 右边的图案记 在心里,最后点击指定的按钮,你心里的那个图案将被显示.

下面我们就来编写程序模拟一下这个小游戏,以[0,1]之间的小数代替矩阵 中的图案,由 MATLAB 程序实现如下:

程序 I

% “测心术”游戏

format short

a=1;t=0;

while a

a1=rand(100,1);

k=3;s=[];

while k<=10

a1(9*k+1)=a1(19);

k=k+1;

end

a2=reshape(a1,20,5);

a3=reshape(99:-1:0,20,5);

for i=1:5

s=[s,a3(:,i),a2(:,i)]; %生成矩阵

end

if ~t

disp(' //任意想一个两位数 a,然后将这个两位数减去它的个位数

字与十位数字之和,');

disp(' //得到数字 b,再在下面矩阵的奇数列中找到 b,最后记住

其右边对应的小数 c');

pause(10); t=t+1;

end

disp(' '); disp(s);

pause(5); disp(' ');

d=input(' //确定你已经完成计算并记下了那个小数,摁‘Enter’键 呈现此数字\n');

disp(s(19,2)); pause(3); disp(' ');

a=input(' // ‘Enter’退出; =>‘1’再试一次\n');

end

使用说明:运行程序 I 生成一个 20 ??10 的矩阵 s,你任意想一个两位数 a, 按照上面所说的步骤操作,然后在 s 的奇数列中找到 b,将 b 右边的小数记在心里,

再调用程序 II,则返回你所记下的那个小数.(运行演示略) 原理说明:设任意

一个两位数 a=10 k1 + k2 ,则 a-( k1 + k2 )=9 k1 =b,所以 b 一定

是 9 的倍数,且只可能在9到 81 之间.明白了这一点,上面程序中的各种设置就一

目了然了.

例3 折半查找算法

要从一个数组 x 中找到一个指定的数 a,通常的做法是从 x 的第一个数开始 顺序查找.如果 x 是一个无序的数组,的确没有比顺序查找更好的方法了,但如果 x 有序,设计查找算法时就要充分利用这已有的规律,折半查找就是针对有序数 组进行查找的一种效率较高的方法.对于一个 n 维数组,折半查找最多比较次数 为 n /2 . ??log2 n????1,而顺序查找的平均比较次数为

写一个算法:在数组 x 中查找数字 a,其中 x 是一个元素各异并按升序排列 的一维数组.若找到 a,则返回a在x 中的位置,若 a 不在 x 中则返回“找不到”. 折半查找算法程序如下:

function s= BinarySearch (x,a)

%折半查找法,x 是按升序排列的一维数组,a 是待查找的数字

n=length(x);

sign=0; %用 sign 标记是否查找成功,赋初值为假,当查找成功时其值为真 top=1;bott=n; %查找区间端点下标,top 为“顶”,bott 为“底”

if a<x(1)|a>x(n) %当a比x 的最小值小或比 x 的最大值大时,返回找不到此数, s='The number is not found'; %并终止程序,否则在 x 的内部查找 a return;

else

while((sign==0)&(top<=bott))

mid=fix((bott+top)/2); %求中位数并取整

if a==x(mid)

s=mid;

sign=1;

elseif a<x(mid)

bott=mid-1; %若找到 a %记录它在 x 中的下标, %并置标志变量为真 %否则,改变区间端点下标

本文已影响