2023年数值分析实验报告新编.docx
河北工业大学数值分析课程实验实验报告专业:计算机科学与技术班级:计1 3 05班姓名:岳帅鹏学号:1 33007完毕日期:2023. 1 .11实验三一、实验规定分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x) / x的积分,并与准 确值比较判断精度。二、实验目的通过实际计算来真实体会复合梯形公式和复合辛普森公式两种数值求积方法 的精确度。三、算法描述1、复合梯形公式环节一:拟定函数的区间为【a, b】,并拟定其节点的个数,算出每个社区间 的步长h ;环节二:根据拟定的h,代入复合梯形公式,算出其相应的结果。从2、复合辛普 森公式a环节一:拟定函数的区间为【a, b】,并拟定其节点的个数,算出每个步 长h;环节二:根据拟定的h,代入复化辛普生公式,算出相应的积分结果。四、源程序# incl u de<st d io. h>#in c 1 u d e <math.h>v o id ma i n()»in t m,n,k,i;f 1 o a t Tn,Sn,dl,d2,a=O,b= 0 ,c=0;用oat xll 0 OOJ,y I 0 0 0 ,z 1 (X)0 J,wl 000 ;P rimf ("将复化梯形区间划分:");。 scan f ("d",&n);»for( i =1 ; i<n;i+)(。»x i=f 1 oa t (1. 0 /n * i);gy i =(f 1 oat) (sin(x i) /xij);a+y i;。)*T n=(fl o at) ( (1,0+s i n ( 1.0) / 1 .0+2*a) / 2.0 / n);p rin tf("复化梯形输出:% f n ”,T n );op rim f ("将复化辛卜生区间划分为:");sc a n f("%d " ,&m);)。f o r (k= 1; k <m; k +)(z k = f 1 oa t (1.0/m*k);««zk+l=flo a t (1 .0/m * ( k +1);m k +1/2 =flo a t (z k +z k+l)/2;8w k =(f 1 oa t )(si n ( z k)/zk);o wk+ 1 /2=(fl o at) (sin (zk+l/2 ) /(z k +z k + 1 J)/2);。b =b+wk;c=c + w k +1/2;S n =(flo a t)(l. 0 +2*b+4*c + s i n(I.0)/l . 0)/6.0/m);叩r i n t f("复化辛卜生输出:% fn", S n);0dl= (llo a t )(fab s (0. 9 460831-Tn);8d2= (fl oat) ( f abs( 0 . 9460831-S n);prin t f ("复化梯形误差:%fn ".d 1 );-prin tf ("复化辛卜生误差:%fn", d2);,if(d 1 >d2)pr i ntf("复化梯形求法精度低于复化辛卜生求法n”);。 else i f (dl=d2)g。p r i ntf("亚化梯形求法精度等于兔化辛卜生求法n");e 1 se (d 1 <d2)g ;p r intf ("复化梯形求法精度高于复化辛卜生求法n ");)五、运营结果| MC:Progra> FilesIicrosoft Visual StudioByProjects3Debug3.exe*置复化梯彭区间划分 复化梯形输出:0.945832 西复化4生区间划分为 复化老卜生物出:0.741290 复化梯形误群0.000251 复位辛卜生谟差:0.204793 复化稔形求法精度高于复化辛卜生求法Press any key to continue.六、对算法的理解与感悟实验四一、实验规定用改善欧拉方法解初值问题y,=x+y ;y (0) =1。0<x<L取步长h=0.1计算,并与准确值y=x-l-2e'相比较。二、实验目的1)熟悉求解常微分方程初值问题的有关方法和理论,重要是改善欧拉方法。2)会编制上述方法的计算程序。3)针对实习题编制程序,并上机计算其所需要的结果。4)通过对各种求解方法的计算实习,体会各种解法的功能、优缺陷及合用场合, 会选取适当的求解方法三、算法描述解一阶常微分方程初值问题y' = f(x,y) a < x < b.y(xo)= Yo将区间a, b作n等分,取步长h= "卫n欧拉公式为Yi+i =yi+hf(Xi,yJ梯形公式为yi+i =yi+f(x,yl) + f(xi+1,yi+1)改进欧拉法采用公式yi+1 =yi + hf(xi,yi)Yi>i =yi+(nxi,yi) + f(xM,yi.l)或者yp = Yi +hf(XQi)yc = y,+hf(x+li,yp)=5仇 + 九)四、源程序#inc 1 ud e < s tdi o .h> # includc<mat h . h >#def i ne M_E 2.double yp(doub 1 e x ,dou b I e y,doubl e h);d o uble y c ( d ouhl e x,double y, d ou b le h);dou b 1 e y x (d o u b 1 e x):i n t main()do u b 1 e xn=0:d o ubl e y n=l,y x n;doub 1 e h=0.1;i nt i;p r i n t f( "/* *实验四:n用改善欧拉方法解初值问题y '=x+y;y(0)=l <. 0< x <1,取步长h =0.1计算,n并与准确值y=-x-l-2ex相比较 nn ");p ri n tf(" ttxnt t yn t ty (xn) n °);for(i=();i<IO; i+) ®y n = 0 .5*(yp (x n ,yn, h)+ y c(x n 4- h ,yn,h);®xn=xn+h;®y x n= y x(x n );p r intf ("% 2 0 f% 2 0 f % 2 Ofn " ,x n ,yn, y xn);)rc t ur n 0;)d ouble yp (do uble xjoub 1 e y ,dou b 1 e h )retu r n y+ h * (x+y);do u ble yc(double x.dou b le y.d o u b 1 e h)ret u r n y +h* (x+h+y);)double y x(dou b le x)|re t u r n -x- 1 .0-2.0*exp(x);五、运营结果药 WDOCUIEJnS AID SETTINGSADINISTRATOR桌面,新建文件夹,实睑4Debug实 P/XXXXMXXXMX 头四:用改进欧拉方法解初值问题y,=x+y; y<0>=lo 0<xl,取步长h=0.1计算, 弃与程确值y=-xT-2ex相比较xnyny<xn>0.1000001.110000-3.3103420.2000001.241000-3.6428060.3000001.395100-3.9997180.4000001.574610-4.3836490.5000001.782071-4.7974430.6000002.020278-5.2442380.7000002.292306-5.7275050.8000002.601537-6.2510820.9000002.951690-6.8192061.0000003.346859-7.436564Press any key to cont inue搜狗拼音半:六、对算法的理解与感悟实验五一、实验规定分别用下列方法求f(x)=x33xl = 0在x0=2附近的根。根的准确值为x *=1.879385 2 4,规定准确到四位有效数字,并对比各种算法的计算量。(1)二分法;(2)简朴迭代法;(3)牛顿迭代法二、实验目的1、通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在 方程求根中的不同特点;2、比较两者的计算速度和计算精度。三、算法描述1、二分法环节一 准备 计算f(x)在有根区间a, b端点处的值f(a), f(b).环节二 二分 计算f(a)在区间中点(a+b)/2处的值f(a+b)/2。 环节三 判断 若f (a+b)/2 =0,则(a + b) /2为根,计算结果结束,否则 检查;若f (a+b)/2<0,则以(a+b)/2代替b,否则替代a。反复执行环节二 和环节三,直到区间a,b的长度小于允许误差,此时的中点即为所求。2、简朴迭代法环节一准备提供一个初始值x0;环节二迭代计算迭代值 xl二a。);环节三 控制 检查|xl - x0|;若|xl-xO|> £(£为用户输入的精 度),则以xl替换x0继续迭代;当Ixl-xOl时终止计算,取xl作为所求的结果。3、牛顿迭代法给定初值班,为根的允许误差,为|/(幻|的允许误差,N为迭代次数的允许值。 (1)假如/(x)=0或迭代次数大于N,则算法失败,结束;否则执行(2)。(2 )计算,下施- /(X)/ f(幻(3)若卜不卜&或|/(九)|<,则输出尤,程序结束;否则执行(4)。(4)令乂 =,转向(1)。四、源程序1、二分法# i nc 1 ude <ios t r e a m> u s ing namespa c e st d ;f 1 o at jisuan (f 1 oat x);int main ()3C0Ut<<”* *3C0Ut<<”* * *使用二分法求解* * *”<< e ndl;cout« "请输入f(x)的有根区间a,b的下限和上限:float a,b, c ;cin» a »b;cou t <V”请输入允许误差:”;f 1 o a t w;笛 i n»w;flo a t fl,fr, fz;ofl=ji s ua n ( a );f r= j i suan (b);for (int i =l;(b-a)>=w; i+)°f z = j is u a n( (a+ b )/2);00oc o u t « H二分法求解函数的近似根为:" << (a+b) / 2 «endl;br e ak;)else(b c o utv<"第”i«”个分点为:";ooprintf(n% f nu,( a +b)/2);oooC=(a+b)/2;。 if (fz*fl<0)oooob=(a+ b )/2;。 e Is e。a=( a +b)/2;00 。c out<<"二分法求解函数的近似根为p r i n tf (H%fn", c);cou t <V”迭代次数为:H« i -l<<endl;ret u r n 0;float jisu a n (f 1 oat x )f 1 oat fx;f x =x*x* x-3*x- 1 ;。r etu r n f x;)2、简朴迭代法# i n clu d e <i o s tream># i nc 1 u de <math. h> using name s p a ce std;int main ()(cout<”请输入允许误差:"f 1 oat w;cin>>w;afloat x 0 ,xl;笛OU t «”请输入初值:"; cin>>xO;=x 0 ;i nt k =0;实验实验规定10000用两种不同的顺序计算£ ri"。1-834 ,分析其误差的变化。"=1二、实验目的1、通过上机编程,复习巩固以前所学程序设计语言;2、通过上机计算,了解舍入误差所引起的数值不稳定性。3、通过上机计算,了解运算顺序对计算结果的影响,从而尽量避免大数吃小 数的现象。三、算法描述1) 一方面用float精度正序相加得到10000项的和;)接着用float精度逆序相加得到100 0 0项的和;3)然后用doubl e 精度正序相加得到10000项的和;小)再用double精度逆 序相加得到1 0 000项的和;5 )根据结果,进行比较分析问题。四、源程序#inc 1 ude< s td i o. h >#in c lu d e<ma t h .h>void main()(°int i;®float sl=0» s2=0, d l,d2;fo r(i=l; i< = l 0 000; i +)s l=sH-1.0f/ (i* i );of o r (i=l 0 00 0 ;i>=l;i)d o0 =x 1 ;1 =pow(3*xO+1),1/ 3 .0); ob k+;o w h i 1 e ( f a bs( x 1 x0)>w);,coutV< “简朴迭代法求解近似根为<Vxl V V endl<< ”迭代次数为:" <vk«endl;r e t u rn 0 ;)3、牛顿迭代法# i nc 1 u d e <iost r e a m>#includ e <ma t h. h >u sing nam e s p ace std;int main ()(ocoutvv”请输入初始近似值:";float x 0;®cin»x0;eCOUt<V”请输入允许误差:“;f 1 oat w;®c i n»w;flo a t x 1 , f 0, f ;of0= x0*x 0 *x 0 - 3 *x 0 -1;f=3 * x 0 *x0- 3 ;ox l=x0- f 0/f;int k;of o r (k=l; fab s (x 1 - x ()>w; k+)exO = X 1 ;0fo= x 0 火 xO * x0-3*x0- 1 ;b f= 3*xO*xO-3;xl=x 0 fO/f;)ecoutV<"牛顿迭代法求解近似根为:"<<xl<<end 1 "”迭 代次数为:“<<kVv e ndl;return 0;五、运营结果*C: Progra> Fileslicrosoft Visual StudioMyPro ject s123Debug123. exe* 使用 二分法求解 * 情掩入£<x)的有根区间L的下限和上限:0 1 常播入研凝:0 . 0005使1个分点为:。.500000笫2个分点为:0.750000第3个分点为:0.8750001- 4个分点为:0.9375005个分点为:0.9687506个分点为:0.9843757个分点为992188 用8个分点为:0.996094 使9个分点为:。.998047 塞。个分点为:0.999023 弟11.个分点为:0.999512 二分法求解函数的近似根为:。.999512 其代次数为Press any key to continueI'cT *C;Progra» Fileslicrosoft Visual StudiolyProjects 123Debug 123. exe- HEIB请输入允诳误差:。.。即耀全飕求解近似根为工87945选代次数为:6Press any key to continue.六、对算法的理解与感悟实验六实验规定分别用高斯列主元消去法和直接三角分解法(LU分解)求方程组的解系数矩阵:1 0 78 7常向量:107 565886 10 96759 107精确解为:(-60,102,2 7,16)二、实验目的1)熟悉求解线性方程组的有关理论和方法;2)会编制列主元消去法、LU分解法、雅可比及高斯-塞德尔迭代法的程序;3)通过实际计算,进一步了解各种方法的优缺陷,选择合适的数值方法。三、算法描述1、列主元高斯消去法算法将方程用增广矩阵A | b = (ajj)ny包表达1)消元过程对 k=l, 2,n-1选主元,找ik wk,k + l,n使得 max .“卜k假如小卜=0,则矩阵A奇异,程序结束;否则执行。假如ik wk,则互换第k行与第ik行相应元素位置,a. <-> a.19 ikja. <-> a.19 ikjj=k, , n+l消元,对i=k+ 1 , , n计算4 =。认/ akk对j = l + l,,n+1计算% = % 一 -2)回代过程若明“ =0,则矩阵A奇异,程序结束;否则执行。怎;对i=n-1, ,2, 1,计算( n七二 %+1 - Xauxj /%Ij=i+l72、矩阵直接三角分解法将方程组Ax=b中的A分解为A = LU,其中L为单位下三角矩阵,U为上三角矩阵,则方程组Ax =b化解为2个方程组Ly = b, Ux=y,具体算法如下(1)对j = 1,2,3,n计算 =a|j,对i = 2,3,n计算。=au /aH(2)对k = 1,2,3,:a.Mj = k,k+ 1,nil Wu =a&q=ik-l3种=1< + 1,1< + 2,一,11计算口二匹一工1%)/%q=1k-l=3,对k = 2,3, ,计算丫卜=bkq=i(4)xn =yn/unn,k = n-l,n-2,-,2,li+Mxk =(yk - 1kqXq)/也q=k+i注:由于计翔的公式与计购的公式形式上一样,故可直接对增广矩阵 aila12ainai,n+lA|b= a?'%a2na,.向_nln2nnn,n+1 _施行算法(2)(3),此时U的第n +1列元素即为y。四、源程序#incl u de< s tdio. h>main()(double a|4| 4|=10, 7 ,8 ,7, 7, 5 ,6 , 5 ,8 ,6 ,10,9,7,5 ,9, 1 0 );d o u b le b5 = 10 ,8,6,7, x4=0, m, 144,u4 4,t=0,y4;i n t i, j , k ,choic e ;printf ("矩阵为:n");f or(i=0; i <4 ; i+ + ) fo r (j=0;j<4;j + +)p rintfi j );prin t f ( n nu) ;printf("选择方法(l:高斯列主元消去法 2:LU分解法3:结束):n"”?" );s c anf ( n % dn,& choice);while (choi c e! =3)swit c h (ch o i ce) case 1:(for(i=0;i<4; i +)f or( j =i+l;j<4; j+)(m=a|ji|/aii;for ( k = i ;k< 4 ; k+)(aj k -= a ik*m; bj =bi *m;)m=();fo r (i=3; i>=0;i-)f o r (j=i+l;j< 4 ;j+)m+=a Li) x i=(b i-m)/ai i;m=();prin t f("n 方程解为:”); printf( H (H);for (i=0;i< 4 ;i+)p rin t f(n%. 2 If n,xi);p r intf(")H); b reak;c a se 2:(for(i=0;i< 4 ;i+) u0 i =a0 i; li0=ai 0/u 00;)f o r(k=l;k<4; k +)(fo r (i=k; i < 4 ; i+)(fo r (j=O;j<=k- 1 ;j+)t = t + l LkU*uU i;uk i =ak i-t;t=0;)for (i=k+l;i<4;i+)for(j= 0 ;j<=k 1 ;j+)t=t+li j*u j k;lik =(aik-t) /u k k;t= 0 ;)y0=b0;for ( i = 1 ; i<4; i+)f o r(j = 0 ; j<=i-l ; j+) t+=l : i J yJ ;y i=b i-t;t=0;x3 =y 3/u33;for (i=2; i >= 0 ; i -) for (j = i+l;j<=3;j +)t=t+uij *x j ;xi=(yi - t )/ui i ;t=0;)printf(”n 方程解为:");»d 1=(float) (fabs(l. 6 44834-s 1);。d 2=(float)(fabs( 1.6448 3 4-s2);叩rinif ("正向求和结果为fn,误差为fnn " ,sl, dl);printf("反向求和结果为 f n,误差为fnn”,s2,d2);df(d 1 <d2)。prin tf("正向求和误差小于负向求和误差n ”);else i f (dl =d2)叩rimf ( "正向求和误差等于负向求和误差n");elsep r intf ("正向求和误差大于负向求和误差n");I五、运营结果*C:Progra> FilesIicrosoft Visual StudioMyProjectsvuchaDebugvuch. 罡苟曩嘉蕊为i .644725,误爱为e.000109反向求和结果为1.644834,误差为0.000000正向求和误差等于负向求和误差Press any key to continue六、对算法的理解与感悟 pr i ntf( H (n);for(i=0;i<4;i+)p r intf (".2 1 f n,xi);p r i ntf(H)"); b r eak;)prin t f( H nn选择方法(1 :高斯列主元消去法2:LU分 解法3:结束):n"”? " );s c anf (n%d n ,&ch o ice);)五、运营结果c: -C:Progra« FilesMicrosoft Visual StudiolyProjects123Debug123.exe花阵为:10.000 0705 00*8.00P.005但择方法8.00?.000 0 5 0 010.009.00.009.0010.00Q:高斯列主元消去法2: LU分解法3:结束):方程解为:(-60.00 102.00 -27.00 16.00 j他择方法Q:高斯列主元消去法2:川分解法3:结束): ,2而程解为:(-60.00 102.00 -27.00 16.00 )卜择方法(高斯列主元消去法2:LU分解法3:结束):ress any key to continue六、对算法的理解与感悟实验二、实验规定1、拉格朗日插值按下列数据Xi3. 0-1.01.02.03.0y.-1.01.52.02.01.0作二次插值,并求X|=-2,X2 =0, X3=2.7 5时的函数近似值2牛顿插值按下列数据Xj0.300.4 20.5 00.580. 660.72y.-1.0 4 4031 .0 84621. 1 18031. 1 560 31.198171.23223作五次插值,并求X=0.4 6, x2=0. 5 5 ,x3 = 0 . 60时的函数近似值.二、实验目的1、熟悉拉格朗日插值多项式和牛顿插值多项式,注意其不同特点;三、算法描述1、 拉格朗日插值(1)输入 x ., y,. ( i =0, 1, 2,n),令 L( x ”)=0;(2)对二 0,1,2, .,n 计算、-A- x-x:l(x)= n-i=o 评L.<- L* + 1 j(x)y,2、 牛顿插值多项式(1)输入 n , x , y (i= 0 , 1, 2., n);(2) 对 k=l,2, 3 n, i =1, 2, .» k 计算各阶差商 f (x., x1,xA );(3) 计算函数值Nn (x)= f ( x 0) +f x (), xj ( x x(l)+.+f xp x1,.,xn(x- x fl) ( x-X ) .(X-XM_()四、源程序1 .拉格朗日#include<ios t r e am># inc 1 ude<i o manip># i n c lu d e <ma t h.h>usi n g n a mespac e s(d;float jisuanmo k u ai(i n t, f lo a t,float ,fl o a t );v o id ma i n ()4 1 oat a,xl50,y50, 1;。i nt m.n;ocout«"目:按下列数据" v< e ndl;oc ou t << " x:-3.0 -LO1.02. 0 3 .0 " « e n d 1 ;8cout«"y:l. 01 .5 2.0 2. 01.5 " «en d 1 ;oco u tvV"作二次插值,求x =-2,x=0, x = 2 .7 5时的函数近似值."vv e n d 1;«c o utVv"输入插值次数:"vVen d 1 ;»c in>>n;coutvv"插入计算次数:"en d 1 ;ocin>>m;«for(i n t i=0; i<=m; i+)«for( i nt j=O;j<=n; j+)。 «in t h99=i+l,b9 9=j+l;。ocou t vv”输入第"« h 9 9 vv”个数的第”vvb 9 9<v"个节点及函数值:H «en d 1 ;°。c in>>x j >>yj;00 |2.牛顿#in c 1 ude<st d i o . h ># define M 6f loat w( f 1 o a t X ,int n ,f 1 o a t x);floa t quo t ic n t (int k , i nt i,float f M, f I oat x ,floaty );fl o at n e wton( f 1 o at X,int n, f 1 o a t fo at x(l, f loat y);vo i d m a i n()afloat xM,y M;ox0 =0. 30f; y 0=l. 0 4 403 f ;x l=0.4 2f;yl =1.08462f;x2=0.5 0f;y2=l. 1 180 3 f ;ox 3= 0 .58 f ; y 3 =1. 1 5 603f;x4= 0 . 6 6 fM 4 = 1.1981 7 f;x 5=0.72f; y 51=1.2322 3 f;oprin t f("x: 0 . 3 0 0.4 2 0.50 0 .58 0.66 0. 7 2 n");叩r i n t f("y: 1 .04403 1.08 4 62 1 .1 1 803 1. 1 5 6 0 31. 1 9817 1 ,23223n");print f("做五次插值,并求x =0.46, x =0. 55,x=0.60时的函数近似值.n n ");for (inti=O; i<M; i+)float N 3;N0=new t on (0. 4 6f, 5 ,f, x,y);N 1 =newton( 0 .55f, 5 ,f,x,y);N 2 = n e wton (0.6 0 f, 5 ,f,x,y);叩r i ntf ("x =0.4 6时函数的近似值为%fn”,N); printf("x=0. 55 时函数的近似值为 %fn",Nl);叩rintf("x=0.60时函数的近似值为%fn", N 2); )float w (float X, in t n, f loat x ) (float w= 1 .0;for (int i=0; i < n ; i+)*w =w*(X-xil);ar e t ur n w; )float q u otient(i n t k Jnt i, f 1 o at f1 oat x , f loat y)if( k =0)f0 i =yi;»else»f k ij=(q u ot i en t (k-1, i,f, x, y )qu o t i ent(k-1, i 1, f,x,y)/(x i -xi-k); aretu r n f k i; floatnewton(flo a t Xjnt n, f loa t f M,f 1 oat x 1,float y ) afloat N ;°f o r ( i n t i=l : i<=n; i +),N=N+w (X,i,x)*qu o ti e n t (i,i, f,x, y );return N;)五、运营结果1.拉格朗日:I *C:PrograM FilesIicrosoft Visual StudiolyProjects2Debug2.exe题目:按下列数据x:-3.0 -1.0 1.0 2.0 3.09:1.0 1.5 2.0 2.0 1.5雪又套唐夏毂求x =-2 , x =0 , x =2.75时的函数近似值.2插入计算次数:3输入第1个数的第1个节点及函数值:-3.0 1.0输入第1个数的第2个节点及函数值:-1.0 1.5输入第1个数的第3个节点及函数值:1.0 2.0输入要计算的x的值:-2.01.250000输入第2个数的第,个节点及函数值:2.牛顿:六、对算法的理解与感悟c: *C:Progra> FilesMicrosoft Visual StudiolyProjectsnevtonDebugnev. L0.30 0.42 0.50 0.58 0.66 0.72L:1.04403 1.08462 1.11803 1.15603 1.19817 1.23223性五次插值,并求x =0.46,x =0.55,x =0.60时的函数近似值.x=0.46时函数的近似值为1.100724卜=0.55次-函数的近似值为1.141271x=0.6。时函数的近似值为1.166194Press any key to continue.