文档库 最新最全的文档下载
当前位置:文档库 › chap.2数值计算

chap.2数值计算

chap.2数值计算
chap.2数值计算

第2章MATLAB数值计算

MATLAB的数学计算=数值计算+符号计算

其中符号计算是指使用未定义的符号变量进行运算,而数值计算不允许使用未定义的变量。

2.1 变量和数据

2.1.1数据类型

数据类型包括:数值型、字符串型、元胞型、结构型等

数值型=双精度型、单精度型和整数类

整数类=无符号类(uint8、uint16、uint32、uint64)和符号类整数(int8、int16、int32、int64)。

2.1.2数据

1. 数据的表达方式

?可以用带小数点的形式直接表示

?用科学计数法

?数值的表示范围是10-309~10309。

以下都是合法的数据表示:

-2、5.67、2.56e-56(表示2.56×10-56)、4.68e204(表示4.68×10204)

2. 矩阵和数组的概念

在MATLAB的运算中,经常要使用标量、向量、矩阵和数组,这几个名称的定义如下:?标量:是指1×1的矩阵,即为只含一个数的矩阵。

?向量:是指1×n或n×1的矩阵,即只有一行或者一列的矩阵。

?矩阵:是一个矩形的数组,即二维数组,其中向量和标量都是矩阵的特例,0×0矩阵为空矩阵([])。

?数组:是指n维的数组,为矩阵的延伸,其中矩阵和向量都是数组的特例。

3. 复数

复数由实部和虚部组成,MATLAB用特殊变量“i”和“j”表示虚数的单位。复数运算不需要特殊处理,可以直接进行。

复数可以有几种表示:

z=a+b*i或z=a+b*j

z=a+bi或z=a+bj(当b为标量时)

z=r*exp(i*theta)

●得出一个复数的实部、虚部、幅值和相角。

a=real(z) %计算实部 b=imag(z) %计算虚部 r=abs(z) %计算幅值 theta=angle(z) %计算相角 说明:

复数z 的实部a=r*cos(θ); 复数z 的虚部b=r*sin(θ); 复数z 的幅值22b a r +=;

复数z 的相角theta=arctg(b/a),以弧度为单位。

a=1-2*i

a =

1.0000 -

2.0000i

real(a)

ans = 1

imag(a)

ans = -2

abs(a)

ans =

2.2361

angle(a)*180/pi

%以角度为单位计算相角

ans =

-63.4349

2.1.3变量

1. 变量的命名规则

? 变量名区分字母的大小写。例如,“a”和“A”是不同的变量。

? 变量名不能超过63个字符,第63个字符后的字符被忽略,对于MATLAB6.5版以前的变量名不能超过31个字符。

? 变量名必须以字母开头,变量名的组成可以是任意字母、数字或者下划线,但不能含有空格和标点符号(如,。%等)。例如,“6ABC”、“AB%C”都是不合法的变量名。

? 关键字(如if 、while 等)不能作为变量名。

2. 特殊变量

MATLAB 有一些自己的特殊变量,当MATLAB 启动时驻留在内存。

表2.1 特殊变量表

函数的输入变量数目

在MATLAB中系统将计算的结果自动赋给名为“ans”的变量。

2*pi

ans =

6.2832

2.2 矩阵和数组

MATLAB最基本也是最重要的功能就是进行实数或复数矩阵的运算。

2.2.1矩阵输入

(1) 矩阵元素应用方括号([])括住;

(2) 每行内的元素间用逗号或空格隔开;

(3) 行与行之间用分号或回车键隔开;

(4) 元素可以是数值或表达式。

1. 通过显式元素列表输入矩阵

c=[1 2;3 4;5 3*2] % [ ]表示构成矩阵,分号分隔行,空格分隔元素

c =

1 2

3 4

5 6

用回车键代替分号分隔行:

c=[1 2

3 4

5 6]

1 2

3 4

5 6

2. 通过语句生成矩阵

(1) 使用from:step:to方式生成向量

from:to

from:step:to

说明:

from、step和to分别表示开始值、步长和结束值。

当step省略时则默认为step=1;

当step省略或step>0而from>to时为空矩阵,当step<0而from

【例2.1】使用“from:step:to”方式生成以下矩阵。

x1=2:5

x1 =

2 3 4 5

x2=2:0.5:4

x2 =

2.0000 2.5000

3.0000 3.5000

4.0000

x3=5:-1:2

x3 =

5 4 3 2

x4=2:-1:3 %空矩阵

x4 =

Empty matrix: 1-by-0

x5=2:-1:0.5

x5 =

2 1

x6=[1:2:5;1:3:7] %两行向量构成矩阵

x6 =

1 3 5

1 4 7

(2) 使用linspace和logspace函数生成向量

linspace(a,b,n)

说明:

a、b、n三个参数分别表示开始值、结束值和元素个数。

生成从a到b之间线性分布的n个元素的行向量,n如果省略则默认值为100。

logspace用来生成对数等分向量,它和linspace一样直接给出元素的个数而得出各个元素的值。

logspace (a,b,n)

说明:

a、b、n三个参数分别表示开始值、结束值和数据个数,n如果省略则默认值为50。生成从10a到10b之间按对数等分的n个元素的行向量。

【例2.2】用linspace和logspace函数生成行向量。

x1=linspace(0,2*pi,5) %从0到2*pi等分成5个点

x1 =

0 1.5708 3.1416 4.7124 6.2832

x2=logspace(0,2,3) %从1到100对数等分成3个点

x2 =

1 10 100

3. 由矩阵生成函数产生特殊矩阵

MATLAB提供了很多能够产生特殊矩阵的函数,各函数的功能如表2.2所示。

表2.2 矩阵生成函数

注意:

zeros、ones、rand、randn和eye函数当只有一个参数n时,则为n×n的方阵;

当eye(m,n)函数的m和n参数不相等时则单位矩阵会出现全0行或列。

【例2.3】查看eye函数的功能。

X1=eye(2,3)

X1 =

1 0 0

0 1 0

X2=eye(3,2)

X2 =

1 0

0 1

0 0

4. 通过MAT数据文件加载矩阵

通过“load”命令或选择菜单“File”→“Import Data”命令加载MAT数据文件来创建矩阵。

5. 在M文件中创建矩阵

M文件实际上是一种包含MATLAB代码的文本文件;

通过在MATLAB命令窗口中运行M文件创建矩阵。

2.2.2矩阵元素和操作

矩阵和多维数组都是由多个元素组成的,每个元素通过下标来标识。

1. 矩阵的下标

(1) 全下标方式

矩阵中的元素可以用全下标方式标识,即由行下标和列下标表示,一个m×n的a矩阵的第i行第j列的元素表示为a(i,j)。

注意:

●如果在提取矩阵元素值时,矩阵元素的下标行或列(i,j)大于矩阵的大小(m,n),则

MATLAB会提示出错;

●而在给矩阵元素赋值时,如果行或列(i,j)超出矩阵的大小(m,n),则MATLAB自动

扩充矩阵,扩充部分以0填充。

a=[1 2;3 4;5 6]

a =

1 2

3 4

5 6

