函数的matlab求sin29,同济大学数值计算答案_1.设有数据表(表29) 用线性插值找出sin0.705和cos0.702的近似值。,sin0.57891-讲义文档类资源...

+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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值