加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

刘卫国 Matlab 例题 1-3章

(2011-03-14 12:03:01)
标签:

宋体

黑体

线性方程组

表达式

文本编辑器

教育

第一章

1.1  分别绘制函数file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />的曲线。

x=-2*pi:pi/180:2*pi;

plot(x,2.^(-abs(x)),':',x,sin(x));

1.2  求方程 2x5-3x3 +71x2-9x+13=0的全部根。

p=[2,0,-3,71,-9,13];

x=roots(p)

1.3  求解线性方程组。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

a=[2,3,-1;8,2,3;45,3,9];

b=[2;4;23];

x=inv(a)*b

1.4  求积分file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

quad('x.*log(1+x)',0,1)

第二章

 

    2.1  计算表达式 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" /> 的值,并将结果赋给变量x,然后显示出结果。

x=(5+cos(47*pi/180))/(1+sqrt(7)-2*i)          %计算表达式的值

    2.2  利用M文件建立MYMAT矩阵。

(1)启动有关编辑程序或MATLAB文本编辑器(见第4),并输入待建矩阵:

MYMAT=[101,102,103,104,105,106,107,108,109;

             201,202,203,204,205,206,207,208,209;

             301,302,303,304,305,306,307,308,309];

    (2)把输入的内容存盘(设文件名为mymatrix.m)

    (3)MATLAB命令窗口中输入mymatrix,即运行该M文件,就会自动建立一个名为MYMAT的矩阵,可供以后使用。

    2.3  建立5阶方阵A,判断A的元素是否能被3整除。

A =[24,35,13,22,63;23,39,47,80,80; ...

90,41,80,29,10;45,57,85,62,21;37,19,31,88,76]

P=rem(A,3)==0     %判断A的元素是否可以被3整除

2.4  [0,3π]区间,求y=sin(x)的值。要求:

(1)消去负半波,即(π,2π)区间内的函数值置0

(2) file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

方法1

x=0:pi/100:3*pi;

y=sin(x);

y1=(x<pi|x>2*pi).*y;         %消去负半波

q=(x>pi/3&x<2*pi/3)|(x>7*pi/3&x<8*pi/3);

qn=~q;

y2=q*sin(pi/3)+qn.*y1;       %按要求处理第(2)

方法2

x=0:pi/100:3*pi;

y=sin(x);

y1=(y>=0).*y;              %消去负半波

p=sin(pi/3);

y2=(y>=p)*p+(y<p).*y1;     %按要求处理第(2)

2.5  建立矩阵A,然后找出在[1020]区间的元素的位置。

(1) 建立矩阵A

A=[4,15,-45,10,6;56,0,17,-45,0]

A =

     4    15   -45    10     6

    56     0    17   -45     0

(2) 找出大于4的元素的位置。

find(A>=10 & A<=20)

ans =

     3

     6

     7

2.6  建立一个字符串向量,然后对该向量做如下处理:

    (1)取第1~5个字符组成的子字符串。

(2)将字符串倒过来重新排列。

(3)将字符串中的小写字母变成相应的大写字母,其余字符不变。

(4)统计字符串中小写字母的个数。

命令如下:

ch='ABc123d4e56Fg9';

subch=ch(1:5)           %取子字符串

subch =

         ABc12

revch=ch(end:-1:1)       %将字符串倒排

revch =

         9gF65e4d321cBA

k=find(ch>='a'&ch<='z');     %找小写字母的位置

ch(k)=ch(k)-('a'-'A');         %将小写字母变成相应的大写字母

char(ch)               

ans =

     ABC123D4E56FG9

length(k)                  %统计小写字母的个数

ans =

      4

第三章

3.1  分别建立3×33×2和与矩阵A同样大小的零矩阵。

(1) 建立一个3×3零矩阵。

zeros(3)

ans =

     0     0     0

     0     0     0

     0     0     0

(2) 建立一个3×2零矩阵。

zeros(3,2)

ans =

     0     0

     0     0

     0     0

(3) A2×3矩阵,则可以用zeros(size(A))建立一个与矩阵A同样大小零矩阵。

A=[1 2 3;4 5 6];    %产生一个2×3阶矩阵A

zeros(size(A))      %产生一个与矩阵A同样大小的零矩阵

ans =

     0     0     0

     0     0     0

3.2  建立随机矩阵:

(1) 在区间[20,50]内均匀分布的5阶随机矩阵。

(2) 均值为0.6、方差为0.15阶正态分布随机矩阵。

x=20+(50-20)*rand(5)

y=0.6+sqrt(0.1)*randn(5)

3.3  101~12525个数填入一个55列的表格中,使其每行每列及对角线的和均为565

M=100+magic(5)

3.4  4阶希尔伯特矩阵及其逆矩阵。

命令如下:

format rat     %以有理形式输出

H=hilb(4)

H=invhilb(4)

