当前位置:文档之家› matlab2011教程之二数值数组及向量化运算

matlab2011教程之二数值数组及向量化运算

matlab2011教程之二数值数组及向量化运算
matlab2011教程之二数值数组及向量化运算

第 2 章 数值数组及向量化运算本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、

以及MATLAB的数组运算和向量化编程。值得指出:本章内容是读者今后编写各种科学计

算M码的基本构件。

数值数组(Numeric Array)是MATLAB最重要的数据类型数组。在各种维度的数值数

组中,二维数组为最基本、最常用。本章对二维数组创建、标识、寻访、扩充、收缩等方

法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。

本章讲述的逻辑数组主要产生于逻辑运算和关系运算。它是MATLAB 援引寻访数据、

构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。

数组运算是MATLAB区别于其它程序语言的重要特征,是MATLAB绝大多数函数指

令、Simulink许多库模块的本性,是向量化编程的基础。为此,本章专辟第2.2节用于阐述MATLAB的这一重要特征。

在此提醒读者注意:随书光盘mbook目录上保存着本章相应的电子文档“ch02_数值数

组及向量化运算.doc”。该文档中有本章全部算例的可执行指令,以及相应的运算结果。

2.1数值数组的创建和寻访

2.1.1一维数组的创建

1递增/减型一维数组的创建

(1)“冒号”生成法

(2)线性(或对数)定点法

2其他类型一维数组的创建

(1)逐个元素输入法

(2)运用MATLAB函数生成法

【例2.1-1】一维数组的常用创建方法举例。

a1=1:6

a2=0:pi/4:pi

a3=1:-0.1:0

a1 =

1 2 3 4 5 6

a2 =

0 0.7854 1.5708 2.3562 3.1416

a3 =

Columns 1 through 8

1.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 0.3000

Columns 9 through 11

0.2000 0.1000 0

b1=linspace(0,pi,4)

b2=logspace(0,3,4)

b1 =

0 1.0472 2.0944 3.1416

b2 =

1 10 100 1000

c1=[2 pi/2 sqrt(3) 3+5i]

c1 =

2.0000 1.5708 1.7321

3.0000 + 5.0000i rng default

c2=rand(1,5)

c2 =

0.8147 0.9058 0.1270 0.9134 0.6324

〖说明〗

x1=(1:6)' , x2=linspace(0,pi,4)'

y1=rand(5,1)

z1=[2; pi/2; sqrt(3); 3+5i]

2.1.2二维数组的创建

1小规模数组的直接输入法

【例2.1-2】在MATLAB环境下,用下面三条指令创建二维数组C。

a=2.7358; b=33/79;

C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i]

C =

1.0000 5.4716 + 0.4177i 0.6909

0.7071 4.8244 3.5000 + 1.0000i

2中规模数组的数组编辑器创建法

3(×的数组输入MATLAB内存,并命名为A18。【例2.1-3】试用变量编辑器,把如下)6

0.8147 0.9134 0.2785 0.9649 0.9572 0.1419

0.9058 0.6324 0.5469 0.1576 0.4854 0.4218

0.1270 0.0975 0.9575 0.9706 0.8003 0.9157

图2.1-1 利用数组编辑器创建中规模数组

3中规模数组的M文件创建法

【例2.1-4】为数组AM,创建一个 exm020104_Matrix.m 文件。以后每当需要AM数组时,只要运行exm020104_Matrix文件,就可在内存生成AM。

图2.1-2 利用M文件创建数组

4利用MATLAB函数创建数组

【例2.1-5】利用MATLAB指令产生数组。

(1)

ao=ones(2,4)

az=zeros(2,5)

ae=eye(3)

am=magic(4)

ad=diag(am)

add=diag(diag(am))

ao =

1 1 1 1

1 1 1 1

az =

0 0 0 0 0

0 0 0 0 0

ae =

1 0 0

0 1 0

0 0 1

am =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 1

5 1

ad =

16

11

6

1

add =

16 0 0 0

0 11 0 0

0 0 6 0

0 0 0 1

(2)

%

rng default

Au=rand(1,5)

Ai=randi([-3,4],2,8)

As=randsrc(3,12,[-3,-1,1,3],1)

Ap=randperm(8)

Au =

0.8147 0.9058 0.1270 0.9134 0.6324

Ai =

-3 1 4 4 0 -2 4 4

-1 4 -2 4 3 0 3 2

As =

-1 -1 -3 1 -3 1 -3 3 3 -3 -3 1 1 -3 -1 -1 3 -1 -3 -1 3 -3 -1 1 -3 -3 -1 1 -3 1 3 1 -3 3 3 -1 Ap =

1 7 8 4 6 5

2 3

%

rng(0,'v5normal')

randn(2,6)

ans =

-0.4326 0.1253 -1.1465 1.1892 0.3273 -0.1867

-1.6656 0.2877 1.1909 -0.0376 0.1746 0.7258

(3)

n=5;lambda=2;

A = gallery('jordbloc',n,lambda)

A =

2 1 0 0 0

0 2 1 0 0

0 0 2 1 0

0 0 0 2 1

0 0 0 0 2

rng(11,'v5normal')

n=6;

kappa=1e8;

mode=2;

B= gallery('randsvd',n,kappa,mode)

Bsv=svd(B)'

Bc=cond(B)

B =

-0.2402 -0.6286 -0.6241 -0.1413 0.2258 -0.2410

-0.5761 0.2703 0.2092 -0.1420 -0.2454 -0.4657

0.5168 -0.1311 0.0244 -0.6882 -0.4403 -0.2138

0.5613 0.2022 -0.1260 0.2781 0.3097 -0.1772

-0.0744 0.0489 0.3518 -0.5518 0.7473 0.0709

-0.1044 -0.2899 0.1391 -0.0840 -0.2010 0.7394

Bsv =

1.0000 1.0000 1.0000 1.0000 1.0000 0.0000

Bc =

1.0000e+008

2.1.3二维数组元素的标识和寻访

1数组的维数和大小

(1)数组的维数(Dimension)

(2)数组的大小(Size)

【例2.1-6】数组的维数、大小和长度

clear

A=reshape(1:24,2,3,4);

dim_A=ndims(A)

size_A=size(A)

L_A=length(A)

dim_A =

3

size_A =

2 3 4

L_A =

4

2数组的标识和寻访

【例2.1-7】本例演示:数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。

(1)

A=zeros(2,6)

A(:)=1:12

a8=A(8)

a311=A([3,11])

A =

0 0 0 0 0 0

0 0 0 0 0 0

A =

1 3 5 7 9 11

2 4 6 8 10 12

a8 =

8

a311 =

3 11

(2)

A(3,7)=37

a13=A(:,[1,3])

aend=A([2,3],4:end)

A =

1 3 5 7 9 11 0

2 4 6 8 10 12 0

0 0 0 0 0 0 37

a13 =

1 5

2 6

0 0

aend =

8 10 12 0

0 0 0 37

(3)

L=A<3

A(L)=NaN

L =

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 1 1 1 0

A =

NaN 3 5 7 9 11 NaN

NaN 4 6 8 10 12 NaN

NaN NaN NaN NaN NaN NaN 37

2.1.4数组的扩缩和特殊操作

1数组的扩充和收缩

【例 2.1-8】二维数组的扩充和收缩。

(1)

a=1:5;b=6:10;c=11:15;

a_b=[a,b]

ab=[a;b;c]

a_b =

1 2 3 4 5 6 7 8 9 10

ab =

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

(2)

AB1=repmat(ab,[1,2])

AB2=repmat(ab,[2,1])

