河南城建学院MATLAB上机实验答案(新)

一熟悉Matlab工作环境

1、熟悉Matlab的5个基本窗口

思考题:

(1)变量如何声明,变量名须遵守什么规则、是否区分大小写。

答:变量一般不需事先对变量的数据类型进行声明,系统会依据变量被赋值的类型自动进行类型识别,也就是说变量可以直接赋值而不用提前声明。变量名要遵守以下几条规则: 变量名必须以字母开头,只能由字母、数字或下划线组成。

变量名区分大小写。

变量名不能超过63个字符。

关键字不能作为变量名。

最好不要用特殊常量作为变量名。

(2)试说明分号、逗号、冒号的用法。

分号:分隔不想显示计算结果的各语句;矩阵行与行的分隔符。

逗号:分隔欲显示计算结果的各语句;变量分隔符;矩阵一行中各元素间的分隔符。

冒号:用于生成一维数值数组;表示一维数组的全部元素或多维数组某一维的全部元素。

(3)linspace()称为“线性等分”函数,说明它的用法。

LINSPACE Linearly spaced vector. 线性等分函数

LINSPACE(X1, X2) generates a row vector of 100 linearly

equally spaced points between X1 and X2.

以X1为首元素,X2为末元素平均生成100个元素的行向量。

LINSPACE(X1, X2, N) generates N points between X1 and X2.

For N < 2, LINSPACE returns X2.

以X1为首元素,X2为末元素平均生成n个元素的行向量。如果n<2,返回X2。

Class support for inputs X1,X2:

float: double, single

数据类型:单精度、双精度浮点型。

(4)说明函数ones()、zeros()、eye()的用法。

ones()生成全1矩阵。

zeros()生成全0矩阵。

eye()生成单位矩阵。

2、Matlab的数值显示格式

思考题:

(1)3次执行exist(’pi’)的结果一样吗?如果不一样,试解释为什么?

>> pi

ans =

3.1416 >> sin(pi); >> exist('pi') ans =

5 >> pi=0;

>> exist('pi')

ans =

1

>> pi

pi =

>> clear

>> exist('pi')

ans =

5

>> pi

ans =

3.1416

答:3次执行的结果不一样。exist()函数是返回变量搜索顺序的一个函数。在第一次

执行时返回5代表变量pi是由Matlab构建的变量。在第二次执行时已经通过赋值语句定义

了变量pi,返回1代表pi是工作空间变量。第三次执行前清除了工作空间,此时pi为系统

默认常量,和第一次执行时性质一样,所以又返回5。

(2)圆周率pi是系统默认常量,为什么会被改变为0。

pi=0 为赋值语句,此时pi不再是系统默认常量,而是定义的变量了。

二 MATLAB语言基础

1、向量的生成和运算

练习:使用logspace()创建1~4π的有10个元素的行向量。

>> A=logspace(0,1.0992,10)

A =

1.0000 1.3247 1.7550

2.3249

3.0799

4.0801

5.4051 7.1603 9.4856 12.5661

2、矩阵的创建、引用和运算

(1)矩阵的创建和引用

练习:创建以下矩阵:A为3×4的全1矩阵、B为3×3的0矩阵、C为3×3的单位矩阵、D为3×3的魔方阵、E由C和D纵向拼接而成、F抽取E的2~5行元素生成、G由F经变

形为3×4的矩阵而得、以G为子矩阵用复制函数生成6×8的大矩阵H。

>> A=ones(3,4),B=zeros(3,3),C=eye(3,3),D=magic(3)

A =

1 1 1 1 1 1 1 1 1 1 1 1

B =

0 0 0 0 0 0

0 0 0

C =

1 0 0 0 1 0

0 0 1

D =

8 1 6

3 5 7

4 9 2

>> E=[C;D], F=E(2:5,:), G=reshape(F,3,4)

E =

1 0 0

0 1 0

0 0 1

8 1 6

3 5 7

4 9 2

F =

0 1 0

0 0 1

8 1 6

3 5 7

G =

0 3 1 1