format short    %恢复默认输出格式

3.5  (x+y)5的展开式。

pascal(6)

3.6  先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,第五行乘以5

A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;...

11,18,25,2,19];

D=diag(1:5);

D*A                %D左乘A,对A的每行乘以一个指定常数

3.7  求方阵A的逆矩阵,且验证AA-1是互逆的。

A=[1,-1,1;5,-4,3;2,1,1];

B=inv(A);

A*B

B*A

3.8  用求逆矩阵的方法解线性方程组。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

A=[1,2,3;1,4,9;1,8,27];

b=[5,-2,6]'; 

x=inv(A)*b

也可以运用左除运算符“\”求解线性代数方程组。例如,本例也可以用下面的命令求解:

A=[1,2,3;1,4,9;1,8,27];

b=[5,-2,6]'; 

x=A\b

3.9  用求特征值的方法解方程。

3x5-7x4+5x2+2x-18=0

p=[3,-7,0,5,2,-18];

A=compan(p);           %A的伴随矩阵

x1=eig(A)              %A的特征值

x2=roots(p)                 %直接求多项式p的零点

第四章

4.1  建立一个命令文件将变量a,b的值互换,然后运行该命令文件。

    程序1

首先建立命令文件并以文件名exch.m存盘:

clear;

a=1:10;

b=[11,12,13,14;15,16,17,18];

c=a;a=b;b=c;

a

b

然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。

    2

    首先建立函数文件fexch.m

function [a,b]=exch(a,b)

c=a;a=b;b=c;

然后在MATLAB的命令窗口调用该函数文件:

clear;

x=1:10;

y=[11,12,13,14;15,16,17,18];

[x,y]=fexch(x,y)

    4.2  求一元二次方程ax2+bx+c=0的根。

a=input('a=?');

b=input('b=?');

c=input('c=?');

d=b*b-4*a*c;

x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];

disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);

4.3  计算分段函数:

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

x=input('请输入x的值:');

if x==10

  y=cos(x+1)+sqrt(x*x+1);

else

  y=x*sqrt(x+sqrt(x));

end

y

也可以用单分支if语句来实现:

x=input('请输入x的值:');

y=cos(x+1)+sqrt(x*x+1);

if x~=10

   y=x*sqrt(x+sqrt(x));

end

y

或用以下程序:

x=input('请输入x的值:');

if x==10

   y=cos(x+1)+sqrt(x*x+1);

end

if x~=10

   y=x*sqrt(x+sqrt(x));

end

y

   4.4 输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。

c=input('请输入一个字符','s');

if c>='A' & c<='Z'

   disp(setstr(abs(c)+abs('a')-abs('A')));

elseif c>='a'& c<='z'

    disp(setstr(abs(c)- abs('a')+abs('A')));

elseif c>='0'& c<='9'

    disp(abs(c)-abs('0'));

else

    disp(c);

end

4.5  某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示) 

    price<200           没有折扣

    200≤price<500       3%折扣

    500≤price<1000      5%折扣

    1000≤price<2500     8%折扣

    2500≤price<5000     10%折扣

5000≤price          14%折扣

输入所售商品的价格,求其实际销售价格。

price=input('请输入商品价格');

switch fix(price/100)

   case {0,1}                 %价格小于200

      rate=0;

   case {2,3,4}              %价格大于等于200但小于500

      rate=3/100;

   case num2cell(5:9)       %价格大于等于500但小于1000

      rate=5/100;

   case num2cell(10:24)     %价格大于等于1000但小于2500

      rate=8/100;

   case num2cell(25:49)     %价格大于等于2500但小于5000

      rate=10/100;

   otherwise                  %价格大于等于5000

      rate=14/100;

end

price=price*(1-rate)        %输出商品实际销售价格

4.6  矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

A=[1,2,3;4,5,6];

B=[7,8,9;10,11,12];

try

   C=A*B;

catch

   C=A.*B;

end

C

lasterr                %显示出错原因

4.7  一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。

for m=100:999

m1=fix(m/100);            %m的百位数字

m2=rem(fix(m/10),10);    %m的十位数字

m3=rem(m,10);             %m的个位数字

if m==m1*m1*m1+m2*m2*m2+m3*m3*m3

disp(m)

end

end

    4.8  已知 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />,当n=100时,求y的值。

y=0;n=100;

for i=1:n

y=y+1/i/i;

end

y

    在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:

n=100;

i=1:n;

f=1./i.^2;

y=sum(f)

4.9  file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a; s=0;

f0=exp(-0.5*x)*sin(x+pi/6);

for i=1:n

    x=x+h;

    f1=exp(-0.5*x)*sin(x+pi/6);

    s=s+(f0+f1)*h/2;

    f0=f1;

end

s

上述程序来源于传统的编程思想。也可以利用向量运算,从而使得程序更加简洁,更赋有MATLAB的特点。程序如下:

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a:h:b;