AB1 =

1 2 3 4 5 1 2 3 4 5

6 7 8 9 10 6 7 8 9 10

11 12 13 14 15 11 12 13 14 15

AB2 =

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

(3)

AB2([2,3,5,6],:)=[]

AB2(:,1:3)=[]

AB2 =

1 2 3 4 5

1 2 3 4 5

AB2 =

4 5

4 5

2数组的特殊操作

【例 2.1-9】本例演示:reshape的数组变形功能;数组的翻转指令flipud, fliplr, flipdim,以及它们体现的矩阵变换;数组绕“左上元素”反时针旋转指令rot90;数组上下左右平移回绕指令circshift。

(1)

clear

a=1:24;

A=reshape(a,3,8)

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

A =

1 4 7 10 13 16 19 22

2 5 8 11 14 17 20 23

3 6 9 12 15 18 21 24

B(:,:,1) =

1 3 5 7

2 4 6 8

B(:,:,2) =

9 11 13 15

10 12 14 16

B(:,:,3) =

17 19 21 23

18 20 22 24

(2)

Aud=flipud(A)

Alr=fliplr(A)

B1=flipdim(A,1)

B2=flipdim(A,2)

At=A'

Aud =

3 6 9 12 15 18 21 2

4 2

5 8 11 14 17 20 23 1 4 7 10 13 1

6 19 22 Alr =

22 19 16 13 10 7 4 1

23 20 17 14 11 8 5 2

24 21 18 15 12 9 6 3 B1 =

3 6 9 12 15 18 21 2

4 2

5 8 11 14 17 20 23 1 4 7 10 13 1

6 19 22 B2 =

22 19 16 13 10 7 4 1

23 20 17 14 11 8 5 2

24 21 18 15 12 9 6 3 At =

1 2 3

4 5 6

7 8 9

10 11 12

13 14 15

16 17 18

19 20 21

22 23 24

(3)

A90=rot90(A)

A180=rot90(A,2)

A90 =

22 23 24

19 20 21

16 17 18

13 14 15

10 11 12

7 8 9

4 5 6

1 2 3

A180 =

24 21 18 15 12 9 6 3 23 20 17 14 11 8 5 2 22 19 16 13 10 7 4 1 (4)

A

CR=circshift(A,1)

CL=circshift(A,[0,-1])

A =

1 4 7 10 13 16 19 22

2 5 8 11 14 17 20 23

3 6 9 12 15 18 21 2

4 CR =

3 6 9 12 15 18 21 2

4 1 4 7 10 13 16 19 22 2

5 8 11 14 17 20 23 CL =

4 7 10 13 16 19 22 1

5 8 11 14 17 20 23 2

6 9 12 15 18 21 24 3

3 数组操作函数汇总

2.2

数组运算

2.2.1

数组运算的由来和规则

1 函数关系数值计算模型的分类

2 提高程序执行性能的三大措施

3 数组运算规则

4

数组运算符及数组运算函数

2.2.2

数组运算和向量化编程

【例 2.2-1】欧姆定律:i

u

r =

,其中i u r , ,分别是电阻(欧姆)、电压(伏特)、电流(安培)。验证实验:据电阻两端施加的电压,测量电阻中流过的电流,然后据测得的电压、电流计算平均电阻值。(测得的电压电流具体数据见下列程序)。 (1)

clear

vr=[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];

ir=[0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345]; L=length(vr); for k=1:L r(k)=vr(k)/ir(k); end % <7> sr=0; % <8> for k=1:L sr=sr+r(k); e nd

rm=sr/L % <12> rm =

30.5247

(2)

clear

vr=[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];

ir=[0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345];

r=vr./ir % <16> rm=mean(r) % <17>

r =

Columns 1 through 8

31.7857 30.0000 30.9000 29.4483 30.6780 29.8837 30.0669 30.8171

Columns 9 through 10 31.4935 30.1739 rm =

30.5247