a(3,3) %提取a(3,3)的值

??? Index exceeds matrix dimensions.

a(3,3)=9 %给a(3,3) 赋值

a =

1 2 0

3 4 0

5 6 9

(2) 单下标方式

先把矩阵的所有列按先左后右的次序连接成“一维长列”,然后对元素位置进行编号。

以m×n的矩阵a为例,若元素a(i,j)则对应的“单下标”为s= (i-1)×m+j。

2. 子矩阵块的产生

子矩阵是从对应矩阵中取出一部分元素构成,用全下标和单下标方式取子矩阵。

(1) 用全下标方式

矩阵a为图2.2所示,则:

?取行数为1、3,列数为2、3的元素构成子矩阵。

a([1 3],[2 3])

ans =

2 0

6 9

?取行数为1~3,列数为2~3的元素构成子矩阵,“1:3”表示1、2、3行下标。

a(1:3,2:3)

ans =

2 0

4 0

6 9

?取所有行数即为1~3,列数为3的元素构成子矩阵,“:”表示所有行或列。

a(:,3)

ans =

9

?取行数为1~3,列数为3的元素构成子矩阵,用“end”表示某一维数中的最大值,即3。

a(1:3,end)

ans =

9

(2) 用单下标方式

取单下标为1、3、2、6的元素构成子矩阵。

a([1 3;2 6])

ans =

1 5

3 6

(3) 逻辑矩阵

子矩阵也可以利用逻辑矩阵来标识;

逻辑矩阵是大小和对应矩阵相同,而元素值为0或者1的矩阵。

可以用a(L1,L2)来表示子矩阵,其中L1、L2为逻辑向量,当L1、L2的元素为0则不取该位置元素,反之则取该位置的元素。

【例2.5】利用逻辑矩阵来提取矩阵,其中矩阵a如上图2.2所示。

l1=logical([1 0 1]) %给出逻辑向量l1

l1 =

1 0 1

l2=logical([1 1 0]) %给出逻辑向量l2

l2 =

1 1 0

a(l1,l2) %取出1、3行且1、2列的元素

ans =

1 2

5 6

【例2.5续】逻辑矩阵可以由矩阵进行逻辑运算得出。

b=a>1 %得出逻辑向量b

b =

0 1 0

1 1 0

1 1 1

a(b) %按单下标顺序排成长列

ans =

3

5

2

4

6

9

3. 矩阵的赋值

全下标方式:a(i,j)=b,给a矩阵的部分元素赋值则b矩阵的行列数必须等于a矩阵的行列数。

clear a

a(1:2,1:3)=[1 1 1;1 1 1] %给第一、二行元素赋值为全1

a =

1 1 1

1 1 1

?单下标方式:a(s)=b,b为向量,元素个数必须等于a矩阵的元素个数。

a(5:6)=[2 3] %给第5、6元素赋值

a =

1 1 2

1 1 3

?全元素方式:a(:)=b,给a矩阵的所有元素赋值则b矩阵的元素总数必须等于a矩阵的元素总数,但行列数不一定相等。

a=[1 2;3 4;5 6]

a =

1 2

3 4

5 6

b=[1 2 3;4 5 6]

b =

1 2 3

4 5 6

a(:)=b %按单下标方式给a赋值

a =

1 5

4 3

2 6

4. 矩阵元素的删除

删除操作就是简单地将其赋值为空矩阵(用[]表示)。

a=[1 2 0;3 4 0;5 6 9]

a =

1 2 0

3 4 0

5 6 9

a(:,3)=[] %删除一列元素

a =

1 2

3 4

5 6

a(1)=[] %删除一个元素,则矩阵变为行向量

a =

3 5 2

4 6

a=[] %删除所有元素为空矩阵

a =

[]

5. 生成大矩阵

在MATLAB中,可以通过方括号“[]”实现将小矩阵联接起来生成一个较大的矩阵。 a=[1 2 0;3 4 0;5 6 9]

a =

1 2 0

3 4 0

5 6 9

[a;a] %联接成6×3的矩阵

ans =

1 2 0

3 4 0

5 6 9

1 2 0

3 4 0

5 6 9

a=[1 2 0;3 4 0;5 6 9]

[a a] %联接成3×6的矩阵

ans =

1 2 0 1 2 0

3 4 0 3 4 0

5 6 9 5 6 9

a=[1 2 0;3 4 0;5 6 9]

[a(1:2,1:2) 10*a(1:2,2:3)] %计算并联接

ans =

1 2 20 0

3 4 40 0

6. 矩阵的翻转

a =

1 2 0

3 4 0

5 6 9

表2.3 常用矩阵翻转函数

2.2.3字符串

在MATLAB中,字符串是作为字符数组来引入的;

一个字符串由多个字符组成,用单引号(’’)来界定;

字符串是按行向量进行存储的,每一字符(包括空格)是以其ASCII码的形式存放。clear

str1='Hello'

str1 =

Hello

str2='I like ''MATLAB''' %重复单引号来输入含有单引号的字符串

str2 =

I like 'MATLAB'

str3='你好!' %支持中文

str3 =

你好!

1. 字符串占用的字节

whos

Name Size Bytes Class

str1 1x5 10 char array

str2 1x15 30 char array

str3 1x3 6 char array

Grand total is 23 elements using 46 bytes

2. 字符串函数

?length:用来计算字符串的长度(即组成字符的个数)。

?double:用来查看字符串的ASCII码储存内容,包括空格(ASCII码为32)。

?char:用来将ASCII码转换成字符串形式。

?class或ischar:用来判断某一个变量是否为字符串。class函数返回char则表示为字符串,而ischar函数返回1表示为字符串。

?strcmp(x,y):比较字符串x和y的内容是否相同。返回值如果为1则相同,为0则不同。

?findstr(x,x1):寻找在某个长字符串x中的子字符串x1,返回其起始位置。

?deblank(x ):删除字符串尾部的空格。

由于MATLAB将字符串以其相对应的ASCII码储存成一个行向量,因此如果字符串直接进行数值运算,则其结果就变成一般数值向量的运算,而不再是字符串的运算。

length(str1) %字符串长度

ans =

5

x1=double(str1) %查看字符串的ASCII码

x1 =

72 101 108 108 111

x2=str1+1 %字符串的数值运算

x2 =

73 102 109 109 112

char(x1) %将ASCII码转换成字符串形式

ans =

Hello

char(x2)

ans =

Ifmmp

class(str1) %判断变量类型

ans =

char

class(x1)

ans =

double

ischar(str1)

ans =

1

3. 使用一个变量来储存多个字符串

(1) 多个字符串组成一个新的行向量

将多个字符串变量直接用“,”连接,构成一个行向量,就可以得到一个新字符串变量。

clear

str1='Hello';

str2='I like ''MATLAB''';

str3='你好!'

str4=[str1,'! ',str2] %多个字符串并排成一个行向量

str4 =

Hello! I like 'MATLAB'

(2) 使用二维字符数组

将每个字符串放在一行,多个字符串可以构成一个二维字符数组,但必须先在短字符串结尾补上空格符,以确保每个字符串(即每一行)的长度一样。否则MATLAB会提示出错:str5=[str1;str3]