0 1 5 6

8 0 0 7

>> H=repmat(G,2)

H =

0 3 1 1 0 3 1 1 0 1 5 6 0 1 5 6 8 0 0 7 8 0 0 7 0 3 1 1 0 3 1 1 0 1 5 6 0 1 5 6

8 0 0 7 8 0 0 7 2)矩阵运算

练习:1)用矩阵除法求下列方程组的解x=

>> A=[6 3 4;-2 5 7;8 -1 -3],B=[3;-4;-7]

A =

6 3 4 -2 5

7

8 -1 -3 B =

3 -

4 -7

>> x=A\B

x =

1.0200

-14.0000

9.7200

2)求矩阵的秩;

>> r=rank(A)

r =

3

3)求矩阵的特征值与特征向量>> [X,Lamda]=eig(A)

X =

0.8013 -0.1094 -0.1606 0.3638 -0.6564 0.8669 0.4749 0.7464 -0.4719 Lamda =

9.7326 0 0 0 -3.2928 0 0 0 1.5602

4)矩阵的乘幂(平方)与开方>> A^2

ans =

62 29 33

34 12 6

26 22 34

>> A1=sqrtm(A)

A1 =

2.2447 + 0.2706i 0.6974 - 0.1400i 0.9422 - 0.3494i -0.5815 + 1.6244i 2.1005 - 0.8405i 1.7620 - 2.0970i 1.9719 - 1.8471i -0.3017 + 0.9557i 0.0236 + 2.3845i 5)矩阵的指数与对数(以e为底)

>> Ae=expm(A)

Ae =

1.0e+004 *

1.0653 0.5415 0.6323

0.4830 0.2465 0.2876

0.6316 0.3206 0.3745

>> Ael=logm(A)

Ael =

1.7129 + 0.4686i 0.5305 - 0.2425i 0.5429 - 0.6049i 1.1938 +

2.8123i 0.3658 - 1.4552i -0.5514 -

3.6305i -0.0748 - 3.1978i 0.7419 + 1.6546i 1.8333 +

4.1282i 6)矩阵的提取(取右上三角)与翻转(逆时针转90度)

>> a=triu(A)

a =

6 3 4 0 5

7 0 0 -3 >> a1=rot90(A)

a1 =

4 7 -3 3

5 -1

6 -2 8

3、多维数组的创建及运算

练习:创建三维数组A

,第一页为

,第二页为

,第三页为。然后用

reshape函数重排为数组B,B为3行、2列、2页。

>> a=[1 3;4 2],b=[1 2;2 1],c=[3 5;7 1]

>> A=cat(3,a,b,c)

A(:,:,1) = 1 3 4 2 A(:,:,2) =

1 2

2 1

A(:,:,3) =

3 5

7 1

>> B=reshape(A,3,2,2)

B(:,:,1) = 1 2 4 1 3 2

B(:,:,2) =

2 7

1 5

3 1

三 Matlab数值运算

1、多项式运算

练习:求的商及余多项式。

>> p1=conv([1 0 1],conv([1 3],[1 1]))

p1 =

1 4 4 4 3

>> [q r]=deconv(p1,[1 0 2 1])

q =

1 4

r =

0 0 2 -5 -1

2、多形式插值和拟合

有一组实验数据如附表1-1所示。请分别用拟合(二阶至三阶)和插值(线性和三次样条)的方法来估测X=9.5时Y的值

>> x=1:10;y=[16 32 70 142 260 436 682 1010 1432 1960];

>> p1=polyfit(x,y,1) p1 =

204.8000 -522.4000 >> y1=polyval(p1,9.5) y1 =

1.4232e+003

>>

p2=polyfit(x,y,2),y2=polyval(p2,9.5) p2 =

32.0000 -147.2000 181.6000

y2 =

1.6712e+003

>>

p3=polyfit(x,y,3),y3=polyval(p3,9.5) p3 =

2.0000 -1.0000 5.0000 10.0000

y3 =

1.6820e+003

>> y4=interp1(x,y,9.5)