【例 2.2-2】用间距为0.1的水平线和垂直线均匀分割]5.2,5.2[],5,5[?∈?∈y x 的矩形域,在所有水平线和垂直线交点上计算函数||sin xy z =的值,并图示。 (1)

clear

x=-5:0.1:5; y=(-2.5:0.1:2.5)'; N=length(x); M=length(y); for ii=1:M

for jj=1:N

X0(ii,jj)=x(jj); Y0(ii,jj)=y(ii);

Z0(ii,jj)=sin(abs(x(jj)*y(ii))); end end

(2)

[X,Y]=meshgrid(x,y); Z=sin(abs(X.*Y));

(3)

norm(Z-Z0)

ans = 0

(4)

surf(X,Y,Z) xlabel('x') ylabel('y') shading interp

view([190,70])

图 2.2-1 指定域上的二元函数图形

2.2.3数组特殊运算指令汇总

【例2.2-3】数组元素的“和”、“积”、“累和”、“累积”运算。

clear

rng default

a=[(1:5)',randi(5,[5,3]),randn(5,2)]

cs=cumsum(a)

s=sum(a)

cp=cumprod(a)

p=prod(a)

a =

1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715

2.0000 5.0000 2.0000 5.0000 -0.1241 -1.2075

3.0000 1.0000 3.0000 5.0000 1.4897 0.7172

4.0000

5.0000 5.0000 3.0000 1.4090 1.6302

5.0000 4.0000 5.0000 5.0000 1.4172 0.4889 cs =

1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715 3.0000 10.0000 3.0000 6.0000 -0.3291 -0.5360 6.0000 11.0000 6.0000 11.0000 1.1606 0.1812 10.0000 16.0000 11.0000 14.0000

2.5696 1.8115 15.0000 20.0000 16.0000 19.0000

3.9868 2.3004 s =

15.0000 20.0000 16.0000 19.0000 3.9868 2.3004 cp =

1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715

2.0000 25.0000 2.0000 5.0000 0.0254 -0.8108 6.0000 25.0000 6.0000 25.0000 0.0379 -0.5816 24.0000 125.0000 30.0000 75.0000 0.0534 -0.9481 120.0000 500.0000 150.0000 375.0000 0.0757 -0.4635 p =

120.0000 500.0000 150.0000 375.0000 0.0757 -0.4635【例2.2-4】向量的点击和叉积

(1)

rng(50,'v5normal')

a=randn(1,3),b=randn(1,3),

c=dot(a,b)

d=cross(a,b)

a =

2.3846 -0.2998 0.7914

b =

-1.7490 -1.7062 0.2231

c =

-3.4826

d =

1.2835 -1.9162 -4.5930

(2)

ab=[a;b];

dd(1)=det(ab(:,[2,3]));

dd(2)=-det(ab(:,[1,3]));

dd(3)=det(ab(:,[1,2]));

dd

dd =

1.2835 -1.9162 -4.5930

(3)

plot3([0;a(1)],[0;a(2)],[0;a(3)],'b--','LineWidth',3) hold on

plot3([0;b(1)],[0;b(1)],[0;b(3)],'g-.','LineWidth',3) plot3([0;d(1)],[0;d(2)],[0;d(3)],'r','LineWidth',3) hold off

grid on

box on

view([131,-4])

2.3高维数组

2.3.1高维数组的创建

【例2.3-1】“全下标”元素赋值方式创建高维数组演示。

(1)

A(2,4,2)=1

A(:,:,1) =

0 0 0 0

0 0 0 0

A(:,:,2) =

0 0 0 0

0 0 0 1

(2)

C=ones(2,3);C(:,:,2)=ones(2,3)*2;C(:,:,3)=ones(2,3)*3

C(:,:,1) =

1 1 1

1 1 1

C(:,:,2) =

2 2 2

2 2 2

C(:,:,3) =

3 3 3

3 3 3

(3)

rng(1111)

D=rand(2,4,3)

DS=reshape(D,[2,6,2])

D(:,:,1) =

0.0955 0.3436 0.0020 0.2378

0.9250 0.3105 0.2356 0.7359

D(:,:,2) =

0.4955 0.1265 0.4661 0.4352

0.7844 0.6066 0.2371 0.2437

D(:,:,3) =

0.3838 0.6552 0.6391 0.6109

0.8384 0.1484 0.6374 0.9300

DS(:,:,1) =

0.0955 0.3436 0.0020 0.2378 0.4955 0.1265 0.9250 0.3105 0.2356 0.7359 0.7844 0.6066 DS(:,:,2) =

0.4661 0.4352 0.3838 0.6552 0.6391 0.6109 0.2371 0.2437 0.8384 0.1484 0.6374 0.9300 (4)

E=eye(2,3);

E3=repmat(E,[1,2,2])

E3(:,:,1) =

1 0 0 1 0 0

0 1 0 0 1 0

E3(:,:,2) =

1 0 0 1 0 0

0 1 0 0 1 0

2.3.2高维数组的孤维删除

【例2.3-2】本例演示:squeeze指令对孤维的删除;shiftdim指令的平移,及该指令对平移数组中孤维的删除作用;“空阵”使维度的长度收缩,但维度数目不变。

(1)

A=reshape(1:24,[1,3,4,1,2]);

SA=size(A)

B=squeeze(A)

SA =

1 3 4 1 2

B(:,:,1) =

1 4 7 10

2 5 8 11

3 6 9 12

B(:,:,2) =

13 16 19 22

14 17 20 23

15 18 21 24

(2)

[Am,m]=shiftdim(A)

Am(:,:,1,1) =

1 4 7 10

2 5 8 11

3 6 9 12

Am(:,:,1,2) =

13 16 19 22

14 17 20 23

15 18 21 24

m =

1

(3)

A3=shiftdim(Am,3)

A3(:,:,1) =

1 2 3

13 14 15

A3(:,:,2) =

4 5 6

16 17 18

A3(:,:,3) =

7 8 9

19 20 21

A3(:,:,4) =

10 11 12

22 23 24

(4)

Am(:,:,:,1)=[]

Am =

13 16 19 22

14 17 20 23

15 18 21 24

2.3.3高维数组的维度重排

【例2.3-3】高维数组的维度重排。

(1)

A=reshape(1:24,[2,4,3])

A(:,:,1) =

1 3 5 7

2 4 6 8

A(:,:,2) =

9 11 13 15

10 12 14 16

A(:,:,3) =

17 19 21 23

18 20 22 24

DimOrder=[3,2,1];

B=permute(A,DimOrder)

AA=ipermute(B,DimOrder)

B(:,:,1) =

1 3 5 7

9 11 13 15

17 19 21 23

B(:,:,2) =

2 4 6 8

10 12 14 16

18 20 22 24

AA(:,:,1) =

1 3 5 7

2 4 6 8

AA(:,:,2) =

9 11 13 15

10 12 14 16

AA(:,:,3) =

17 19 21 23

18 20 22 24

(4)多维数组的变形

C=reshape(A,[3,4,2])

C(:,:,1) =

1 4 7 10

2 5 8 11

3 6 9 12

C(:,:,2) =

13 16 19 22

14 17 20 23

15 18 21 24

2.4“非数”和“空”数组2.4.1非数NaN

(1)非数的产生和性质

(2)非数的功用

【例2.4-1】非数的产生和性质演示。

(1)

a=0/0,b=0*log(0),c=inf-inf

a =

NaN

b =

NaN

c =

NaN

(2)

0*a,sin(a)

ans =

NaN

ans =

NaN

(3)

class(a)

isnan(a)

ans =

double

ans =

1

【例2.4-2】非数元素的寻访。

(1)

rng default

R=rand(2,5);R(2,3)=NaN;R(1,5)=NaN

R =

0.8147 0.1270 0.6324 0.2785 NaN

0.9058 0.9134 NaN 0.5469 0.9649

(2)

LR=isnan(R) % <3>

LR =

0 0 0 0 1

0 0 1 0 0

(3)

si=find(LR); % <4>

[ri,ci]=ind2sub(size(R),si); % <5>

disp('非数位置的单下标标识')

disp(['第',int2str(si(1)),'和第',int2str(si(2)),'个元素']) disp(' ')

disp('非数位置的双下标标识')

disp(['第 ',mat2str([ri(1),ci(1)],2),' 元素'])

disp(['第 ',mat2str([ri(2),ci(2)],2),' 元素'])

非数位置的单下标标识

第6和第9个元素

非数位置的双下标标识

第 [2 3] 元素

第 [1 5] 元素

(4)find指令直接找“全下标”

[rj,cj]=find(LR);

disp('非数位置的双下标标识')

disp(['第 ',mat2str([rj(1),cj(1)],2),' 元素'])

disp(['第 ',mat2str([rj(2),cj(2)],2),' 元素'])

非数位置的双下标标识

第 [2 3] 元素

第 [1 5] 元素

2.4.2“空”数组

【例2.4-3】关于“空”数组的算例。

(1)

a=[]

b=ones(2,0),c=zeros(2,0),d=eye(2,0)

f=rand(2,3,0,4)

a =

[]

b =

Empty matrix: 2-by-0

c =

Empty matrix: 2-by-0

d =

Empty matrix: 2-by-0

f =

Empty array: 2-by-3-by-0-by-4

(2)

class(a)

isnumeric(a)

isempty(a)

ans =

double

ans =

1

ans =

1

which a

ndims(a)

size(a)

a is a variable.

ans =

2

ans =

0 0

(3)

A=reshape(-4:5,2,5)

A =

-4 -2 0 2 4

-3 -1 1 3 5

A(:,[2,4])=[]

A =

-4 0 4

-3 1 5

2.5关系操作和逻辑操作

2.5.1关系操作

【例2.5-1】关系运算示例。

A=1:9,B=10-A

r0=(A<4)

r1=(A==B)

A =

1 2 3 4 5 6 7 8 9

B =

9 8 7 6 5 4 3 2 1 r0 =

1 1 1 0 0 0 0 0 0 r1 =

0 0 0 0 1 0 0 0 0 【例2.5-2】关系运算应用。

t=-3*pi:pi/10:3*pi;

y=sin(t)./t;

tt=t+(t==0)*eps; yy=sin(tt)./tt;

subplot(1,2,1),plot(t,y),axis([-9,9,-0.5,1.2]), xlabel('t'),ylabel('y'),title('残缺图形')

subplot(1,2,2),plot(tt,yy),axis([-9,9,-0.5,1.2])

2.5.2 逻辑操作

【例2.5-3】逻辑操作和关系操作。 (1)

A=[-2,-1,0,0,1,2,3] L1=~(A>1) L2=(A>0)&(A<2) A =

-2 -1 0 0 1 2 3 L1 =

1 1 1 1 1 0 0 L

2 =

0 0 0 0 1 0 0

(2)

A,B=[0,-1,1,0,1,-2,-3] C=xor(A,B) A =

-2 -1 0 0 1 2 3 B =

0 -1 1 0 1 -2 -3 C =

1 0 1 0 0 0 0

【例2.5-4】试绘制如图2.5-2最下那幅子图所示的“正弦波t sin 的削顶半波整流波形”,削顶发生在每个周期的]120 ,60[ 之间。

clear,t=linspace(0,3*pi,500);y=sin(t);

z1=((t2*pi)).*y; % <3>

w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);% <4>

wn=~w; % <5> z2=w*sin(pi/3)+wn.*z1; % <6>

subplot(4,1,1),plot(t,y,':r'),axis([0,10,-1.5,1.5])

ylabel('y'),grid on

subplot(4,1,2),plot(t,z1,':r'),axis([0,10,-0.2,1.5]),ylabel('z1') subplot(4,1,3),plot(t,wn,':r'),axis([0,10,-0.2,1.5]),ylabel('wn') subplot(4,1,4),plot(t,z2,'-b'),axis([0,10,-0.2,1.5]),ylabel('z2')

2.5.3常用逻辑函数

matlab2011教程之二数值数组及向量化运算

第 2 章 数值数组及向量化运算本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、 以及MATLAB的数组运算和向量化编程。值得指出:本章内容是读者今后编写各种科学计 算M码的基本构件。 数值数组(Numeric Array)是MATLAB最重要的数据类型数组。在各种维度的数值数 组中,二维数组为最基本、最常用。本章对二维数组创建、标识、寻访、扩充、收缩等方 法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。 本章讲述的逻辑数组主要产生于逻辑运算和关系运算。它是MATLAB 援引寻访数据、 构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。 数组运算是MATLAB区别于其它程序语言的重要特征,是MATLAB绝大多数函数指 令、Simulink许多库模块的本性,是向量化编程的基础。为此,本章专辟第2.2节用于阐述MATLAB的这一重要特征。 在此提醒读者注意:随书光盘mbook目录上保存着本章相应的电子文档“ch02_数值数 组及向量化运算.doc”。该文档中有本章全部算例的可执行指令,以及相应的运算结果。 2.1数值数组的创建和寻访 2.1.1一维数组的创建 1递增/减型一维数组的创建 (1)“冒号”生成法 (2)线性(或对数)定点法 2其他类型一维数组的创建 (1)逐个元素输入法 (2)运用MATLAB函数生成法 【例2.1-1】一维数组的常用创建方法举例。 a1=1:6 a2=0:pi/4:pi a3=1:-0.1:0 a1 = 1 2 3 4 5 6 a2 = 0 0.7854 1.5708 2.3562 3.1416 a3 = Columns 1 through 8 1.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 0.3000 Columns 9 through 11 0.2000 0.1000 0 b1=linspace(0,pi,4) b2=logspace(0,3,4) b1 = 0 1.0472 2.0944 3.1416 b2 =

数值计算方法实验指导(Matlab版)

《数值计算方法》实验指导 (Matlab 版) 肇庆学院数学与统计学学院 计算方法课程组

1. 实验名称 实验1 算法设计原则验证(之相近数相减、大数吃小数和简化计算步骤) 2. 实验题目 有效数字的损失. 123 )与1000个较小的数(3 10 15)的和,验证 大数吃小数的现象. (3)分别用直接法和秦九韶算法计算多项式 P(x) a 0x n a 1x n 1 在x =1.00037 处的值?验证简化计算步骤能减少运算时间. n 1 对于第(3)题中的多项式P (x ),直接逐项计算需要n (n 1) 2 1 次乘法 和n 次加法,使用秦九韶算法 P(x) (((a °x ajx a 2)x a . 则只需要n 次乘法和n 次加法. 3. 实验目的 验证数值算法需遵循的若干规则. 4. 基础理论 设计数值算法时,应避免两个相近的数相减、防止大数吃小数、简化计算步骤减少运算 次数以减少运算时间并降低舍入误差的积累. 两相近的数相减会损失有效数字的个数, 用一 《数值计算方法》实验 1报告 班级: 20xx 级 XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩: ⑴取 z 1016,计算z 1 Z 和 1/(、z 1 Z),验证两个相近的数相减会造成 (2)按不同顺序求一个较大的数( a n 1 X a n

个大数依次加小数,小数会被大数吃掉,乘法运算次数太多会增加运算时间. 5.实验环境 操作系统:Win dows xp ;程序设计语言:Matlab 6.实验过程 (1)直接计算并比较; (2)法1 :大数逐个加1000个小数,法2 :先把1000个小数相加再与大数加; (3)将由高次项到低次项的系数保存到数组A[n]中,其中n为多项式次数. 7.结果与分析 (1)计算的~1V Z = _______________________________ ,1/( ~1 < z) ____________________ . 分析: (2)123逐次加1000个3 10 6的和是_________________________ ,先将1000个3 10 6相 加,再用这个和与123相加得_______________________ . 分析: (3)计算__________ 次的多项式: 直接计算的结果是___________________ ,用时___________________ ; 用秦九韶算法计算的结果是____________________ ,用时 ___________________ 分析:

MATLAB数据及其运算_习题答案

第2章 MATLAB数据及其运算 习题2 一、选择题 1.下列可作为MATLAB合法变量名的是()。D A.合计 B.123 C.@h D.xyz_2a 2.下列数值数据表示中错误的是()。C A.+10 B. C.2e D.2i 3.使用语句t=0:7生成的是()个元素的向量。A A.8 B.7 C.6 D.5 4.执行语句A=[1,2,3;4,5,6]后,A(3)的值是()。B A.1 B.2 C.3 D.4 5.已知a为3×3矩阵,则a(:,end)是指()。D A.所有元素 B.第一行元素 C.第三行元素 D.第三列元素 6.已知a为3×3矩阵,则运行a (1)=[]后()。A A.a变成行向量 B.a变为2行2列 C.a变为3行2列 D.a变为2行3列 7.在命令行窗口输入下列命令后,x的值是()。B >> clear >> x=i*j A.不确定 B.-1 C.1 D.i*j 8.fix(354/100)+mod(354,10)*10的值是()。D A.34 B.354 C.453 D.43 9.下列语句中错误的是()。B A.x==y==3 B.x=y=3 C.x=y==3 D.y=3,x=y 10.find(1:2:20>15)的结果是()。C A.19 20 B.17 19 C.9 10 D.8 9 11.输入字符串时,要用()将字符括起来。C A.[ ] B.{ } C.' ' D." " 12.已知s='显示"hello"',则s的元素个数是()。A A.9 B.11 C.7 D.18

13.eval('sqrt(4)+2')的值是()。B A.sqrt(4)+2 B.4 C.2 D.2, 2 14.有3×4的结构矩阵student,每个结构有name(姓名)、scores(分数)两个成 员,其中scores是以1×5矩阵表示的5门课的成绩,那么要删除第4个学生的第2门课 成绩,应采用的正确命令是()。D A.rmfield(student(1,2).scores(2)) B.rmfield(student(4).scores) C.student(4).scores(2)=0 D.student(1,2).scores(2)=[] 15.有一个2行2列的单元矩阵c,则c(2)是指()。B A.第一行第二列的元素内容 B.第二行第一列的元素内容 C.第一行第二列的元素 D.第二行第一列的元素 二、填空题 1.从键盘直接输入矩阵元素来建立矩阵时,将矩阵的元素用括起来,按矩阵 行的顺序输入各元素,同一行的各元素之间用分隔,不同行的元素之间用 分隔。中括号,逗号或空格,分号 2.设A=[1,2;3,4],B=[5,6;7,8],则A*B= , A.*B= 。 A*B=[19,22;43,50],A.*B=[5,12;21,32] 3.有3×3矩阵,求其第 5个元素的下标的命令是,求其第三行、第三列元 素的序号的命令是。[i,j]=ind2sub([3 3],5),ind=sub2ind([3 3],3,3) 4.下列命令执行后的输出结果是。20 >> ans=5; >> 10; >> ans+10 5.下列命令执行后,new_claim的值是。This is a great example. claim= 'This is a good example.'; new_claim=strrep(claim,'good','great') 三、应用题 1.命令X=[]与clear X有何不同请上机验证结论。 Clear X是将X从工作空间中删除,而X=[]是给X赋空矩阵。空矩阵存在于工作空间 中,只是没有任何元素。 2.在一个MATLAB命令中,6?+?7i和6?+ 7*i有何区别i和I有何区别 3.设A和B是两个同大小的矩阵,试分析A*B和A.*B、A./B和B.\A、A/B和B\A的 区别如果A和B是两个标量数据,结论又如何 4.写出完成下列操作的命令。 (1)将矩阵A第2~5行中第1,3,5列元素赋给矩阵B。 (2)删除矩阵A的第5号元素。

数值分析Matlab作业

数值分析编程作业

2012年12月 第二章 14.考虑梯形电阻电路的设计,电路如下: 电路中的各个电流{i1,i2,…,i8}须满足下列线性方程组: 12 123 234 345 456 567 678 78 22/ 2520 2520 2520 2520 2520 2520 250 i i V R i i i i i i i i i i i i i i i i i i i i -= -+-= -+-= -+-= -+-= -+-= -+-= -+= 这是一个三对角方程组。设V=220V,R=27Ω,运用追赶法,求各段电路的电流量。Matlab程序如下: function chase () %追赶法求梯形电路中各段的电流量 a=input('请输入下主对角线向量a='); b=input('请输入主对角线向量b='); c=input('请输入上主对角线向量c='); d=input('请输入右端向量d='); n=input('请输入系数矩阵维数n='); u(1)=b(1); for i=2:n l(i)=a(i)/u(i-1); u(i)=b(i)-c(i-1)*l(i); end y(1)=d(1); for i=2:n y(i)=d(i)-l(i)*y(i-1); end x(n)=y(n)/u(n); i=n-1; while i>0 x(i)=(y(i)-c(i)*x(i+1))/u(i); i=i-1; end x 输入如下:

请输入下主对角线向量a=[0,-2,-2,-2,-2,-2,-2,-2]; 请输入主对角线向量b=[2,5,5,5,5,5,5,5]; 请输入上主对角线向量c=[-2,-2,-2,-2,-2,-2,-2,0]; 请输入方程组右端向量d=[220/27,0,0,0,0,0,0,0]; 请输入系数矩阵阶数n=8 运行结果如下: x = 8.1478 4.0737 2.0365 1.0175 0.5073 0.2506 0.1194 0.0477 第三章 14.试分别用(1)Jacobi 迭代法;(2)Gauss-Seidel 迭代法解线性方程组 1234510123412191232721735143231211743511512x x x x x ?????? ??????---????????????=--?????? --?????? ??????---?????? 迭代初始向量 (0)(0,0,0,0,0)T x =。 (1)雅可比迭代法程序如下: function jacobi() %Jacobi 迭代法 a=input('请输入系数矩阵a='); b=input('请输入右端向量b='); x0=input('请输入初始向量x0='); n=input('请输入系数矩阵阶数n='); er=input('请输入允许误差er='); N=input('请输入最大迭代次数N='); for i=1:n for j=1:n if i==j d(i,j)=a(i,j); else d(i,j)=0; end end end m=eye(5)-d\a; %迭代矩阵 g=d\b; x=m*x0+g; k=1; while k<=N %进行迭代 for i=1:5 if max(abs(x(i)-x0(i))) >er x=m*x+g; k=k+1;

习题2-数值数组及向量化运算

习题2 1.请读者先运行以下指令 a=0;b=pi; t1=a:pi/9:pi; t2=linspace(a,b,10); T=t1*t2'; F=find(T<0); 然后,请回答变量a、t1、T、F的维度、规模、长度分别是多少? t1完全等于t2吗?为什么? 1)产生数据 a=0;b=pi; t1=a:pi/9:pi; t2=linspace(a,b,10); T=t1*t2'; F=find(T<0); 2)罗列各变量的特征 Na=ndims(a);Nt1=ndims(t1);NT=ndims(T);NF=ndims(F) ; Sa=size(a);St1=size(t1);ST=size(T);SF=size(F); La=length(a);Lt1=length(t1);LT=length(T);LF=lengt h(F); fprintf('数组%7s%8s%8s%8s\n','a','t1','T','F') fprintf('维度数%5d%8d%8d%8d\n',Na,Nt1,NT,NF) fprintf('规模%5d%3d%5d%3d%5d%3d%5d%3d\n',Sa,St1,ST,SF) fprintf('长度%7d%8d%8d%8d\n',La,Lt1,LT,LF) 数组 a t1 T F 维度数2 2 2 2 规模 1 1 1 10 1 1 0 0 长度 1 10 1 0 3)判断数组相等 P=t1==t2 %对不同浮点计算方法获得的数进行比较的本指令,不推荐使用 E=max(abs(t1-t2)) P =

1 1 1 1 1 1 0 1 1 1 E = 4.4409e-16 可见2个数组中的元素不完全相等。应记住:这种现象在数值计算中常常会遇到;并且,若想检验同一个量的不同方法、途径算得的结果,应尽量不用“==”符判断,而应借助“两个量间的(相对)误差水平是否小于某个容差”进行判断。比如 pp=abs(t1-t2)<1e-14 pp = 1 1 1 1 1 1 1 1 1 1 2.对于指令A=reshape(1:18,3,6)产生的数组 A = 1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18 先请你用一条指令,使A数组中取值为2、4、8、16的元素都被重新赋值为NaN。然后,再请你用一条指令,把A数组的第4、5两列元素都被重新赋值为Inf。 1)产生数组A A=reshape(1:18,3,6) A = 1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18 2)利用单序号实现对2、4、8、16的元素的重新赋值 A([2,4,8,16])=NaN %这些位置元素的重赋值不可能采用“全下标”一次性实现 A = 1 NaN 7 10 13 NaN NaN 5 NaN 11 14 17 3 6 9 12 15 18 3)利用全下标和冒号对第4、5列元素进行重赋值 A(:,[4,5])=Inf A = 1 NaN 7 InfInfNaN

