您好,欢迎访问三七文档
实验一方程求根1山西大学计算机与信息技术学院实验报告姓名XXX学号XXX专业班级(2012)计算机科学与技术课程名称计算方法实验日期10.28成绩指导老师李桂成批改日期实验名称实验一方程求根一、实验目的用各种方法求任意实函数方程f(x)=0在自变量区间[a,b]上,或某一点附近的实根。并比较方法的优劣。二、实验方法(1)二分法对方程f(x)=0在[a,b]内求根,将所给区间二分,在分点x=2ab判断是否f(x)=0,若是,则有根x=(b+a)/2。否则,继续判断是否f(a)*f(x)0,若是,则令b=x,否则令a=x、重复此过程直至求出方程f(x)=0在[a,b]中的近似根为止。(2)迭代法将方程f(x)=0等价变换为x=φ(x)形式,并建立相应的迭代公式xk+1=φ(xk)。(3)牛顿法若已知方程f(x)=0的一个近似根x0,是函数f(x)在点x0附近可用一阶泰勒多项式p1(x)=f(x0)+f`(x0)(x-x0)来近似,因此方程f(x)=0可近似表示为f(x0)+f`(x0)(x-x0)=0。设f`(x0)≠0,则x=x0-f(x0)/f`(x0)。则x作为原方程新的近似根x1,然后x1将作为x0带入上式。迭代公式为xk+1=xk-f(xk)/f`(xk)。三、实验内容(1)在区间[0,1]上用二分法求方程ex+10x-2=0的近似根,要求误差不超过0.5x10-3。(2)取初值x0=0,用迭代公式,xk+1=10kxe-2,(k=0,1,2···)求方程ex+10x-2=0的近似根。要求误差不超过0.5x10-3。(3)取初值x0=0,用牛顿迭代法求方程ex+10x-2=0(k=0,1,2···)的近似根。要求误差不超过0.5x10-3。实验一方程求根2四、实验程序(1)、er_fen_fa.h文件#ifndefTEST1_H#defineTEST1_H#includemath.h//原函数doubleoriginal(doublex){returnexp(x)+10*x-2;}//迭代公式doublediedai(doublex){return(2-exp(x))/10;}//原函数一阶导doubleori_dao(doublex){returnexp(x)+10;}//牛顿迭代公式doublenewton(doublex){returnx-(original(x)/ori_dao(x));}//二分法voiderfenfa(doublea,doubleb,doublee){inttimes=0;//迭代次数计数器printf(二分法求根:\n);while(original(a)*original(b)0){printf(给定的区间不存在根,请重新输入:\n);printf(a=);scanf(%f,&a);printf(b=);scanf(%f,&a);}while(fabs(a-b)-(2*e)0)实验一方程求根3{if(original((a+b)/2)==0){times++;printf(第%d次迭代结果:X=%f\n,times,(a+b)/2);break;}elseif(original(a)*original((a+b)/2)0){times++;b=(a+b)/2;}else{times++;a=(a+b)/2;}if((fabs(a-b)-(2*e))0){printf(总共迭代了%d次,最终结果:X=%f\n,times,(a+b)/2);break;}}printf(\n);}//迭代法voiddiedaifa(doublex,doublee,intn)//初值x,精度e,最大迭代次数n{inttimes=0;//迭代次数计数器printf(迭代法求根:\n);printf(迭代初值:X=%f\n,x);while(n0){if(diedai(x)==0){printf(第%d次迭代结果:X=%f\n,times,x);break;}elseif(fabs(diedai(x)-x)-(2*e)0){x=diedai(x);times++;printf(第%d次迭代结果:X=%f\n,times,x);实验一方程求根4}else{printf(总共迭代了%d次,最终结果:X=%f\n,times,diedai(x));break;}n--;}if(n0){printf(已达最大迭代次数,程序自动退出!\n);}printf(\n);}//牛顿法voidnewtonfa(doublex,doublee,intn)//初值x,精度e,最大迭代次数n{inttimes=0;//迭代次数计数器printf(牛顿法求根:\n);printf(迭代初值:X=%f\n,x);while(n0){if(newton(x)==0){printf(第%d次迭代结果:X=%f\n,times,x);break;}elseif(fabs(newton(x)-x)-(2*e)0){x=newton(x);times++;printf(第%d次迭代结果:X=%f\n,times,x);}else{printf(总共迭代了%d次,最终结果:X=%f\n,times,newton(x));break;}n--;}if(n0){printf(已达最大迭代次数,程序自动退出!\n);实验一方程求根5}printf(\n);}#endif五实验结果六、结果分析1二分法需要十次计算,迭代法需要三次计算,牛顿迭代法需要一次计算。牛顿迭代法计算量最少。2用牛顿法解方程式,应该尽量使初值接近零点,这样能够更节省时间,得到的根更准确。3二分法和牛顿法都是解方程的两个比较好的方法,二分法在解一元方程应用中相比牛顿法要简单些,特别是写程序要简单些,但是二分法求根过程的步骤要比牛顿法多,牛顿法不仅可以解一元方程,还可以解多元可微分方程,而且求根速度很快,但是牛顿法有一个缺点就是要在根的附近才能求解,如果离根距离太大,有可能不能解出根来,所以在不知根在哪个小范围的情况下,最好先用二分法找到一个比较小的区间,再在这个区间上求方程的根,这样的求解是可行的。另外,如果在某点处,矩阵的行列式为零,则在运算中会出现分母为零的情况,牛顿法不能继续求解,这也是牛顿法的个缺点,但是遇到这种情况的时候,如果稍稍改变初值,求解过程就会实现了。
本文标题:方程求根
链接地址:https://www.777doc.com/doc-5905676 .html