??? Error using ==> vertcat

All rows in the bracketed expression must have the same

number of columns.

str5=[str1;str3,' '] %将str3添加两个空格

str5 =

Hello

你好!

(3) 使用str2mat、strvcat和char函数

使用专门的str2mat、strvcat和char函数可以构造出字符串矩阵,而不必考虑每行的字符数是否相等,总是按最长的设置,不足的末尾用空格补齐。

str6=str2mat(str1,str2,str3)

str6 =

Hello

I like 'MATLAB'

你好!

str7=char(str1,str2,str3)

str7 =

Hello

I like 'MATLAB'

你好!

str8=strvcat(str1,str2)

str8 =

Hello

I like 'MATLAB'

whos

Name Size Bytes Class

str1 1x5 10 char array

str2 1x15 30 char array

str3 1x3 6 char array

str4 1x22 44 char array

str5 2x5 20 char array

str6 3x15 90 char array

str7 3x15 90 char array

str8 2x15 60 char array

Grand total is 186 elements using 350 bytes

5. 执行字符串

如果需要直接“执行”某一字符串,可以使用eval命令,效果就如同直接在MATLAB命令窗口内输入此命令。

str9='a=2*5'

str9 =

a=2*5

eval(str9) %执行字符串

a =

10

6. 显示字符串

字符串可以直接使用disp命令显示出来,即使后面加分号(;)也显示。

disp('请输入2*2的矩阵a')

请输入2*2的矩阵a

disp(str1)

Hello

2.2.4矩阵和数组运算

矩阵运算有明确而严格的数学规则,矩阵运算规则是按照线性代数运算法则定义的;数组运算是按数组的元素逐个进行的。

1. 矩阵运算的函数

a =

1 2 3

4 5 6

7 8 9

表2.4 常用矩阵运算函数

说明:

在上表中det(a)=0或det(a)虽不等于零但数值很小接近于零,则计算inv(a)时,其解的精度比较低,用条件数(求条件数的函数为cond)来表示,条件数越大,解的精度越低,MATLAB会提出警告:“条件数太大,结果可能不准确”。

a=[1 2 3;4 5 6;7 8 9]

a =

1 2 3

4 5 6

7 8 9

inv(a)

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 1.541976e-018.

ans =

1.0e+016 *

-0.4504 0.9007 -0.4504

0.9007 -1.8014 0.9007

-0.4504 0.9007 -0.4504

2. 矩阵和数组的算术运算

(1) 矩阵和数组的加+、减运算-

●A和B矩阵必须大小相同才可以进行加减运算。

●如果A、B中有一个是标量,则该标量与矩阵的每个元素进行运算。

(2) 矩阵和数组的乘法*运算

●矩阵A的列数必须等于矩阵B的行数,除非其中有一个是标量。

●数组的乘法运算符为“.*”,表示数组A和B中的对应元素相乘。A和B数组必须大小相同,除非其中有一个是标量。

x1=[1 2;3 4;5 6];

x2=eye(3,2)

x2 =

1 0

0 1

0 0

x1+x2 %矩阵相加

ans =

2 2

3 5

5 6

x1.*x2 %数组相乘

ans =

1 0

0 4

0 0

x1*x2 %矩阵相乘x1列数不等于x2行数

??? Error using ==> *

Inner matrix dimensions must agree.

x3=eye(2,3)

x3 =

1 0 0

0 1 0

x1*x3 %矩阵相乘

ans =

1 2 0

3 4 0

5 6 0

(3) 矩阵和数组的除法

?矩阵运算符为“\”和“/”分别表示左除和右除。

A\B=A-1*B

A/B=A*B-1。

其中:A-1是矩阵的逆,也可用inv(A)求逆矩阵。

?数组的除法运算表达式

“A.\B”和“A./B”,分别为数组的左除和右除,表示数组相应元素相除。

A和B数组必须大小相同,除非其中有一个是标量。

【例2.12】已知方程组???

??=+-=-+=+-9

x x 4x 55x x 3x 53x x 2x 321

321321,用矩阵除法来解线性方程组。

解:将该方程变换成AX=B 的形式。

其中:

????

?

?????---=114513312A ,????

?

?????=

955B A=[2 -1 3;3 1 -5;4 -1 1]

A =

2 -1

3 3 1 -5

4 -1 1

B=[5;5;9]

B = 5 5 9 X=A\B

X = 2 -1 0

● 在线性方程组A*X=B 中,m×n 阶矩阵A 的行数m 表示方程数,列数n 表示未知数

的个数。

● n=m ,A 为方阵,A\B =inv(A)*B 。

● m > n ,是最小二乘解,X=inv(A’*A)*(A’*B)

● m < ,则是令X 中的n-m 个元素为零的一个特殊解。X=inv(A’*A)*(A’*B) (4) 矩阵和数组的乘方

? 矩阵乘方的运算表达式为“A^B”,其中A 可以是矩阵或标量。 当A 为矩阵,必须为方阵:

B 为正整数时,表示A 矩阵自乘B 次;

B 为负整数时,表示先将矩阵A 求逆,再自乘|B|次,仅对非奇异阵成立; B 为矩阵时不能运算,会出错;

B 为非整数时,将A 分解成A=W*D/W ,D 为对角阵,则有A^B=W*D^B/W 。 当A 为标量:

B 为矩阵时,将A 分解成A=W*D/W ,D 为对角阵,则有A^B=W*diag(D.^B)/W 。 ? 数组乘方的运算表达式“A.^B”。

当A 为矩阵,B 为标量时,则将A(i,j)自乘B 次;

当A 为矩阵,B 为矩阵时,A 和B 数组必须大小相同,则将A(i,j)自乘B(i,j)次; 当A 为标量,B 为矩阵时,将A^ B(i,j)构成新矩阵的第i 行第j 列元素。

【例2.13】矩阵和数组的除法和乘方运算。

x1=[1 2;3 4];

x2=eye(2)

x2 =

1 0

0 1

x1/x2 %矩阵右除

ans =

1 2

3 4

inv(x1) %求逆矩阵

ans =

-2.0000 1.0000

1.5000 -0.5000

x1\x2 %矩阵左除

ans =

-2.0000 1.0000

1.5000 -0.5000

x1./x2 %数组右除

Warning: Divide by zero.

(Type "warning off MATLAB:divideByZero" to suppress this warning.) ans =

1 Inf

Inf 4

x1.\x2 %数组左除

ans =

1.0000 0

0 0.2500

x1^2 %矩阵乘方

ans =

7 10

15 22

x1^-1 %矩阵乘方,指数为-1与inv相同

ans =

-2.0000 1.0000

1.5000 -0.5000

x1^0.2 %矩阵乘方,指数为小数

ans =

0.8397 + 0.3672i 0.2562 - 0.1679i

0.3842 - 0.2519i 1.2239 + 0.1152i

2^x1 %标量乘方

ans =

10.4827 14.1519

21.2278 31.7106

2.^x1 %数组乘方

ans =

2 4

8 16

x1.^x2 %数组乘方

ans =

1 1

1 4

3. 矩阵和数组的转置