f=exp(-0.5*x).*sin(x+pi/6);

for i=1:n

    s(i)= (f(i)+f(i+1))*h/2;

end

s=sum(s)

    4.10  写出下列程序的执行结果。

s=0;

a=[12,13,14;15,16,17;18,19,20;21,22,23];

for k=a

    s=s+k;

end

disp(s');

    4.11  从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。

sum=0;

n=0;

x=input('Enter a number (end in 0):');

while (x~=0)

     sum=sum+x;

     n=n+1;

     x=input('Enter a number (end in 0):');

end

if (n>0)

    sum

    mean=sum/n

end

4.12  根据矩阵指数的幂级数展开式求矩阵指数。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.gifMatlab 例题 1-3章" TITLE="刘卫国 Matlab 例题 1-3章" />

X=input('Enter X:');

E=zeros(size(X));

F=eye(size(X));

n=1;

while norm(F,1)>0

   E=E+F;

   F=F*X/n;

   n=n+1;

end

E

expm(X)            %调用MATLAB矩阵指数函数求矩阵指数

    4.13  [100,200]之间第一个能被21整除的整数。

for n=100:200

if rem(n,21)~=0

      continue

end

break

end

n

4.14  若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。

4.15  用筛选法求某自然数范围内的全部素数。

        m=input('m=');

p=1:m; p(1)=0;

for i=2:sqrt(m)

   for j=2*i:i:m

      p(j)=0;

   end

end

n=find(p~=0);

p(n)

    关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:

m=input('m=');

p=2:m;

for i=2:sqrt(m)

   n=find(rem(p,i)==0&p~=i);

   p(n)=[];

end

p

    4.16  编写函数文件求半径为r的圆的面积和周长。

    函数文件如下:       

function [s,p]=fcircle(r)

%CIRCLE  calculate the area and perimeter of a circle of radii r

%r          圆半径

%s          圆面积

%p          圆周长

 

06230日编

s=pi*r*r;

p=2*pi*r;

    将以上函数文件以文件名fcircle.m存盘,然后在MATLAB命令窗口调用该函数:

[s,p]=fcircle(10)

    4.17  利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。

    函数文件tran.m

function [rho,theta]=tran(x,y)

rho=sqrt(x*x+y*y);

theta=atan(y/x);

    调用tran.m的命令文件main1.m

x=input('Please input x=:');

y=input('Please input y=:');

[rho,the]=tran(x,y);

rho

the

    4.18  利用函数的递归调用,求n!。

function f=factor(n)

if n<=1

   f=1;

else

   f=factor(n-1)*n;    %递归调用求(n-1)!

end

    在命令文件main2.m中调用函数文件factor.ms=1!+2!+3!+4!+5!

s=0;

for i=1:5

   s=s+factor(i);

end

s

4.19  任意排列问题。MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。

function Y=rndprm1(X)

%RNDPRM1    for循环产生一个行向量的任意排列

%RNDPRM1(X)产生行向量X的任意排列

[m,n]=size(X);

if m>1

   error('RNDPRM1 accepts as inputs only vectors');

end

Y=[];                     %从一个空矩阵开始

l=n;                      %X的元素个数

for i=1:n

k=1+fix(l*rand);        %随机选择Y的下一个元素的位置

x=X(k);                   %被选择的元素

      Y=[Y,x];            %X添加到Y

      X(k)=[];            %X中删除x元素 

      l=l-1  ;             %更新X的元素个数

end

第二个程序用函数的递归调用:

function Y=rndprm2(X)

%RNDPRM2    用递归调用产生一个行向量的任意排列

%RNDPRM2(X)产生一个X的任意排列

[m,n]=size(X);

l=n;

if m>1

   error('RNDPRM2 accepts as inputs only vectors')

end

if n<=1

    Y=X;

else

k=1+fix(l*rand);        %随机选择Y的下一个元素的位置

x=X(k);                   %被选择的元素

X(k)=[];                  %X中删除x元素 

    Z=rndprm2(X);            %将剩下的元素随机排列

    Y=[Z,x];                  %构造输出向量

    l=l-1;

end

    4.20  nargin用法示例。

    函数文件examp.m

function fout=charray(a,b,c)

if nargin==1

   fout=a;

elseif nargin==2

   fout=a+b;

elseif nargin==3

   fout=(a*b*c)/2;

end

    命令文件mydemo.m

x=[1:3];

y=[1;2;3];

examp(x)

examp(x,y')

examp(x,y,3)

    4.21  全局变量应用示例。

    先建立函数文件wadd.m,该函数将输入的参数加权相加。

function f=wadd(x,y)

global ALPHA BETA

f=ALPHA*x+BETA*y;

    在命令窗口中输入:

global ALPHA BETA

ALPHA=1;

BETA=2;

s=wadd(1,2)



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有