y4 =

1696

>> y5=spline(x,y,9.5)

y5 =

1682

3、习题

(1)用函数roots 求方程的根

>> roots([1 -1 -1])

ans =

-0.6180

1.6180

(2),在n个节点(n不要太大,如取5~11)上用分段线性和三

次样条插值方法,计算m个插值点(m可取50~100)的函数值。通过数值和图形输出,将两

种插值结果与精度进行比较。适当增加n,再作比较。

>> x=linspace(0,2*pi,8),y=sin(x)

x =

0 0.8976 1.7952 2.6928 3.5904 4.4880 5.3856 6.2832

y =

0 0.7818 0.9749 0.4339 -0.4339 -0.9749 -0.7818 -0.0000

>>

xi=linspace(0,2*pi,100);y0=sin(xi);y1=interp1(x,y,xi);y2=interp1(x,y,xi,'spline'

);

>> plot(xi,y0,'*',xi,y1,'-.',xi,y2)

>> e1=y1-y0;e2=y2-y0; >> plot(xi,e1)

1

2

3

4

5

6

7

-0.1

-0.08-0.06-0.04-0.0200.020.040.060.080.1

>> plot(xi,e2)

01234567

-0.015

-0.01

-0.005

0.005

0.01

0.015

(3)大气压强p 随高度x 变化的理论公式为

,为验证这一公式,

测得某地大气压强随高度变化的一组数据如表所示。试用插值法和拟合法进行计算并绘图,看那种方法较为合理,且总误差最小。

>> x=[0 300 600 1000 1500 2000]; p=[0.9689 0.9322 0.8969 0.8519 0.7989 0.7491]; >> xi=linspace(0,2000);p0=1.0332*exp(-(xi+500)/7756); >> p1=interp1(x,p,xi,'spline'); >> plot(xi,p0,'*',xi,p1) >> e1=p1-p0; >> e=sum(e1.^2) e =

1.8652e-005 拟合法:

>> x=[0 300 600 1000 1500 2000]; p=[0.9689 0.9322 0.8969 0.8519 0.7989 0.7491]; >> P=log10(p)

P =

-0.0137 -0.0305 -0.0473 -0.0696 -0.0975 -0.1255 >> p1=polyfit(x,P,1)

p1 =

-0.0001 -0.0137

>> b=p1(1)/0.4343,a=10.^p1(2)

b =

-1.2863e-004

a =

0.9689

>> xi=linspace(0,2000);p0=1.0332*exp(-(xi+500)/7756);

>> p2=polyval(p1,xi);P2=10.^p2;

>> e2=P2-p0;e=sum(e2.^2)

e =

1.8116e-005

四 Matlab数值运算

1、数值微积分

练习:瑞士地图如图所示,为了算出其国土面积,首先对地图作如下测量:以由西向东方向为X轴,由南到北方向为Y轴,选择方便的原点,并将从最西边界点到最东边界点在X轴上的区间适当划分为若干段,在每个分点的Y方向测出南边界点和北边界点的Y坐标Y1和Y2,根据地图比例尺知道18mm相当于40km,试由测量数据计算瑞士国土近似面积,与其精确值41228km2比较。

>>

x=[7,10.5,13,17.5,34,40.5,44.5,48,56,61,68.5,76.5,80.5,91,96,101,104,106.5,111.5 ,118,123.5,136.5,142,146,150,157,158];

>>

y1=[44,45,47,50,50,38,30,30,34,36,34,41,45,46,43,37,33,28,32,65,55,54,52,50,66,6 6,68];

>>

y2=[44,59,70,72,93,100,110,110,110,117,118,116,118,118,121,124,121,121,121,116,1 22,83,81,82,86,85,68];

>> X=x./18*40;Y1=y1./18*40;Y2=y2./18*40;

>> t1=trapz(X,Y1),t2=trapz(X,Y2), t=t2-t1

t1 =

3.3819e+004

t2 =

7.6328e+004

t =

4.2510e+004

>> expt=t-41228

expt =

