江苏工业学院2007~2008学年第 2 学期硕士生考试试题解答一、(10分)举例说明如何在数值计算过程中防止相近数相减及避免“大数吃小数”。
答:1)防止相近数相减举例:当x 充分大时,即1x >>时,计算会出现相近数相减, 可以用下述数学上等价的表达式来计算,以避免相近数相减。
………… 5 分2) 避免“大数吃小数”举例:设,1:1000,i i δ=为区间[0, 0.5]上的随机数,在字长为5的计算机上计算12100012345S δδδ=++++时,如果采用上述给定的顺序计算S ,则会出现大数吃小数的现象;要避免大数吃小数,这里可以采用表达式:212100012345S δδδ=++++规定的顺序来计算即可。
………… 5 分注:学生的举例只要符合要求均可以算对。
二、(15分)(1)叙述Newton 插值方法的方法思想;(2) 设(1)0,(2)1,(3)3,(4)5f f f f ====, 试求)(x f 的三次Newton 插值多项式; (3) 利用上述插值公式近似计算(2.3)f . 解:(1) 牛顿插值方法是通过构造如下形式的多项式01020101()()()()()()n n n N x a a x x a x x x x a x x x x -=+-+--++--其中,0,1,2,,i a i n =通过Newton 差商公式得到,且仅与0,1,,,i x x x 有关,由此可以保证在增加节点时, 原先的计算量能够被充分利用。
………… 6 分(2) 根据列表函数可得差商表如下:0 0 0 0 1.0000 1.0000 0 0 3.0000 2.0000 0.5000 0 5.0000 2.0000 0 -0.1667 )(x f 的三次Newton 插值多项式为:3()(1)0.5(1)(2)0.1667(1)(2)(3)N x x x x x x x =-+------………… 6 分(3) 3(2.3)(2.3) 1.5405f N ≈≈………… 3 分三、(15分)(1)简要叙述求非线性方程()0f x =根的迭代法的方法思想。
(2)选用适当的迭代方法求方程32210x x x ---=在0 2.5x =附近的一个根, 精度为310-。
解:(1)求非线性方程()0f x =根的迭代法的方法思想: 将方程()0f x =改写成()x x ϕ=由给定的初始近似解0x ,给出如下迭代公式1()k k x x ϕ+=,0,1,2,k =,如果上述迭代序列{}k x 收敛,即lim *k k x x →∞=则*x 为方程()0f x =的根。
………… 7 分(2)将方程32210x x x ---=改写成3212x x x =++由此可得到相应的迭代公式1k x +=由于上述迭代公式的迭代函数在0 2.5x =处的导数的绝对值小于1,因此上述迭代公式在0 2.5x =附近具有局部收敛性。
………… 4 分通过上述迭代可以得到上述方程根的数值近似计算结果如下:………… 4 分四、(10分)叙述确定二次函数2拟合下述列表函数的步骤220(,,)(())ni i i i a b c ax bx c f x ϕ==++-∑………… 5 分第二步,令000a b cϕϕϕ∂=∂∂=∂∂=∂ 上述方程是关于所求参数,,a b c 的线性方程组。
第三步,解上述方程组可得所求参数,,a b c ,由此可得到用二次函数拟合上述列表函数的最小二乘解。
………… 5 分五、(15分)叙述复化Simpson 积分公式n S 计算()b af x dx ⎰的方法思想,并用复化Simpson公式n S 计算积分320cos I x dx π=⎰,其中3n ≥。
解:方法思想:由截断误差可知, 当区间长度b -a 较大时, 梯形求积公式的误差较大. 为此,利用积分关于区间具有可加性, 将[a ,b]区间上的积分, 分成若干小区间上的积分, 以此来减少积分区间长度引起的误差. 这就引入了复合求积公式. 具体如下: 设分点,()/i x a ih h b a n =+=-将区间[a ,b]分成n 等分,则11()()ii nbx ax i f x dx f x dx -==∑⎰⎰将每个小区间上的积分都用Simpson 公式给出,则得计算定积分的复化Simpson 公式如下:11/21()[()4()()]6nb i i i n ai hf x dx f x f x f x S --=≈++=∑⎰………… 7 分利用上述公式,取3n =时,可得如下计算结果:s = 0.7023………… 8 分六、(15分)说明求解微分方程初值问题的Runge-kutta 方法的方法思想,并选用适当的方法解微分方程初值问题3sin ,00.4(0)1y x y x x y '=-≤≤⎧⎨=⎩的数值解, 取步长0.2h =. 解:对于方程000(,),()n y f x y x x x y x y '=≤≤⎧⎨=⎩龙格-库塔(Runge -Kutta )方法利用微分中值:111()()'()()(,())()i i i i i i y x y x y x x f y x x ξξξ+++-=-=-其中1(,)i i x x ξ+∈. 由于ξ未知, 从而(,())f y ξξ未知, 故我们不能直接应用上述公式解微分方程. 在实际计算时, 我们只好寻找(,())f y ξξ的适当近似, 并由此得到相应的算法. 例如: 若用(,())i i f x y x 近似(,())f y ξξ就可以得到Euler 公式; 更一般地, 我们可以考虑用区间1[,]i i x x +上某几个点处(,())f x y x 的值的加权平均作为(,())f y ξξ的近似, 并满足一定误差要求,由此给出相应的公式: 这就是Runge-Kutta(龙格-库塔)算法的思想.………… 7 分上述方程利用Runge-lutta 方法计算得到的数值解为:x=0.2时, k1= 0.0000 k2= 0.2002 k3= 0.1982 k4= 0.3935 y( 1)= 1.0397 x=0.4时, k1= 0.3934 k2= 0.5811 k3= 0.5756 k4= 0.7503 y( 2)= 1.1549 即x = 0 0.2000 0.4000 y =1.0000 1.0397 1.1549………… 8 分注: 允许用其他方法,例如Euler 方法, 求解微分方程的数值解. 七、(10分)用LU 分解法求解方程组:1232115200241413x x x -⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪-=- ⎪⎪ ⎪ ⎪⎪ ⎪---⎝⎭⎝⎭⎝⎭解:用LU 分解法上述方程组,设A =LU 则有L =[ 1 0 0 -1 1 0 -2 1 1] U =[ 2 -1 1 0 -1 1 0 0 -3]………… 5 分解方程组Ly b =可得 y = 5 3 -6解方程组Ux y =可得原方程组的解 x = 1 -1 2………… 5 分八、(10分)1)写出求解线性方程组Ax b =的Jacobi 迭代格式的分量形式,其中()n n ij A a R ⨯=∈,n b R ∈;2)编写求解线性方程组Ax b =的Jacobi 迭代格式的Matlab 程序,要求该程序能根据方程的系数矩阵A 、右端项b 、初始近似解0x 、精度delta 及最大许可迭代次数max1输出在许可迭代次数内由Jacobi 迭代得到的满足精度要求的近似解及达到精度要求需要的最少迭代次数或输出在许可的迭代次数内Jacobi 迭代没有得到满足精度要求的近似解的提示信息。
解:1)Jacobi 迭代格式的分量形式为:1111()/i nk k k ii ij jijjii j j i xb a x a xa -+==+=--∑∑,1,2,,i n =,其中0ii a ≠,1,2,,i n =。
………… 4 分2)满足上述要求的Matlab 程序如下: function [x,iternum]=jacobi(A,b,x0,delta,max1) % Input -A is an n by n nonsingular matrix % -b is an n by 1 matrix% -x0 is an n by 1 matrix; the initial guess % -delta is tolerance for X% -max1 is the maximum number of iterations% Output-X is an n by 1 matrix;the jacobi approximation to the solution of AX=B%Examining the inputs if nargin<2error('more augments are needed'); break; endif nargin< 3x0=zeros(size(b)); endif nargin< 4delta=1e-13;endif nargin< 5max1=100;endif nargin> 5error('Incorrect number of inputs');break;endn=length(b);x=0*b;flag=0;iternum=0;for k=1:max1iternum=iternum+1;for j=1:nif abs(A(j,j))< (delta+eps)error('A(j,j) equal to zero,divided by zero');endx(j)=(b(j)-A(j,[1:j-1,j+1:n])*x0([1:j-1,j+1:n]))/A(j,j);enderr=norm(x-x0);relerr=err/(norm(x)+eps);x0=x;if (err<delta)|(relerr<delta)flag=1;break;endendif flag==1disp('The Jacobi method converges . ')elsedisp(['The Jacobi method does not converge within ', num2str(max1), ' iterations ']) end。