?矩阵的转置运算

“A’”表示矩阵A的转置,如果矩阵A为复数矩阵,则为共轭转置。?数组的转置运算

“A.’”表示数组A的转置,如果数组A为复数数组,则不是共轭转置。

【例2.14】矩阵和数组转置运算。

x1=[1 2;3 4];

x2=eye(2);

x3=x1+x2*i

x3 =

1.0000 + 1.0000i

2.0000

3.0000

4.0000 + 1.0000i

x3' %矩阵转置

ans =

1.0000 - 1.0000i 3.0000

2.0000 4.0000 - 1.0000i

x3.' %数组转置为共轭转置

ans =

1.0000 + 1.0000i 3.0000

2.0000 4.0000 + 1.0000i

matlab实现数值计算功能源程序(个人整理)

matlab数值计算功能 1,基础运算 (1)多项式的创建与表达 将多项式(x-6)(x-3)(x-8)表示为系数形式 a=[6 3 8] % 写成根矢量 pa=poly(a)% 求出系数矢量 ppa=poly2sym(pa,'x') % 表示成符号形式 ezplot(ppa,[-50,50]) 求3介方阵A的特征多项式 a=[6 2 4;7 5 6;1 3 6 ]; pa=poly(a)% 写出系数矢量 ppa=poly2sym(pa) %表示成符号形式 ezplot(ppa,[-50,50]) % 绘图 求x^3-6x^2-72x-27的根。 a=[1,-6,-72,-85]; % 写出多项式系数矢量 r=roots(a) % 求多项式的根 (2)多项式的乘除运算 c=conv(a,b) %乘法 [q,r]=deconv(c,a)% 除法 求a(s)=s^2+2s+3乘以b(s)=4s^2+5s+6的乘积 a=[1 2 3] b=[4 5 6] % 写出系数矢量 c=conv(a,b) c=poly2sym(c,'s') % 写成符号形式的多项式 展开(s^2+2s+2)(s+4)(s+1)并验证结果被(s+4),(s+3)除后的结果。c=conv([1,2,2],conv([1,4],[1,1])) cs=poly2sym(c,'s') c=[1 7 16 18 8] [q1,r1]=deconv(c,[1,4]) [q2,r2]=deconv(c,[1,3]) cc=conv(q2,[1,3]) test=((c-r2)==cc)

其他常用的多项式运算命令 pa=polyval(p,s) % 按数组规则计算给定s时多项式的值 pm=polyvalm(p,s)% 按矩阵规则计算给定s时多项式的值 [r,p,k]=residue(b,a) % 部分分式展开,b,a分别是分子,分母多项式系数矢量。r,p,k分别是留数,极点和值项矢量。 p=poly(x,y,n) % 用n介多项式拟合给定的数据 polyder(p) %多项式微分 x=[1 2 3 4 5]; y=[5.5 43.1 128 290.7 498.4]; p=polyfit(x,y,3) x2=1:0.1:5; y2=polyval(p,x2); plot(x,y,'o',x2,y2) 2,线性代数 1,求解方程的根 t=[0 0.3 0.8 1.1 1.6 2.3]'; y=[0.82 0.72 0.63 0.60 0.55 0.50]'; e=[ones(size(t)) exp(-t)] c=e\y t1=[0:0.1:2.5]'; y1=[ones(size(t1)),exp(-t1)]*c; plot(t1,y1,'b',t,y,'ro') 2,逆矩阵及行列式 inv(a) det(a) pinv(a) 3,矩阵分解(略) 4,数据分析 max(x)求x各列的最大元素 mean(x)求x各列的平均值 median(x)找出x各列的中位元素 min(x)求出x各列的最小元素 S=cumsum(x)求x各列元素累计和 sort(x)使x的各列元素按递增排序。 std(x)求x各列的标准差。 sum(x)求x各列元素之和 prod(x)求x各列元素之积

数值计算方法复习题2

习题二 1. 已知,求的二次值多项式。 2. 令求的一次插值多项式,并估计插值误差。 解:;,介于x和0,1决定的区间;,当时。 3. 给出函数的数表,分别用线性插值与二次插值求的近似值,并估计截断误差。0.54667,0.000470;0.54714,0.000029 4. 设,试利用拉格朗日余项定理写出以为节点的三次插值多项式。 5. 已知,求及的值。1,0 6. 根据如下函数值表求四次牛顿插值多项式,并用其计算和的近似值。, 7. 已知函数的如下函数值表,解答下列问题(1)试列出相应的差分表;(2)分别写出牛顿向前插值公式和牛顿向后插值公式。 向后插值公式 8. 下表为概率积分的数据表,试问:1)时,积分2)为何值时,积分?。

9. 利用在各点的数据(取五位有效数字),求方程在0.3和0.4之间的根的近似值。0.3376489 10. 依据表10中数据,求三次埃尔米特插值多项式。 11. 依据数表11 项式。 12. 在上给出的等距节点函数表,用分段线性插值求的近似值,要使截断误差不超过,问函数表的步长h应怎样选取? 13. 将区间分成n等分,求在上的分段三次埃尔米特插值多项式,并估计截断误差。 14、给定的数值表

用线性插值与二次插值计算ln0.54的近似值并估计误差限 解:仍可使用n=1及n=2的Lagrange插值或Newton插值,并应用误差估计。线性插值时,用0.5及0.6两点,用Newton插值 误差限,因,故 二次插值时,用0.5,0.6,0.7三点,作二次Newton插值

误差限,故 15、在-4≤x≤4上给出的等距节点函数表,若用二次插值法求的近 似值,要使误差不超过,函数表的步长h应取多少? 解:用误差估计式,

数值计算方法学习心得

数值计算方法学习心得 ------一个代码的方法是很重要,一个算法的思想也很重要,但 在我看来,更重要的是解决问题的方法,就像爱因斯坦说的内容比 思维本身更重要。 我上去讲的那次其实做了挺充分的准备,程序的运行,pdf文档,算法公式的推导,程序伪代码,不过有一点缺陷的地方,很多细节 没有讲的很清楚吧,下来之后也是更清楚了这个问题。 然后一学期下来,总的来说,看其他同学的分享,我也学习到 许多东西,并非只是代码的方法,更多的是章胜同学的口才,攀忠 的排版,小冯的深入挖掘…都是对我而言比算法更加值得珍惜的东西,又骄傲地回想一下,曾同为一个项目组的我们也更加感到做项 目对自己发展的巨大帮助了。 同时从这些次的实验中我发现以前学到的很多知识都非常有用。 比如说,以前做项目的时候,项目导师一直要求对于要上传的 文件尽量用pdf格式,不管是ppt还是文档,这便算是对产权的一种 保护。 再比如代码分享,最基础的要求便是——其他人拿到你的代码 也能运行出来,其次是代码分享的规范性,像我们可以用轻量级Ubuntu Pastebin,以前做过一小段时间acm,集训队里对于代码的分享都是推荐用这个,像数值计算实验我觉得用这个也差不多了,其 次项目级代码还是推荐github(被微软收购了),它的又是可能更 多在于个人代码平台的搭建,当然像readme文档及必要的一些数据 集放在上面都更方便一些。