数值分析的matlab实现

第2章牛顿插值法实现 参考文献:[1]岑宝俊. 牛顿插值法在凸轮曲线修正设计中的应用[J]. 机械工程师,2009,10:54-55. 求牛顿插值多项式和差商的MA TLAB 主程序: function[A,C,L,wcgs,Cw]=newpoly(X,Y) n=length(X);A=zeros(n,n);A(:,1) =Y'; s=0.0;p=1.0;q=1.0;c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1)); end b=poly(X(j-1));q1=conv(q,b);c1=c1*j;q=q1; end C=A(n,n);b=poly(X(n));q1=conv(q1,b); for k=(n-1):-1:1 C=conv(C,poly(X(k)));d=length(C);C(d)=C(d)+A(k,k); end L(k,:)=poly2sym(C);Q=poly2sym(q1); syms M wcgs=M*Q/c1;Cw=q1/c1; (1)保存名为newpoly.m 的M 文件 (2)输入MA TLAB 程序 >> X=[242,243,249,250]; >> Y=[13.681,13.526,13.098,13.095]; >> [A,C,L,wcgs,Cw]=newpoly(X,Y) 输出3阶牛顿插值多项式L 及其系数向量C 差商的矩阵A ,插值余项wcgs 及其 ) ()()1(ξ+n n f x R 的系数向量Cw 。 A = 13.6810 0 0 0 13.5260 -0.1550 0 0 13.0980 -0.0713 0.0120 0 13.0950 -0.0030 0.0098 -0.0003 C = 1.0e+003 *