1.2819e+003

2、习题

(4)利用梯形法和辛普森法求定积分的值,并对结果进行比较。如果积分区间改为-5~5结果有何不同?梯形积分中改变自变量x的维数,结果有何不同?

>> x=linspace(-3,3);y=exp(-x.^2/2);

>> t=(1/2*pi)*trapz(x,y)

t =

3.9267

>>

q=(1/2*pi)*quad('exp(-x.^2/2)',-3,3) q =

3.9268

>> x=linspace(-5,5);y=exp(-x.^2/2);

>> t=(1/2*pi)*trapz(x,y)

t =

3.9374

>>

q=(1/2*pi)*quad('exp(-x.^2/2)',-5,5) q =

3.9374

>> x=linspace(-3,3,150);y=exp(-x.^2/2);

>> t=(1/2*pi)*trapz(x,y)

t =

3.9268

(5)分别用矩形法、梯形法、辛普森法和牛顿-科茨4种方法近似计算定积分,取n=4,保留4位有效数字。

矩形法:

>> x=linspace(0,1);y=x./(x.^2+4); >> t=cumsum(y)*1/99;T=t(100) T =

0.1126

梯形法:

>> x=linspace(0,1);y=x./(x.^2+4); >> t=trapz(x,y) t =

0.1116

辛普森法:

>> q=quad('x./(x.^2+4)',0,1) q =

0.1116 牛顿-科茨法:

>> q=quadl('x./(x.^2+4)',0,1) q =

0.1116

五 Matlab符号运算

1、符号矩阵创建

练习:分别用sym和syms 创建符号表达式:,。

>> f1=sym('cos(x)+(-(sin(x)^2))^(1/2)')

f1 =cos(x)+(-(sin(x)^2))^(1/2)

>> syms y e t

>> f2=y/exp(-2*t)

f2 =y/exp(-2*t)

2、习题

(2)试创建以下2个矩阵:

6、符号表达式的变量替换

练习:(1

)已知,按照自变量x和自变量a,对表达式f分别进行降幂排列。

>> f=sym('(a*x^2+b*x+c-3)^3-a*(c*x^2+4*b*x-1)')

f =(a*x^2+b*x+c-3)^3-a*(c*x^2+4*b*x-1)

>> f1=collect(f),f2=collect(f,'a')

f1 =

a^3*x^6+3*b*a^2*x^5+((c-3)*a^2+2*b^2*a+a*(2*(c-3)*a+b^2))*x^4+(4*(c-3)*b*a+b *(2*(c-3)*a+b^2))*x^3+((c-3)*(2*(c-3)*a+b^2)+2*b^2*(c-3)+a*(c-3)^2-a*c)*x^2+(3*( c-3)^2*b-4*b*a)*x+(c-3)^3+a

f2 =

a^3*x^6+3*(b*x+c-3)*x^4*a^2+(3*(b*x+c-3)^2*x^2-c*x^2-4*b*x+1)*a+(b*x+c-3)^3

8、符号方程的求解

练习:(1)求

>> f=sym('(x^2-1)/(x^2-3*x+2)');

>> limit(f,'x',2)

ans =NaN

(2)求函数f(x)=cos2x-sin2x的积分;求函数的导数。

>> f=sym('cos(2*x)-sin(2*x)');

>> int(f)

ans =1/2*sin(2*x)+1/2*cos(2*x)

>> g=sym('(exp(x)+x*sin(x))^(1/2)');

>> diff(g)

ans =1/2/(exp(x)+x*sin(x))^(1/2)*(exp(x)+sin(x)+x*cos(x))

(3)计算定积分

>> f=sym('sin(x)+2');

>> int(f,'x',0,pi/6)

ans =-1/2*3^(1/2)+1/3*pi+1

(4)求下列线性方程组的解

>> f1=sym('x+y+z=10');

>> f2=sym('3*x+2*y+z=14');

>> f3=sym('2*x+3*y-z=1');

>> g=solve(f1,f2,f3,'x','y','z')

g =

x: [1x1 sym]