然后在实验中,发现debug能力的重要性,对于代码错误点的 正确分析,以及一些与他人交流的“正规”途径,讨论算法可能出 错的地方以及要注意的细节等,比如acm比赛都是以三人为一小组,讨论过后,讲了一遍会发现自己对算法理解更加深刻。 然后学习算法,做项目做算法一般的正常流程是看论文,尽量 看英文文献,一般就是第一手资料,然后根据论文对算法的描述, 就是如同课上的流程一样,对算法进一步理解,然后进行复现,最 后就是尝试自己改进。比如知网查询牛顿法相关论文,会找到大量 可以参考的文献。 最后的最后,想说一下,计算机专业的同学看这个数值分析, 不一定行云流水,但肯定不至于看不懂写不出来,所以我们还是要 提高自己的核心竞争力,就是利用我们的优势,对于这种算法方面 的编程,至少比他们用的更加熟练,至少面对一个问题,我们能思 考出对应问题的最佳算法是哪一个更合适解决问题。 附记: 对课程的一些小建议: 1. debug的能力不容忽视,比如给一个关于代码实现已知错误的代码给同学们,让同学们自己思考一下,然后分享各自的debug方法,一步一步的去修改代码,最后集全班的力量完成代码的debug,这往往更能提升同学们的代码能力。 2. 课堂上的效率其实是有点低的,可能会给学生带来一些负反馈,降低学习热情。 3. 总的来说还是从这门课程中学到许多东西。 数值分析学习心得体会

数值计算方法试题及答案