实验二 数组及其运算

实验二 数组及其运算 一、实验目的 1.熟练矩阵、数组的创建; 2. 熟悉Matlab 的基本矩阵操作,运算符和字符串处理; 3. 熟悉矩阵的逻辑运算和关系运算; 二、实验设备 1.方正电脑 2.MATLAB 软件 三、实验内容 1.在指令窗中输入:x=1:0.2:2和y=2:-0.2:1,观察所生成的数组。 x = 1.0000 1.2000 1.4000 1.6000 1.8000 2.0000 y = 2.0000 1.8000 1.6000 1.4000 1.2000 1.0000 2.要求在[]π20上产生50个等距采样数据的一维数组,试用两种不同的指令实现。 X=linspace(0,2*pi,50) X=0:(2*pi)/49:(2*pi) 2.设x=-74o ,y=27 o ,22 的值。 x=-74/180*pi; y=27/180*pi; d=sin(x^2+y^2)/(sqrt(tan(abs(x+y)))+pi) d = 0.2273 3. 当a 取-3.0,-2.9,-2.8,…,2.8,2.9,3.0时,求0.3sin(0.3)a e a -+在各点的函 数值。 a=-3.0:0.1:3.0; y=exp(-0.3*a).*sin(a+0.3) Columns 1 through 10

