+1=k+h
a+kh
0
888
。oo。。o。。。
e-0018.88888888888e-001
1.77777777786+0001.77777777778+000
2.6666666667e+0002.6666666666667e+000
3.555555555555555e+0003.555555555555555e+000
4,44444459+0004.444444+000
5.333333333333334号+0005.33333333333339+000
62222222222169006.2222222219+000
7.11111111111640007.11111111111116000
8.00000000+000|8.0000000000000
可以看到第二种方式比第一种来得准确。这是因为第一种方式实际上是一个累
加的过程,容易引起误差的累积。 Matlab的命令x=a:h:b或x=a+(0:n)*h都
是用第二种方式实现的。类似的可以看到两个计算方式不一样的例子还可以
有,例如(a.b,m)=(0,1,10)
function ex15
format long e
0
b=8
9
h=(b-a)/n;
x(1)
a
for j=1: n,
x(j+1)=x(j)+h;
y(j+1)=y(1)+j*h
end
[x3,y3,(a;h:b)’,a+(0:n))*h]
6.输入一个方阵A,对A作行列相同的调换,使得A的对角元按绝对值从大到小的
顺序排列。
解:我们可以用如下的方式实现,
Lu, V] sort(-abs(diag(A)))
A(v, v)
其中A是给定的方阵。sor函数返回·个向量的从小到大的排序及其排完序后
的分量在原向量中的位置。我们只需要这个位置就可以对A进行重新排序。
第二行的写法是 Matlab特有的,这种写法意味着我们可以随意但有规律地调
用A的行列生成新的矩阵。当然,我们也可以用简单排序法进行如下操作(虽然
并不推荐大家这么用)
n = size(A, 1);
for i=1: n-1
for j=i+1: n,
f abs (a(i,i))< abs(A(j,j))
A(:,[i,j)=A(:,[j,i)
A([i,j,:)=A([j,i],;);
end
end
end
其中,A矩阵的行列交换仍旧是与其他计算机语言不同的:这里我们不需要临
时变量
7.一个向量x=(x1,x2,,xn)的 Euclide汽数定义为
试写一程序计算,并说明如何避免上溢和有害的卜溢。
解:我们注意到,范数可以递归调用如下
∑
或按照 Mat lab记号
所以只需要讨论两个分量的向量求范数的问题。对于x=(x1,x2),可以先做规
范化,即除以一个常数使按模最大分量为不妨设为我们可以求(1)的
范数再乘以xr1|。(如果该向量非零,则x1非零。)递归调用,并写成如下程序:
function s =nrmv(x)
x abs (x(x=0))
n length(x)
if n==o
elseif n==1
abs (x)
Ise
scale =0;
1
for j =1:n,
if (scale
ssq 1 ssq *(scale/x(j))2
scale =x(j)
e⊥se
ssq= ssq +(x(j)/scale)"2
end
end
s= scale米sqrt(sq
end
事实上,这个程序是山BLAS包中的dnrm2程序改写的,该程序也是 Matlab求
范数的程序的源程序。关于这个软件包的更深入的介绍,可以查阅网
sihttp://www.netllb.org/blas/dnrm2.f
8.写个程序求解·元二次方程ax2+bx+x=0的根,可以选用标准的求根公
式x==b+b2=4c或其变形x=
程序必须以三个系数为
b千√b2-4
C
输入参数,并返回两个根的值。考虑a=0或c=0的情况,并对下列的例子求
解
C
6
10
6e-15410e+154-4e+154
le+5
4|3.9999
-1e155
7e155|1e+155
解:这旦我们要注意三个问题。首先,求根公式中有开根号。类似于前·题,
有可能b2-4αc会产生上流但根式本身并不产生上溢。针对这种情况,我们可
以对方程的系数进行归一化,即把方程的系数都除以同一个数使得按模最大的
数模为1。其次是关于求根的精度的问题。当c=0或其它使得根式和b的值很
靠近的情况,两根中有一根会出现两个相近的数相减的运算,该根的有效数
字就会锐减。此时可以利用另外一个求根公式求得这个根。(或者可以利用韦
达( Vieta)定理。)最后,需要处理a=0或b=0的情形。最终程序如下
function Lx, flag] root2qe(a,b,c)
if nargin==1
a(3);b=a(2);a=a(1);
end
if a=o
Z Solve 2-order equation
M max(abs(la, b, c]); 7 scaling
a/m; b b/M: C C/M
s sign(b)
fs==0
g enc
d
x1=(-b-8*sqrt(b^2-4*a*C))/2/a;
x2=c/(a*x1);
%。 avoid1 arge error
[x1x2]);
flag = two solutions;
elseif b=o
‰。 Solve1- order equation
C/b
flag
one so1 ution’;
elseif c=0,
‰ nonzero constant
[
flag =no x is a solution
lse
‰equa1iy0=0
flag =all x are solutions';
en
d
求得的解如下表:
C
1
6
10
-2000000000000.333333333
6e+15410e+154-4e+154-2.0000000000.33333
0
-1
1
-1e+5
9999990000000010000
399992.0010000000071.99899999993
le155
el0.
1e+155-714005494640260.14005494464026
9.计算如下的递推数列n1=3,x2=1,x+1=2.25k-0.5xk-1这个数列的
通项公式为k=4,是一个严格递减序列。用递推公式计算会出现什么现
象?并说明原因。(提示:考虑递推公式在任何初始值下的通解
解:利用下面的几行 Matlab语句,可以计算出这个数列各项的值
x(1)=1/3;
x(2)=1/12
fork=3:200,
x(k)=2.25米x(k-1)-0.5*x(k-2);
end
这个数列的前60项用命令plot(x(1:60))画成折线图如下(若画出更多的,
如200项,初始的几项变化趋势就看不清楚了。)事实上,对于任意常数c1,C2
通项公式k=c14-k+c2满足递推关系。利用两个初始值可以如下求解常
数c
C14-1+c2
14-2+c2221
7
即求得1=3和2=0.但是,在计算机内部,和工是不能精确地保存的。
换句话讲,我们定义的数列还是x=c14-6+2,只不过a1=(计算机内部
的号而2是一个值非常靠近零的数。当k足够大使得c2不能够被忽略时,我们
就可以观察到,从这个k开始,整个数刎开始递增,因为c2在xk的比重越来越
大,而c14-越来越小。
10.设有64位浮点系统,尾数符号占1位,尾数数值占52位,阶码符号占1位,阶码
尾数占10位。请推算此系统下实数的浮点表示能够有多少位有效数字,用它表
示的数有多大的相对误差界,该系统的上溢界和下溢界是多少?
解:该系统下所有数(除零外)可以写成如下形式:
士2×(0
<2
P∈
其中,Z表示整数集,a1≡1,阶数占10位。设实数x在机器中的浮点表示
为n(xr),其相对误差满足
f(x)2-1-52
15.6
上式表明该系统的实数有15至16位有效数字。该系统所能表示的绝对值最大数
为220-1≈10308,所能表示的绝对值最小的非零的数为2-(20-1)≈10-308。因
此系统的上溢界和下溢界分别为1030和10-308
习题二
1.设有数据表(表29)
SIn a
cos a
0700.64421768720.7648421872
0.710.651833771007583618759
表29
用线性插值找出sin0.705和cos0.702的近似值。
解:先求sin0.705的近似值。用线性插值公式有
Ln(x)=0.-0.70×0.651387709100x×0.642176872
0.76160838x+0.1110918212
将x=0.705代入,即得
sin0.705≈L1(0.705)=0.6480257291
再求cos0.702的近似值。用线性插值公式有
L1()=0×0.758361879+0x=0x×076842172
0.64803113x+1.2184639782
将x=0.702代入,即得
os0702≈L1(0.702)=0.76354612494
2.给定函数的函数表(表2-10)
0.4
0.5
0.6
0.7
sinx0.389420,479430.564640.6422
表2-10
试分别用线性插值与二次插值求sin0.57891的近似值。
解:取节点xo=0.5,x1=0.6,用线性插值公式有
L;(n)=06-0.5×0.56464+0.5-0.6×0.473943
0.8521x+0.05338
将:=0.57891代入,即得
sin0.57891≈1(0.57891)≈0.54667
类似地,在抛物线插值时取节点xo=0.5,r1=0.6,x3=0.7,所得sin0.57891的
近似值为
sin0.57891≈L2(0.57891)
(0.57891-0.6)×(0.57891-0.7)
(0.5-0.6)×(0.5-0.7)
0.47943
057891-0.5)×(0.57891-07
(0.6-0.5)×(0.6-0.7
0.56464
0.578
91-0.5)×(0.57891-0.6)
0.64422
(0.7-0.5)×(0.7-0.6
0.54714.
如果取节点x0=0.4,x1=0.5,x3=0.6,则sin0.57891的近似值为
sin0.57891≈L2(0.57891)
0.57891-0.5)×(0.57891-0.6
0.4-0.5)×(0.4-0.6)
0.38942
0.57891-0.4)×(0.57891-0.6
(0.5-0.4)×(0.5-0.6)
0.47943
0.57891-04)×(0.57891-0.5)
(0.6-0.4)×(0.6-0.5
0.56464
≈0.54707
3.设给定数值表(表21)
x01246
9|23|3
259
表2-11
(1)构造出差商表
(2)用牛顿插值多项式求出f(4.2)的近似值。
解
(1)差商表为
xk|f(xk)一阶差商二阶差商三阶差商四阶差商
223
1.875
10
8
34.5
128
6259