【 数值计算方法试题一 一、 填空题(每空1分,共17分) 1、如果用二分法求方程043=-+x x 在区间]2,1[内的根精确到三位小数,需对分( )次。 2、迭代格式)2(2 1-+=+k k k x x x α局部收敛的充分条件是α取值在( )。 3、已知?????≤≤+-+-+-≤≤=31)1()1()1(211 0)(2 33x c x b x a x x x x S 是三次样条函数, 则 a =( ), b =( ), c =( )。 4、)(,),(),(10x l x l x l n 是以整数点n x x x ,,,10 为节点的Lagrange 插值基函数,则 ∑== n k k x l 0)(( ), ∑== n k k j k x l x 0 )(( ),当2≥n 时 = ++∑=)()3(20 4x l x x k k n k k ( )。 ; 5、设1326)(2 47+++=x x x x f 和节点,,2,1,0,2/ ==k k x k 则=],,,[10n x x x f 和=?07 f 。 6、5个节点的牛顿-柯特斯求积公式的代数精度为 ,5个节点的求积公式最高代数精度为 。 7、{}∞ =0)(k k x ?是区间]1,0[上权函数x x =)(ρ的最高项系数为1的正交多项式族,其中1)(0=x ?,则?= 1 4)(dx x x ? 。 8、给定方程组?? ?=+-=-2211 21b x ax b ax x ,a 为实数,当a 满足 ,且20<<ω时,SOR 迭代法收敛。 9、解初值问题 00 (,)()y f x y y x y '=?? =?的改进欧拉法 ??? ??++=+=++++)],(),([2),(] 0[111] 0[1n n n n n n n n n n y x f y x f h y y y x hf y y 是 阶方法。

数值计算方法比较

有限差分方法(FDM:Finite Difference Method)是计算机数值模拟最早采用的方法,至今仍被广泛运用。该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。有限差分法以Taylor级数展开等方法,把控制方程中的导数用网格节点上的函数值的差商代替进行离散,从而建立以网格节点上的值为未知数的代数方程组。有限差分法主要集中在依赖于时间的问题(双曲型和抛物型方程)。有限差分法方面的经典文献有Richtmeyer & Morton的《Difference Methods for Initial-Value Problems》;R. LeVeque《Finite Difference Method for Differential Equations》;《Numerical Methods for C onservation Laws》。 注:差分格式: (1)从格式的精度来划分,有一阶格式、二阶格式和高阶格式。 (2)从差分的空间形式来考虑,可分为中心格式和逆风格式。 (3)考虑时间因子的影响,差分格式还可以分为显格式、隐格式、显隐交替格式等。 目前常见的差分格式,主要是上述几种形式的组合,不同的组合构成不同的差分格式。差分方法主要适用于有结构网格,网格的步长一般根据实际地形的情况和柯朗稳定条件来决定。 构造差分的方法: 构造差分的方法有多种形式,目前主要采用的是泰勒级数展开方法。其基本的差分表达式主要有三种形式:一阶向前差分、一阶向后差分、一阶中心差分和二阶中心差分等,其中前两种格式为一阶计算精度,后两种格式为二阶计算精度。通过对时间和空间这几种不同差分格式的组合,可以组合成不同的差分计算格式。 有限差分法的不足:由于采用的是直交网格,因此较难适应区域形状的任意性,而且区分不出场函数在区域中的轻重缓急之差异,缺乏统一有效的处理自然边值条件和内边值条件的方法,难以构造高精度(指收敛阶)差分格式,除非允许差分方程联系更多的节点(这又进一步增加处理边值条件韵困难)。另外它还有编制不出通用程序的困难。 有限差分法的优点:该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念 直观,表达简单,精度可选而且在一个时间步内,对于一个给定点来说其相关的空间点只是 与该相邻的几点,而不是全部的空间点。是发展较早且比较成熟的数值方法 广义差分法(有限体积法)(GDM:Generalized Difference Method):1953年,Mac—Neal 利用积分插值法(也称积分均衡法)建立了三角网格上的差分格 式,这就是以后通称的不规划网格上的差分法.这种方法的几何误差小,特别是给出了处理自然边值条件(及内边值条件)的有效方法,堪称差分法的一大进步。1978年,李荣华利用有限元空间和对偶单元上特征函数的推广——局部Taylor展式的公项,将积分插值法改写成广义Galerkin法形式,从而将不规则网格差分法推广为广义差分法.其基本思路是,将计算区域划分为一系列不重复的控制体积,并使每个网格点周围有

数值分析的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')

《仙境传说》数值计算公式

《仙境传说》数值计算公式 计算公式 STR+1 = Atk +1,Weight +20 INT+1 = Matk +1,SP +?,SP自然回复速度 VIT+1 = Dex +1(物理伤害-0.8),回复道具效力 +1%,HP+? AGI+1= Flee +1,Aspd +? DEX+1 = Hit +1,Atk+0.2,最小物理杀伤力+1,Aspd +? ,+念咒速度,+铁匠锻冶成功率装备弓箭时:DEX+1 = Atk+1 LUK+1 = Critical Hit +0.3,增加铁匠锻冶的成功率 完全回避 = 1 + Luk/10 (%) 基本杀伤力 = (Str + Str数值十位数部分的平方 + Dex / 5 + Luk / 5 ) 空手杀伤力 = (基本杀伤力* 敌人乘算防御 - 敌人减算防御)+ 技能修正 最小杀伤力 = (基本杀伤力 + Dex)* 敌人乘算防御 - 敌人减算防御+ 技能修正 最大杀伤力 = (基本杀伤力 + 武器攻击力 * 体型修正)* 敌人乘算防御 - 敌人减算防御+ 技能修正 会心一击杀伤力 = 基本杀伤力 + 武器攻击力 * 体型修正 + 技能修正 弓箭基本杀伤力 = DEX + DEX数值十位数部分的平方 + STR / 5 + LUK / 5 最小魔法攻击力 = INT + INT/ 7整数部分的平方 最大魔法攻击力 = INT + INT/ 5整数部分的平方 魔法杀伤力 = 魔法攻击力 * 1.15* 敌人魔法乘算防御 - 敌人魔法减算防御 回避力(Flee) = BaseLv + AGI 回避率 = 10 + Flee - 敌人命中力(Hit) + 技能修正 总命中率 = 会心一击率 + ( 1 - 会心一击率 )* 一般命中率

数值分析程序

用N-C积分公式计算sin(x)在区间[0,∏]上的积分值。 #include"stdio.h" #include"math.h" void main() { int n,k; double sum=0.0,a=0.0,b=3.2415926; double Cotes[8][9]={{0.5,0.5},{1.0/6,4.0/6,1.0/6},{1.0/8,3.0/8,3.0/8,1.0/8}, {7.0/90,32.0/90,12.0/90,32.0/90,7.0/90},{19.0/288,75.0/288,50.0/288,50.0/288,75.0/288, 19.0/288}, {41.0/840,216.0/840,27.0/840,272.0/840,27.0/840,216.0/840,41.0/840}, {751.0/17280,3577.0/17280,1323.0/17280,2989.0/17280,2989.0/17280,1323.0/17280,35 77.0/17280,751.0/17280}, {989.0/28350,5888.0/28350,-928.0/28350,10496.0/28350,-4540.0/28350,10496.0/28350, -928.0/28350,5888.0/28350,989.0/28350}}; //printf("请输入积分区间a和b:"); //scanf("%lf,%lf",&a,&b); printf("请输入积分节点n(1<=n<=8):"); scanf("%d",&n); printf("\n"); for(k=0;k<=n;k++) sum+=Cotes[n-1][k]*(sin(a+k*(b-a)/n)); sum=sum*(b-a); printf("%lf\n",sum); printf("误差值为:%lf\n",2.0-sum); }

数值分析实验报告总结

数值分析实验报告总结 随着电子计算机的普及与发展,科学计算已成为现代科 学的重要组成部分,因而数值计算方法的内容也愈来愈广泛和丰富。通过本学期的学习,主要掌握了一些数值方法的基本原理、具体算法,并通过编程在计算机上来实现这些算法。 算法算法是指由基本算术运算及运算顺序的规定构成的完 整的解题步骤。算法可以使用框图、算法语言、数学语言、自然语言来进行描述。具有的特征:正确性、有穷性、适用范围广、运算工作量少、使用资源少、逻辑结构简单、便于实现、计算结果可靠。 误差 计算机的计算结果通常是近似的,因此算法必有误差, 并且应能估计误差。误差是指近似值与真正值之差。绝对误差是指近似值与真正值之差或差的绝对值;相对误差:是指近似值与真正值之比或比的绝对值。误差来源见表 第三章泛函分析泛函分析概要 泛函分析是研究“函数的函数”、函数空间和它们之间 变换的一门较新的数学分支,隶属分析数学。它以各种学科

如果 a 是相容范数,且任何满足 为具体背景,在集合的基础上,把客观世界中的研究对象抽 范数 范数,是具有“长度”概念的函数。在线性代数、泛函 分析及相关的数学领域,泛函是一个函数,其为矢量空间内 的所有矢量赋予非零的正长度或大小。这里以 Cn 空间为例, Rn 空间类似。最常用的范数就是 P-范数。那么 当P 取1, 2 ,s 的时候分别是以下几种最简单的情形: 其中2-范数就是通常意义下的距离。 对于这些范数有以下不等式: 1 < n1/2 另外,若p 和q 是赫德尔共轭指标,即 1/p+1/q=1 么有赫德尔不等式: II = ||xH*y| 当p=q=2时就是柯西-许瓦兹不等式 般来讲矩阵范数除了正定性,齐次性和三角不等式之 矩阵范数通常也称为相容范数。 象为元素和空间。女口:距离空间,赋范线性空间, 内积空间。 1-范数: 1= x1 + x2 +?+ xn 2-范数: x 2=1/2 8 -范数: 8 =max oo ,那 外,还规定其必须满足相容性: 所以

期末考试数值计算方法15道程序题详解

//用辛普森公式计算p199页的例题-7 #include#includedouble f(double x) {return pow(x,0.5);} void main() { double x0,x1, m;x0=0.5;x1=1.0; printf("利用辛普森公式计算的结果为:"); printf("\n"); m=((x1-x0)*(f(x0)+f(x1)+4*f((x0+x1)/2)))/6; printf("%lf",m);printf("\n"); } /用牛顿迭代法求x等于e的-x次方在.5附近的根。#include"stdio.h"#include"math.h" #define E 2.71828182#define fn(x) x*pow(E,x)-1#define fn_(x)pow(E,x)+x*pow(E,x )#define N 10#define F 1e-8 void main() {double x0=0;double x_=0;double x = 0; double tempx=0;int k=1; printf("键入x0的初值:\nx0="); scanf("%lf",&x0);while(1) {x_=fn_(x0);//导数x =fn(x0);//函数值 if(x_ == 0) { printf("newton iteration fail!");break;}else{tempx=x0- ( x/x_ ); if( fabs(x0-tempx) < F){printf("newton iteration success!\nx=%.8lf\n\n",tempx); break;}else{if(k == N){printf("newton iteration fail!");break;}else{k++; x0=tempx;}}}}} //牛顿插入法#include#define N 6 #define M 4 double x[N]={0.4,0.55,0.65,0.8,0.9,1.05}; Double y[N]={0.41075,0.57815,0.69675,0.88811 ,1.02652,1.25382};double _w(int k,int i,int j){double sum=1;int ii=i;while(ii<=j){ if(k!=ii)sum*=(x[k]-x[ii]);ii++;} return sum;}double D_value(int i,int j) {double sum=0;int k=i;while(k<=j){ sum+=y[k]/_w(k,i,j);k++;}return sum;} double _Poly(double x0,int n){ double sum=1;int i=0;while(i<=n){ sum*=(x0-x[i]);i++;}return sum;} double Polynomial(double x0,int n) {if(n==0)return y[0];else return Polynomial(x0,n-1)+D_value(0,n)*_Poly(x0,n-1);}void main(){double x0,y0;printf("x0="); scanf("%lf",&x0);getchar();y0=Polynomial(x0 ,M);printf("y=%lf\n",y0);} //拉格朗日差值法,三次差值 #includedouble L0(double x0,double x1,double x2,double x){return ((x-x1)*(x-x2))/((x0-x1)*(x0-x2));} double L1(double x0,double x1,double x2,double x){return ((x-x0)*(x-x2))/((x1-x0)*(x1-x2));} double L2(double x0,double x1,double x2,double x){return ((x-x0)*(x-x1))/((x2-x0)*(x2-x1));} void main(){ double x=0,x0=0,x1=0,x2=0;double y0=0,y1=0,y2=0;printf("输入各项x的 值:\n");scanf("%lf,%lf,%lf",&x0,&x1,&x2); printf("输入各项y的值:\n"); scanf("%lf,%lf,%lf",&y0,&y1,&y2);getchar(); printf("输入x的值:\n");scanf("%lf",&x); getchar();printf("结果 为:%lf\n",L0(x0,x1,x2,x)*y0+L1(x0,x1,x2,x)* y1+L2(x0,x1,x2,x)*y2); } //高斯消去法#include#define size 3 double a[size][size+2];void guass() {int i,j;int n;for(n=1;n#include

数值计算方法试题及答案

数值计算方法试题一 一、填空题(每空1分,共17分) 1、如果用二分法求方程在区间内的根精确到三位小数,需对分()次。 2、迭代格式局部收敛的充分条件是取值在()。 3、已知是三次样条函数,则 =( ),=(),=()。 4、是以整数点为节点的Lagrange插值基函数,则 ( ),( ),当时( )。 5、设和节点则 和。 6、5个节点的牛顿-柯特斯求积公式的代数精度为,5个节点的求积公式最高代数精度为。 7、是区间上权函数的最高项系数为1的正交多项式族,其中,则。 8、给定方程组,为实数,当满足,且时,SOR迭代法收敛。 9、解初值问题的改进欧拉法是 阶方法。 10、设,当()时,必有分解式,其中为下三角阵,当其对角线元素满足()条件时,这种分解是唯一的。 二、二、选择题(每题2分) 1、解方程组的简单迭代格式收敛的充要条件是()。(1), (2) , (3) , (4) 2、在牛顿-柯特斯求积公式:中,当系数是负值时,公式的稳定性不能保证,所以实际应用中,当()时的牛顿-柯特斯求积公式不使用。 (1),(2),(3),(4), (1)二次;(2)三次;(3)四次;(4)五次 4、若用二阶中点公式求解初值问题,试问为保证该公式绝对稳定,步长的取值范围为()。 (1), (2), (3), (4)

三、1、 2、(15 (1)(1) 试用余项估计其误差。 (2)用的复化梯形公式(或复化 Simpson公式)计算出该积分的近似值。 四、1、(15分)方程在附近有根,把方程写成三种不同的等价形式(1)对应迭代格式;(2)对应迭代格式;(3)对应迭代格式。判断迭代格式在的收敛性,选一种收敛格式计算附近的根,精确到小数点后第三位。选一种迭代格式建立Steffensen迭代法,并进行计算与前一种结果比较,说明是否有加速效果。 2、(8分)已知方程组,其中 , (1)(1)列出Jacobi迭代法和Gauss-Seidel迭代法的分量形式。 (2)(2)求出Jacobi迭代矩阵的谱半径,写出SOR 迭代法。 五、1、(15分)取步长,求解初值问题用改进的欧拉法求的值;用经典的四阶龙格—库塔法求的值。 2、(8分)求一次数不高于4次的多项式使它满足 ,,,, 六、(下列2题任选一题,4分) 1、1、数值积分公式形如 (1)(1)试确定参数使公式代数精度尽量高;(2)设,推导余项公式,并估计误差。 2、2、用二步法 求解常微分方程的初值问题时,如何选择参数使方法阶数尽可能高,并求局部截断误差主项,此时该方法是几阶的。 数值计算方法试题二 一、判断题:(共16分,每小题2分) 1、若是阶非奇异阵,则必存在单位下三角阵和上三角阵,使唯一成立。()

数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序

数值分析第五次程序作业 PB09001057 孙琪 【问题】 分别编写用复化Simpson积分公式和复化梯形积分公式计算积分的通用程序;用如上程序计算积分: 取节点并分析误差; 简单分析你得到的数据。 【复化Simpson积分公式】 Simpson法则: 使用偶数个子区间上的复合Simpson法则: 设n是偶数, 则有 将Simpson法则应用于每一个区间,得到复合Simpson法则:

公式的误差项为: 其中δ 【复化梯形积分公式】 梯形法则:对两个节点相应的积分法则称为梯形法则: 如果划分区间[a,b]为: 那么在每个区间上可应用梯形法则,此时节点未必是等距的,由此得到复合梯形法则: 对等间距h=(b-a)/n及节点,复合梯形法则具有形式: 误差项为:

【算法分析】 复合Simpson法则和复合梯形法则的算法上述描述中都已介绍了,在此不多做叙述。 【实验】 通过Mathematica编写程序得到如下结果: 利用复化Simpson积分公式得:

可以看出,当节点数选取越来越多时,误差项越来越小,这从复合的Simpson公式很好看出来,因为在每一段小区间内,都是用Simpson法则去逼近,而每一段的误差都是由函数在该区间内4阶导数值和区间长度的4次方乘积决定的,当每一段小区间越来越小时,相应的每一段小区间内的逼近就会越来越好,从而整体的逼近效果就会越来越好。 利用复化梯形积分公式得:

可以看出,当节点数选取越来越多时,误差项越来越小,这从复合的梯形公式很好看出来,因为在每一段小区间内,都是用梯形法则去逼近,而每一段的误差都是由函数在该区间内2阶导数值和区间长度的2次方乘积决定的,当每一段小区间越来越小时,相应的每一段小区间内的逼近就会越来越好,从而整体的逼近效果就会越来越好。 【分析】 通过对上述两种法则的效果来看,复合Simpson法则的误差要比复合梯形法则收敛到0更快,说明复合Simpson法则逼近到原来的解更快,这主要是因为在每一段小区间内,复合Simpson法则利用得是Simpson法则,复合梯形法则利用得是梯形法则,前者的误差项要比后者的误差项小很多,因此造成了逼近速度的不一样。

数值计算方法总结计划复习总结提纲.docx

数值计算方法复习提纲 第一章数值计算中的误差分析 1 2.了解误差 ( 绝对误差、相对误差 ) 3.掌握算法及其稳定性,设计算法遵循的原则。 1、误差的来源 模型误差 观测误差 截断误差 舍入误差 2误差与有效数字 绝对误差E(x)=x-x * 绝对误差限x*x x* 相对误差E r (x) ( x x* ) / x ( x x* ) / x* 有效数字 x*0.a1 a2 ....a n10 m 若x x*110m n ,称x*有n位有效数字。 2 有效数字与误差关系 ( 1)m 一定时,有效数字n 越多,绝对误差限越小; ( 2)x*有 n 位有效数字,则相对误差限为E r (x)1 10 (n 1)。 2a1 选择算法应遵循的原则 1、选用数值稳定的算法,控制误差传播; 例 I n 11n x dx e x e I 0 1 1 I n1nI n1 e △ x n n! △x0 2、简化计算步骤,减少运算次数; 3、避免两个相近数相减,和接近零的数作分母;避免

第二章线性方程组的数值解法 1.了解 Gauss 消元法、主元消元法基本思想及算法; 2.掌握矩阵的三角分解,并利用三角分解求解方程组; (Doolittle 分解; Crout分解; Cholesky分解;追赶法) 3.掌握迭代法的基本思想,Jacobi 迭代法与 Gauss-Seidel 4.掌握向量与矩阵的范数及其性质, 迭代法的收敛性及其判定。 本章主要解决线性方程组求解问题,假设n 行 n 列线性方程组有唯一解,如何得到其解? a 11x 1 a 12 x 2... a 1n x n b1 a 21x 1 a 22 x 2... a 2n x n b2 ... a n1x 1 a n 2 x 2... a nn x n b n 两类方法,第一是直接解法,得到其精确解; 第二是迭代解法,得到其近似解。 一、Gauss消去法 1、顺序G auss 消去法 记方程组为: a11(1) x1a12(1) x2... a1(1n) x n b1(1) a21(1) x1a22(1) x2... a2(1n) x n b2(1) ... a n(11) x1a n(12) x2... a nn(1) x n b n(1) 消元过程: 经n-1步消元,化为上三角方程组 a11(1) x1b1(1) a 21(2) x1a22(2 ) x2b2( 2 ) ... a n(1n) x1a n(n2) x2...a nn(n ) x n b n( n ) 第k步 若a kk(k)0 ( k 1)( k) a ik(k )(k )( k 1)( k )a ik(k )( k) a ij a ij a kk(k ) a kj b i b i a kk(k )b k k 1,...n 1 i, j k 1,....,n 回代过程:

数值计算常用公式

第一章 误差 由观测产生的误会差,称为观测误差或参量误差. 由数值计算方法所得到的近似解与实际问题准确解之间出现的这种误差,称为截断误差或方法误差。 x *为准确值的一个近似值,则绝对误差: e *(x)= x-x * 绝对误差限:∣e * (x)∣=∣x-x * ∣≤ε * (在知道x 准确值的条件下)相对误差:=x x x x x e * -= )(* = * * * * )(x x x x x e -= 相对误差限:* * * * * * )()(r r x x x x x e x e ε≤-= = 误差传播规律:) ()()()()(2 * *2 1 * *1 * x e x f x e x f y e ??+??≈ * )()(* * y y e y e r = (看会第七页例题) 有效数字与有效数字位数: 例一:对于x=π=3.14159…,若取近似值=3.14,则绝对误差 ∣ ) (* x e ∣=0.00159…≤01.02 1?,即百分位数字4的半个单位(指 01 .02 1?)是* x 的绝对误差限,故从* x 最左边的非零数“3”开始 到百分位数字“4”的三个数都是有效数字,近似值* x 具有三位有效数字。

例二:求 2 *10 49-?=x 的有效数字? 有两位有效数字 ,即位有效数字,则有设的绝对误差限为,而可写为解:* * 2 * *x 2m 2 m 0m x 10 5.0x 1049.0x =-=-??- 第二章 非线性方程求根 二分法:[]b a x ,∈,2 b a x += 分成两半,检查0)()(0

(整理)数值分析计算方法超级总结

工程硕士《数值分析》总复习题(2011年用) [由教材中的习题、例题和历届考试题选编而成,供教师讲解和学生复习用] 一. 解答下列问题: 1)下列所取近似值有多少位有效数字( 注意根据什么? ): a) 对 e = 2.718281828459045…,取* x = 2.71828 b) 数学家祖冲之取 113355 作为π的近似值. c) 经过四舍五入得出的近似值12345,-0.001, 90.55000, 它们的有效 数字位数分别为 位, 位, 位。 2) 简述下名词: a) 截断误差 (不超过60字) b) 舍入误差 (不超过60字) c) 算法数值稳定性 (不超过60字) 3) 试推导( 按定义或利用近似公式 ): 计算3 x 时的相对误差约等于x 的相对 误差的3倍。 4) 计算球体积3 34r V π= 时,为使其相对误差不超过 0.3% ,求半径r 的相对 误差的允许范围。 5) 计算下式 341 8 )1(3)1(7)1(5)1(22345+-+---+---=x x x x x x P )( 时,为了减少乘除法次数, 通常采用什么算法? 将算式加工成什么形式? 6) 递推公式 ?????=-==- ,2,1,1102 10n y y y n n 如果取 * 041.12y y =≈= ( 三位有效数字 ) 作近似计算, 问计算到 10y 时误差为初始误差的多少倍? 这个计算过程数值稳定吗 ? 二. 插值问题: 1) 设函数 )(x f 在五个互异节点 54321,,,,x x x x x 上对应的函数值为 54321,,,,f f f f f ,根据定理,必存在唯一的次数 (A ) 的插值多项式 )(x P ,满足插值条件 ( B ) . 对此,为了构造Lagrange 插值多项式 )(x L ,由5个节点作 ( C ) 个、次数均为 ( D ) 次的插值基函数

数值分析重点公式

第一章 非线性方程和方程组的数值解法 1)二分法的基本原理,误差:~ 1 2 k b a x α+--< 2)迭代法收敛阶:1lim 0i p i i c εε+→∞ =≠,若1p =则要求01c << 3)单点迭代收敛定理: 定理一:若当[],x a b ∈时,[](),x a b ?∈且' ()1x l ?≤<,[],x a b ?∈,则迭代格式收敛 于唯一的根; 定理二:设()x ?满足:①[],x a b ∈时,[](),x a b ?∈, ②[]121212,,, ()(),01x x a b x x l x x l ???∈-≤-<<有 则对任意初值[]0,x a b ∈迭代收敛,且: 110 1 11i i i i i x x x l l x x x l αα+-≤ ---≤-- 定理三:设()x ?在α的邻域内具有连续的一阶导数,且'()1?α<,则迭代格式具有局部收敛性; 定理四:假设()x ?在根α的邻域内充分可导,则迭代格式1()i i x x ?+=是P 阶收敛的 () ()()0,1,,1,()0j P j P ? α?α==-≠ (Taylor 展开证明) 4)Newton 迭代法:1'() () i i i i f x x x f x +=-,平方收敛 5)Newton 迭代法收敛定理: 设()f x 在有根区间[],a b 上有二阶导数,且满足: ①:()()0f a f b <; ②:[]' ()0,,f x x a b ≠∈; ③:[]'' ,,f x a b ∈不变号 ④:初值[]0,x a b ∈使得'' ()()0f x f x <; 则Newton 迭代法收敛于根α。

数值分析 算法C语言程序

一、拉格朗日插值 #include #include #include void Lagrange(float s) { double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},f,L=0; int i,j; for (i=0;i<5;i++) { f=1; for (j=0;j<5;j++) if(j!=i) f=(s-x[j])/(x[i]-x[j])*f; L+=f*y[i]; } printf("输出:%f\n",L); } void main() { float x; printf("输入插值点:"); scanf("%f",&x); Lagrange(x); } 二、牛顿插值 #include #include #include int ND(float s) { double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},p=0,g,f; int i,j,k; for (i=0;i<5;i++) { for (j=4;j>i;j--) { f=x[j]-x[j-i-1];y[j]=(y[j]-y[j-1])/f;} g=y[i+1]; for (k=0;k<=i;k++) g=g*(s-x[k]); p=p+g; } printf("输出插值点函数值:%f\n",p+y[0]); return 1; }

相关文档