-1.0512 -1.2305 -1.3863 -1.5184 -1.6267 -1.7116 -1.7734 -1.8129 -1.8309 -1.8285 Columns 11 through 20 -1.8069 -1.7675 -1.7117 -1.6411 -1.5572 -1.4617 -1.3564 -1.2428 -1.1228 -0.9978 Columns 21 through 30 -0.8696 -0.7397 -0.6095 -0.4804 -0.3538 -0.2308 -0.1126 0.0000 0.1060 0.2047 Columns 31 through 40 0.2955 0.3779 0.4515 0.5160 0.5714 0.6174 0.6543 0.6821 0.7010 0.7115 Columns 41 through 50 0.7138 0.7085 0.6959 0.6768 0.6516 0.6210 0.5856 0.5460 0.5030 0.4572 Columns 51 through 60 0.4093 0.3597 0.3093 0.2586 0.2080 0.1582 0.1097 0.0628 0.0180 -0.0245 Column 61 -0.0641 4. 已知 ??????=??????=5051 3501 ,05314320B A 求下列表达式的值: (1) A&B ans = 0 0 1 1 1 1 0 0 (2) A|B ans = 1 1 1 1 1 1 1 1 (3) ~A ans = 1 0 0 0 0 0 0 1 (4) A==B

第2讲 matlab的数值分析

第二讲MATLAB的数值分析 2-1矩阵运算与数组运算 矩阵运算和数组运算是MATLAB数值运算的两大类型,矩阵运算是按矩阵的运算规则进行的,而数组运算则是按数组元素逐一进行的。因此,在进行某些运算(如乘、除)时,矩阵运算和数组运算有着较大的差别。在MATLAB中,可以对矩阵进行数组运算,这时是把矩阵视为数组,运算按数组的运算规则。也可以对数组进行矩阵运算,这时是把数组视为矩阵,运算按矩阵的运算规则进行。 1、矩阵加减与数组加减 矩阵加减与数组加减运算效果一致,运算符也相同,可分为两种情况: (1)若参与运算的两矩阵(数组)的维数相同,则加减运算的结果是将两矩阵的对应元素进行加减,如 A=[1 1 1;2 2 2;3 3 3]; B=A; A+B ans= 2 2 2 4 4 4 6 6 6 (2)若参与运算的两矩阵之一为标量(1*1的矩阵),则加减运算的结果是将矩阵(数组)的每一元素与该标量逐一相加减,如 A=[1 1 1;2 2 2;3 3 3]; A+2 ans= 3 3 3 4 4 4 5 5 5 2、矩阵乘与数组乘 (1)矩阵乘 矩阵乘与数组乘有着较大差别,运算结果也完全不同。矩阵乘的运算符为“*”,运算是按矩阵的乘法规则进行,即参与乘运算的两矩阵的内维必须相同。设A、B为参与乘运算的 =A m×k B k×n。因此,参与运两矩阵,C为A和B的矩阵乘的结果,则它们必须满足关系C m ×n 算的两矩阵的顺序不能任意调换,因为A*B和B*A计算结果很可能是完全不一样的。如:A=[1 1 1;2 2 2;3 3 3]; B=A;

A*B ans= 6 6 6 12 12 12 18 18 18 F=ones(1,3); G=ones(3,1); F*G ans 3 G*F ans= 1 1 1 1 1 1 1 1 1 (2)数组乘 数组乘的运算符为“.*”,运算符中的点号不能遗漏,也不能随意加空格符。参加数组乘运算的两数组的大小必须相等(即同维数组)。数组乘的结果是将两同维数组(矩阵)的对应元素逐一相乘,因此,A.*B和B.*A的计算结果是完全相同的,如: A=[1 1 1 1 1;2 2 2 2 2;3 3 3 3 3]; B=A; A.*B ans= 1 1 1 1 1 4 4 4 4 4 9 9 9 9 9 B.*A ans= 1 1 1 1 1 4 4 4 4 4 9 9 9 9 9 由于矩阵运算和数组运算的差异,能进行数组乘运算的两矩阵,不一定能进行矩阵乘运算。如 A=ones(1,3); B=A; A.*B ans= 1 1 1 A*A ???Error using= =>

(完整版)实验2基本数据类型与数组