y: [1x1 sym]

z: [1x1 sym]

>> g.x

ans =1

>> g.y

ans =2

>> g.z

ans =7

(5)求解当y(0)=2,z(0)=7时,微分方程组的解

>> [g_y,g_z]=dsolve('Dy-z=sin(x)','Dz+y=1+x','y(0)=2','z(0)=7','x')

g_y =cos(x)+6*sin(x)+1/2*sin(x)*x+1+x

g_z =-3/2*sin(x)+6*cos(x)+1+1/2*cos(x)*x

六 Matlab程序设计

1、程序流程控制结构

练习:(1)请把exp2.函数文件用while循环改写。

function s=exp3(x)

n=1;s=0;

while n<=x

s=s+n;

n=n+1;

end

s

(2)用公式求pi的近似值,直到最后一项的绝对值小

于10-6为止,试编写其M脚本文件。

k=0;jspi=1;i=3;

while (1/i)>=10e-6

k=k+1;

if rem(k,2)==0

jspi=jspi+1/i;

else

jspi=jspi-1/i;

end

i=i+2;

end

p=4*jspi ,k

2、子函数和参数传递

练习:编写求矩形面积函数rect,当没有输入参数时,显示提示信息;当只输入一个参数时,则以该参数作为正方形的边长计算其面积;当有两个参数时,则以这两个参数为长和宽计算其面积。

function s=mianji(a,b)

switch nargin

case 0

error('没有输入参数')

case 1

s=a*a;

case 2

s=a*b;

end

3、习题

(3)编写一个函数project1.m,其功能是判断某一年是否为闰年。

function ryear(year)

s=0;

if rem(year,4)==0

s=s+1;

end

if rem(year,100)==0

s=s-1;

end

if rem(year,400)==0

s=s+1;

end

if s==1

fprintf('%4d 是闰年.\n',year)

else

fprintf('%4d 不是闰年.\n',year)

end

(4)编制一个函数,使得该函数能对输入的两个数值进行比较并返回其中的最小值。function c = bijiao(a,b)

if nargin==2

if a < b

c=a;

else

c=b;

end

else

error('输入参数不正确')

end

(6)观察以下循环语句,计算每个循环的循环次数和循环结束之后var的值。

var=1;

while mod(var,10)~=0

var=var+1

end

循环次数10,var=10。

var=2;

>> while var<=100

var=var^2;

end

循环次数4,var=256。

>> var=3;

>> while var>100

var=var^2;

end

循环次数0次,var=3。

七 Matlab数据可视化

1、二维图形绘制

练习:写出图A2的绘制方法。

y1=sin(x);y2=cos(x);

plot(x,y1,'r -',x,y2,'m --')

x=linspace(0,4*pi);

y1=sin(x);y2=cos(x);

plot(x,y1,'r --',x,y2,'m -')

ylabel('·ù?è'),xlabel('ê±??')

legend('sinx','cosx')

gtext('\leftarrowsinx')

gtext('\leftarrowcosx')

axis([0 16 -1 1])

xdate=0:0.5:16;ydate=0

line(xdate,ydate,'Color','k','Marker','.')

2、三维曲线和三维曲面绘制

练习:(1)绘制以上空间螺旋线的俯视图、左侧视图和前视图。z=0:0.1:6*pi;

x=cos(z);y=sin(z);

subplot(2,2,1);plot3(cos(z),sin(z),z);

title('èy???ú??')

subplot(2,2,2);plot(cos(z),sin(z));

title('??êóí?')

subplot(2,2,3);plot(cos(z),z);

title('×óêóí?')

subplot(2,2,4);plot(sin(z),z);

title('?°êóí?')

(2)设,求定义域x=[-2,2],y=[-2,2]内的z值(网格取0.1)。请把z的值用网面图形象的表示出来,如图A3所示。

x=-2:0.1:2;y=x;

[X,Y]=meshgrid(x,y);

Z=X.^2.*exp(-(X.^2+Y.^2));

surf(X,Y,Z)

相关文档
最新文档