民族学院实验报告 计算机科学系级班指导教师 报告人20 年月日成绩 课程 名称JAVA语言程序设计 实验名称实验二基本数据类型与数组实验 目的 1.掌握基本数据类型及其相互之间的转换 2.掌握JAVA中数组的使用 实验仪器 和器材 具有JDK环境的计算机一台 实验内容 和要求 一、输出希腊字母表 1.请按模板要求,将【代码】替换为Java程序代码,运行该程序时在命令窗 口中输出希腊字母表。其运行效果如图2.1所示。 图2.1 输出希腊字母表 GreekAlphabet.java public class GreekAlphabet { public static void main(String[] args) { int startPosition=0,endPosition=0; char cStart='α',cEnd='ω'; startPosition=(int)cStart; //cStart做int型数据转换,并将结果赋值给startPosition endPosition=(int)cEnd; //cEnd做int型数据转换,并将结果赋值给EndPosition System.out.println("希腊字母\'α\'在Unicode表中的顺序位置:"+(int)cStart); System.out.println("希腊字母表:"); for (int i=startPosition;i<=endPosition;i++){ char c='\0'; cStart=(char)i; //i做char型转换运算,并将结果赋值给c System.out.print(" "+c); if ((i-startPosition+1)%10==0) System.out.println(); } } } 2.实验后练习 (1)将一个double型数据直接赋值给float型变量,程序编译时提示怎样的 错误? 答:程序提示的内容为:“可能损失精度”。 (2)在应用程序的main方法中增加语句:

数值分析的MATLAB程序

列主元法 function lianzhuyuan(A,b) n=input('请输入n:') %选择阶数A=zeros(n,n); %系数矩阵A b=zeros(n,1); %矩阵b X=zeros(n,1); %解X for i=1:n for j=1:n A(i,j)=(1/(i+j-1)); %生成hilbert矩阵A end b(i,1)=sum(A(i,:)); %生成矩阵b end for i=1:n-1 j=i; top=max(abs(A(i:n,j))); %列主元 k=j; while abs(A(k,j))~=top %列主元所在行 k=k+1; end for z=1:n %交换主元所在行a1=A(i,z); A(i,z)=A(k,z); A(k,z)=a1; end a2=b(i,1); b(i,1)=b(k,1); b(k,1)=a2; for s=i+1:n %消去算法开始m=A(s,j)/A(i,j); %化简为上三角矩阵 A(s,j)=0; for p=i+1:n A(s,p)=A(s,p)-m*A(i,p); end b(s,1)=b(s,1)-m*b(i,1); end end X(n,1)=b(n,1)/A(n,n); %回代开始 for i=n-1:-1:1 s=0; %初始化s for j=i+1:n s=s+A(i,j)*X(j,1);

end X(i,1)=(b(i,1)-s)/A(i,i); end X 欧拉法 clc clear % 欧拉法 p=10; %贝塔的取值 T=10; %t取值的上限 y1=1; %y1的初值 r1=1; %y2的初值 %输入步长h的值 h=input('欧拉法please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0 break end S1=0:T/h; S2=0:T/h; S3=0:T/h; S4=0:T/h; i=1; % 迭代过程 for t=0:h:T Y=(exp(-t)); R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t); y=y1+h*(-y1); y1=y; r=r1+h*(y1-p*r1); r1=r; S1(i)=Y; S2(i)=R; S3(i)=y; S4(i)=r; i=i+1; end t=[0:h:T]; % 红线为解析解,'x'为数值解 plot(t,S1,'r',t,S3,'x')

同济大学数值分析matlab编程题汇编

MATLAB 编程题库 1.下面的数据表近似地满足函数2 1cx b ax y ++=,请适当变换成为线性最小二乘问题,编程求最好的系数c b a ,,,并在同一个图上画出所有数据和函数图像. 625 .0718.0801.0823.0802.0687.0606.0356.0995 .0628.0544.0008.0213.0362.0586.0931.0i i y x ---- 解: x=[-0.931 -0.586 -0.362 -0.213 0.008 0.544 0.628 0.995]'; y=[0.356 0.606 0.687 0.802 0.823 0.801 0.718 0.625]'; A=[x ones(8,1) -x.^2.*y]; z=A\y; a=z(1); b=z(2); c=z(3); xh=-1:0.1:1; yh=(a.*xh+b)./(1+c.*xh.^2); plot(x,y,'r+',xh,yh,'b*')

2.若在Matlab工作目录下已经有如下两个函数文件,写一个割线法程序,求出这两个函数 10 的近似根,并写出调用方式: 精度为10 解: >> edit gexianfa.m function [x iter]=gexianfa(f,x0,x1,tol) iter=0; while(norm(x1-x0)>tol) iter=iter+1; x=x1-feval(f,x1).*(x1-x0)./(feval(f,x1)-feval(f,x0)); x0=x1;x1=x; end >> edit f.m function v=f(x) v=x.*log(x)-1; >> edit g.m function z=g(y) z=y.^5+y-1; >> [x1 iter1]=gexianfa('f',1,3,1e-10) x1 = 1.7632 iter1 = 6 >> [x2 iter2]=gexianfa('g',0,1,1e-10) x2 = 0.7549 iter2 = 8

数值计算方法与Matlab样卷答案

腹有诗书气自华 《数值计算方法与Matlab 》 样卷答案 一.填空题:(每空3分,共42分) 1. 8,6105.0-? 。 2.)(3)1(2)1(1)(3)1(2)1(1)(3)1(3)(3)(2)1(1)(3)(2)1(1)(2)1(2)(3)(2)(1)(3)(2)(1)(1)1(1)1(22)22()1()1(222)1()222(k k k k k k k k k k k k k k k k k k k k k k k k x x x x x x x x x x x x x x x x x x x x x x x x ωωωωωωωωωω ωωωω-+--=---?+=+--+-=---?+=++--=+--?+=+++++++++, )2,1(∈ω。 3.],[1b a C S m -∈。4. 1e 2e ---x ,???==-=?--? ,3,2,1,0;0,e 1d )(e 110k k x x g k x ,正交投影。 5. 2阶,6阶。 6.10.6658,10.9521,10.9501。 7. 4002.2)00.1(=ε,4030.2)01.1(=ε。 二.解下列各题:(每题9分,共36分) 1.解:令)1(2 3+=t x , (2分) 则??-+++=+1123 02 dt )1(25.21)1(49d 1t t x x x ???++++???++-+-≈22)6.01(25.21)6.01(9525.219 8)6.01(25.21)6.01(9549 (8分) 210631.10≈ (9分) 2.解:记系数矩阵为A, 对增广矩阵[]b A |作初等行运算, ??????????--401533933112??????????--==5.55.115 .35.405.75.401125.1,5.11,31,2l l ??????????---=45.114005.75.4011212,3l , 所以13-=x ,2)5.75.1(5.4112=-=x x ,1)1(2 1321=-+-=x x x ,即方程组的解为 [1,2,-1]T . (4分) 故系数矩阵A 的LU 分解为???? ??????--???????????---=4005.75.40112115.1015.1001A 。 (6分)

数值数组及向量化运算

第 3 章 数值数组及向量化运算 MATLAB 的核心内容:数值数组和数组运算 ● 二维数值数组的创建和寻访 ● 数组运算和向量化编程 ● 实现数组运算的基本函数 ● 常用标准数组生成函数和数组构作技法 ● 非数NaN 、“空”数组概念和应用 ● 关系和逻辑操作 3.1 数值计算的特点和地位 符号计算的局限性:有很多问题1)无法解,2)求解时间过长 数值计算:适用范围广,能处理各种复杂的函数关系,计算速度快,容量大。 【例3.1-1】已知t t t f cos )(2=,求dt t f x s x ?= 0 )()(。 (1)符号计算解法 syms t x ft=t^2*cos(t) sx=int(ft,t,0,x) ezplot(sx,0,5) hold on dt=0.05; t=0:dt:5; Ft=t.^2.*cos(t); Sx=dt*cumtrapz (Ft); % 小梯形面积的累加求Ft 曲线下的面积,由一个个宽度为dt 的小梯形面积累加得到的 t(end-4:end) % end 指示最后一个元素的位置 %Sx(end-4:end) %plot(t,Sx,'.k','MarkerSize',12) (2)数值计算解法 dt=0.05; t=0:dt:5; Ft=t.^2.*cos(t); Sx=dt*cumtrapz (Ft); % 小梯形面积的累加求Ft 曲线下的面积,由一个个宽度为dt 的小梯形面积累加得到的 t(end-4:end) % end 指示最后一个元素的位置 Sx(end-4:end) plot(t,Sx,'.k','MarkerSize',12) xlabel('x'),ylabel('Sx'),grid on ans = 4.8000 4.8500 4.9000 4.9500 5.0000 ans = -20.1144 -19.9833 -19.7907 -19.5345 -19.2131 图 3.1-1 在区间[0, 5]采样点上算得的定积分值 【例3.1-2】已知)sin()(t e t f -=,求?=4 0 )()(dt t f x s 。 (1)符号计算解法 syms t x ft=exp(-sin(t)) sx=int(ft,t,0,4) (2)数值计算解法 dt=0.05; t=0:dt:4; Ft=exp(-sin(t));

matlab数值数组及向量化运算

第2章 数值数组及向量化运算 数值数组(Numeric Array )和数组运算(Array Operations )始终是MATLAB 的核心内容。 本章教学内容:数组浮点算法的特点;一、二维数值数组的创建和寻访;常用标准数组生成函数和数组构作技法;数组运算和向量化编程;实现数组运算的基本函数;关系和逻辑操作。 2.1 数值计算的特点和地位 【例2.1-1】已知t t t f cos )(2 =,求dt t f x s x ? = )()(。 (1)符号计算解法 syms t x %定义符号变量 ft=t^2*cos(t) sx=int(ft,t,0,x) ft = t^2*cos(t) sx = x^2*sin(x)-2*sin(x)+2*x*cos(x) (2)数值计算解法 dt=0.05; t=0:dt:5; %取一些离散点 Ft=t.^2.*cos(t); Sx=dt*cumtrapz(Ft); %梯形法求定积分 t(end-4:end) %end 表示最后一个元素 Sx(end-4:end) %Sx 的最后5个元素 plot(t,Sx,'.k','MarkerSize',12) xlabel('x'),ylabel('Sx'),grid on ans = 4.8000 4.8500 4.9000 4.9500 5.0000 ans = -20.1144 -19.9833 -19.7907 -19.5345 -19.2131

图 2.1-1 在区间[0, 5]采样点上算得的定积分值 【例2.1-2】已知 ) sin( )(t e t f- =,求?=4 )( ) (dt t f x s。 本例演示:被积函数没有“封闭解析表达式”,符号计算无法解题!(1)符号计算解法 syms t x ft=exp(-sin(t)) sx=int(ft,t,0,4) ft = exp(-sin(t)) Warning: Explicit integral could not be found. > In sym.int at 58 sx = int(exp(-sin(t)),t = 0 .. 4) (2)数值计算解法 dt=0.05; t=0:dt:4; Ft=exp(-sin(t)); Sx=dt*cumtrapz(Ft); Sx(end) plot(t,Ft,'*r','MarkerSize',4) hold on plot(t,Sx,'.k','MarkerSize',15) hold off xlabel('x') legend('Ft','Sx') ans = 3.0632

数值分析 matlab 实验4

(1) 解题过程如下: (1)MATLAB中创建复化梯形公式和复化辛普森公式的 M 文件:1)复化梯形公式文件: function s=T_fuhua(f,a,b,n) h=(b-a)/n; s=0; for k=1:(n-1) x=a+h*k; s=s+feval(f,x); end s=h*(feval(f,a)+feval(f,b))/2+h*s; 2)复化辛普森公式文件: function s=S_fuhua(f,a,b,n) h=0; h=(b-a)./(2*n); s1=0; https://www.doczj.com/doc/1816188551.html, -5- s2=0; for k=1:n-1 x=a+h*2*k; s1=s1+feval(f,x); end for k=1:n x=a+h*(2*k-1); s2=s2+feval(f,x); end

s=h*(feval(f,a)+feval(f,b)+s1*2+s2*4)/3; 在MATLAB中输入: f=inline('x/(4+x^2)');a=0;b=1; %inline 构造内联函数对象 for n=2:10 s(n-1)=T_fuhua(f,a,b,n);s(n-1)=vpa(s(n-1),10); %调用复化梯形公式,生成任意精度的数值 end exact=int('x/(4+x^2)',0,1);exact=vpa(exact,10) %求出积分的精确值 输出结果:exact = .1115717755 s = Columns 1 through 6 0.1088 0.1104 0.1109 0.1111 0.1113 0.1114 Columns 7 through 9 0.1114 0.1114 0.1115 在MATLAB中输入以下函数用以画出计算误差与 n 之间的曲线: r=abs(exact-s); n=2:10; plot(double(n),double(r(n-1))) 得到结果如图所示: (2)在 MATLAB中输入以下程序代码: f=inline('x/(4+x^2)');a=0;b=1;n=9; %inline 构造内联函数对象 t=T_fuhua(f,a,b,n);t=vpa(t,10) s=S_fuhua(f,a,b,n);s=vpa(s,10)

实验2 数值数组及运算

实验2 数值数组及运算 一、实验目的 (1)掌握一维数组、二维数组、多项式和高维数组的创建 (2)掌握对数组操作的常用函数 二、实验内容 1.使用冒号运算符创建下面各表达式对应的向量。 a) x=linspace(1,10,5); x=1:2.25:10 b) x=linspace(-5,5); x=-5:0.1:5 c) x=logspace(1,3,3); x=10.^[1;3] d) x=logspace(1,3,5); 2.利用MATLAB 内置函数计算下面的值。 a) cosh(5) cosh(5) b) sinh(-2) sinh(-2) c) (e 5+e -5)/2 (exp(5)+exp(-5))/2 d) erf(1.2) ,其中,ηηd e x erf x ?-=02 )((提示:用help 查一下erf 的调用格式) erf(1.2) 3.用linspace 函数创建下面表达式的对应向量 a) x=0:10; x=linspace(0,10,11) b) x=0:0.2:10; x=linspace(0,10,51) c) x=-12:12; x=linspace(-12,12,25) d) x=10:-1:1; x=linspace(10,1,10) 4.给定行向量[]78910=x 和列向量???? ? ???????=4321y ,至少使用两种不同的方法求行向量z 。其中i i i y x z -= x=[10 9 8 7]; y=[1 2 3 4]’; z=x-y ’ 5.在MATLAB 中输入下列矩阵,再求出他们的乘积矩阵C ,并将C 矩阵的右下角的2×3子矩阵赋给D 矩阵。 ??????? ?????????=49819323753175323321A ,????????????++=3498143576255332763441i i B

数值分析实验— MATLAB实现

数值分析实验 ——MATLAB实现 姓名sumnat 学号2013326600000 班级13级应用数学2班 指导老师 2016年1月

一、插值:拉格朗日插值 (1) 1、代码: (1) 2、示例: (1) 二、函数逼近:最佳平方逼近 (2) 1、代码: (2) 2、示例: (2) 三、数值积分:非反常积分的Romberg算法 (3) 1、代码: (3) 2、示例: (4) 四、数值微分:5点法 (5) 1、代码: (5) 2、示例: (6) 五、常微分方程:四阶龙格库塔及Adams加速法 (6) 1、代码:四阶龙格库塔 (6) 2、示例: (7) 3、代码:Adams加速法 (7) 4、示例: (8) 六、方程求根:Aitken 迭代 (8) 1、代码: (8) 2、示例: (9) 七、线性方程组直接法:三角分解 (9) 1、代码: (9) 2、示例: (10) 八、线性方程组迭代法:Jacobi法及G-S法 (11) 1、代码:Jacobi法 (11) 2、示例: (12) 3、代码:G-S法 (12) 4、示例: (12) 九、矩阵的特征值及特征向量:幂法 (13) 1、代码: (13) 2、示例: (13)

一、插值:拉格朗日插值 1、代码: function z=LGIP(x,y)%拉格朗日插值 n=size(x); n=n(2);%计算点的个数 syms a; u=0;%拉格朗日多项式 f=1;%插值基函数 for i=1:n for j=1:n if j==i f=f; else f=f*(a-x(j))/(x(i)-x(j)); end end u=u+y(i)*f;f=1; end z=expand(u);%展开 2、示例: >> x=1:6; y1=x.^5+3*x.^2-6; y2=sin(x)+sqrt(x); >> f1=LGIP(x,y1) f1 = -6+3*a^2+a^5 %可知多项式吻合得很好 >> f2=vpa(LGIP(x,y2),3) f2 = .962e-1*a^4+1.38*a+.300*a^2+.504-.436*a^3-.616e-2*a^5

相关主题
文本预览
相关文档 最新文档