计算方法实验报告5-1-二分法求根
计算数值方法实验报告..
课程名称:计算机数值方法实验项目:方程求根,线性方程组的直接解法与迭代解法,代数插值,最小二乘法拟合多项式实验地点:逸夫楼402专业班级:学号:学生姓名:指导教师:***2012年4月26日太原理工大学学生实验报告}3.追赶法五、实验数据记录和处理1.二分法2..牛顿法六、实验结果与分析通过这个两个程序可看出,二分法的计算量更大一些。
七、讨论、心得通过这个实验,我了解了线性方程的一些求根方法,对于方程近似值的求解有了更多的理解。
太原理工大学学生实验报告for(i=1;i<=n;++i){y[i] = b[i];for(j=1;j<i;++j){y[i]-=l[i][j]*y[j];}}for(i=n;i>0;--i){x[i] = y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/= u[i][i];}for(i=1;i<=n;++i){printf("%0.2lf\n",x[i]);}return 0;}五.实验数据记录和处理1.高斯2.LU分解六、实验结果与分析本次实验数据较多,在输入上要多费点功夫,一不小心就全部都错了。
在今后编程过程中,一定要小心谨慎。
七、讨论、心得通过本次实验,我深刻理解了直接法在计算机上解线性方程组的有效性,对于Gauss消元法、LU分解法也有了深刻的理解。
实验地点逸夫楼402指导教师于亚男太原理工大学学生实验报告学院名称软件学院专业班级学号学生姓名实验日期4月26日成绩课程名称计算机数值方法实验题目线性方程组的迭代解法一、实验目的和要求掌握雅可比迭代法和高斯-赛德尔迭代法对方程组进行求解二、实验内容和原理六、实验结果与分析在本次实验中,编程不太容易,对c/c++的学习应该更进一步。
七、讨论、心得通过这次实验,我明白了雅克比迭代的一般性解法,对于编程的应用也有了更深刻的理解。
计算方法,二分法实验报告
实验报告 ___二分法班级:2007060101 学号:200706010103 姓名:严伟一、实验目的目的: 通过对二分法的编程练习与上机运算,进一步体会二分法的特点;二、实验内容要求内容要求: ①要求可随机输入区间[a,b]的值执行程序,算出误差限的值.②讨论a,b变化时,二分次数的变化;误差限变化时二分次数的变化;估算的次数与实际二分次数的符合情况;三、流程图四、算法①给定区间[a,b],并设f(a)与f(b)符合相反,取ε为根的容许误差, δ为|f(x)|的容许误差.令c=(a+b)/2 .②如果(c-a)< ε或|f(c)|<δ,则输出C,结束;否则执行③.③如果f(a)*f(b)>0, 则根位于区间[a, c]内,以c代替b; f(a)*f(b)< 0则根位于区间[c,b]内,以c代替a;重复①,②,③.直到区间[a, b]长度缩小到允许误差范围之内或f(c)=0,此时区间中点c即可作为所求的根。
五、实验结果应用方程:f(x)=x3+x2-3x-3=0⑴编写c语言程序如下:#include<stdio.h>#include<math.h>#define eps 5e-4#define delta 1e-6float f(float x){return x*x*x+x*x-3*x-3;}void main(){float a,b,c;int k;float fa,fb,fc;int n=1;scanf("%f,%f",&a,&b);printf("a=%f b=%f\n",a,b);k=(log(b-a)-log(eps))/log(2.0);printf("k=%d\n",k);fa=f(a);fb=f(b);do{if(fa*fb>0){printf("无解");break;}else{c=(a+b)/2;fc=f(c);if(fabs(fc)<delta)break;if(fa*fc<0){b=c;fb=fc;}if(fb*fc<0){a=c;fa=fc;}if((b-a)<eps)break;}printf("%d %f %f\n",n,c,fc);n++;}while(n=k );}⑵实例验证结果:①输入初始参数:a=1, b=2, EPS=5e-6 ;其结果为:②改变a, b的值为:a=0, b=2, EPS不变,仍为5e-6,其结果为:③改变EPS的值为:EPS=5e-4, a, b不变,仍为a=1, b=2,其结果为:六、估算次数与实际二分次数的分析和讨论I. 输入不同的区间初值a, b,二分次数的变化情况答:输入的区间范围越大,要达到相同的精确值,二分次数K会相应的增加。
数值分析实验报告——方程求根
《数值分析》实验报告实验一方程求根一、实验目的:掌握二分法、Newton法、不动点迭代法、弦截法求方程的根的各种计算方法、并实施程序调试和运行,学习应用这些算法于实际问题。
二、实验内容:二分法、Newton法、不动点迭代法、弦截法求方程的根、程序的调试和运行,给出实例的计算结果。
观察初值对收敛性的影响。
三、实验步骤:①、二分法:定义:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
实现方法:首先我们设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根,误差限为e=10^-4。
PS:本方法应用的软件为matlab。
disp('二分法')a=0.1;b=1;tol=0.0001;n0=100;fa=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;for i=1:n0 p=(a+b)/2;fp=400*(p.^4)-300*(p.^3)+200*(p.^2)-10*p-1;if fp==0||(abs((b-a)/2)<tol)disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;end;if fa*fp>0 a=p;else b=p;end;end;if i==n0&&~(fp==0||(abs((b-a)/2)<tol)) disp(n0) disp('次二分迭代后没有求出方程的根')end;程序调试:运行结果:用二分法求得方程的根p=0.1108二分迭代次数为:14②Newton法定义:取定初值x0,找到函数对应的点,然后通过该点作函数切线,交x轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。
计算方法实验二非线性方程求根实验报告
实验报告学院:电子信息工程实验课程:计算方法学生姓名:学号:专业班级:通信工程实验二非线性方程求根1 目的与要求(1)进一步熟练掌握求解非线性方程的二分法与Newton迭代法。
(2)掌握二分法与Newton迭代法的算法,能运用程序设计语言和此方法编制软件求出任意指定一元三次方程在给定点附近的根。
2 实验内容用二分法和Newton迭代法求方程310x x--=在1.5 附近的根,精确到310-,输出每次的迭代结果并统计所用的迭代次数。
3 实验原理(1)二分法实验原理取[a,b]区间二等分的中点x1 =(a+b)/2(1)若f(x1)=0,则x1是f(x)=0的实根。
(2)若f(a)f(x1)<0 成立,则x* 必在区间(a, x1)内,取a1=a,b1= x1;否则x*必在区间(x1,b)内,则取a1= x1,b1=b,这样,得到新区间[a1,b1],其长度为[a,b]的一半。
(3)如此继续下去,进行n次等分(2)Newton迭代法实验原理4 程序设计(1)流程图二分法程序流程图Newton迭代法程序流程图(2)程序代码①二分法求非线性方程根#include<stdio.h>#include<math.h>double fun1(double x){return x*x*x-x-1;}double fun2(double x1,double x2){return (x1+x2)/2;}main(){int n=1;float a,b,c;printf("二分法求非线性方程的根\n"); scanf("a=%f,b=%f",&a,&b);if (fun1(a)*fun1(b)<0){while(fabs(b-a)>1e-3){c=fun2(a,b);if (fun1(a)*fun1(c)<0){b=c;}else if (fun1(c)*fun1(b)<0){a=c;}else{break;}printf("当前计算次数为%d 计算结果为%lf\n",n,fun2(a,b));n++;}}else{printf("不符合二分法使用条件,请重新输入:\n"); }}②Newton迭代法#include<stdio.h>#include<math.h>double fun1(double x){return x*x*x-x-1;}double fun2(double x){return 3*x*x-1;}double root(double num){double x1,x0;int n=1;x0=num;if (fun2(x0)==0){printf("Algorithm failed. Exit !"); }else{x1=x0-fun1(x0)/fun2(x0);printf("Newton迭代法求根\n");}while (fabs(x1-x0)>1e-3){printf("当前计算次数为%d 计算结果为%lf\n",n,x1); x0=x1;x1=x0-fun1(x0)/fun2(x0);n++;}}main(){root(1.5);}5 实验结果与分析(1)二分法求根结果界面(2)Newton迭代法求根结果界面分析:(1)本次试验两种算法均采用了while循环及if-else判断语句,编程函数并由主函数调用,较简单的实现了二分法与Newton迭代法的编程任务。
方程求根 实验报告
实验一方程求根一、实验目的用各种方法求任意实函数方程f(x)=0在自变量区间[a,b]上,或某一点附近的实根。
并比较方法的优劣。
二、实验方法(1)二分法对方程f(x)=0在[a,b]内求根。
将所给区间等分,在分点x=(b-a)/2判断是否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=h(x)形式,并建立相应的迭代公式Xk+1=h(Xk)。
(3)牛顿法若已知方程f(X)=0的一个近似根X0,则函数f(X)在点X0附近可用一阶泰勒多项式P1= 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带入上式,迭代公示为:X k+1=X k - f (X k)/ f’ (X k)。
三、实验内容在区间[0,1]上用二分法求方程的近似根,要求误差不超过0.5×10^3。
取初值X0=0,用迭代公式X k+1=(2-e^k)/10,(k=0,1,2,…)求方程e^x+10x-2=0的近似根。
要求误差不超过0.5×10^3。
取初值X0=0,用牛顿迭代法求方程e^x+10x-2=0的近似根。
要求误差不超过0.5×10^3。
四、实验程序1.二分法function x=agui_bisect(fname,a,b,e)fa=feval(fname,a);fb=feval(fname,b);if fa*fb>0 error('两端函数值为同号');endk=0x=(a+b)/2while(b-a)>(2*e)fx=feval(fname,x);if fa*fx<0b=x;fb=fx;elsea=x;fa=fx;endk=k+1x=(a+b)/2end2.迭代法function x=agui_iterative(fname,x0,e)N=100;x=x0;x0=x+2*e;k=0;while abs(x0-x)>e & k<Nk=k+1x0=x;x=feval(fname,x0);disp(x)endif k==N warning('已达最大迭代次数');end3.牛顿法function x=agui_newton(fname,dfname,x0,e)N=100;x=x0;x0=x+2*e;k=0;while abs(x0-x)>e&k<Nk=k+1x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);disp(x)endif k==N warning('已达最大迭代次数');end五、实验结果1.二分法2.迭代法3.牛顿法六、结果分析二分法要循环10次,迭代法要迭代4次,牛顿法要迭代3次才能达到精度为0.5×1^-3的要求,由此可知:二分法方法简单,编程容易,且对函数f(x)的性质要求不高,但其收缩速度较慢,计算量大,因此常被用于精度不高的近似根,或为迭代法求初值。
计算方法二分法实验
计算方法上机实验报告土木0804上机题目;利用二分法求下列方程在【5.5-6.5】的根实验目的:本实验通过二分法对方程求解,通过观察方程x1,x2随二分次数增加而起的变化,以及通过改变方程中七次项系数微小变化对方程求解的影响,加深对二分法求解方程的理解。
并锻炼C语言编程能力。
实验分析:二分法求解采用的是根的存在定理(零点定理):f(x)为[a,b]上的连续函数,若f(a)·f(b)<0,则[a,b]中至少有一个实根。
如果f(x)在[a,b]上还是单调递增或递减的,则f(x)=0仅有一个实根。
取[a,b]的中点x=(a +b)/2作为问题的近似解,那么我们可以估计出绝对误差限仅为区间长的一半,即e=(b-a)/2。
如果这个结果能满足精度要求,我们就停止进一步的计算;如果不能,就求出f(x),结果只能是下面三种情况之一:(1) f(a)·f(x)<0,此时我们有x*∈[a,x];(2) f(x)·f(b)<0,此时我们有x*∈[x,b];(3) f(x)=0,此时x即为问题的精确解。
在前两种情况下,我们可以用x分别替换原问题中的b或a,从而把求解的区间减小了一半。
这样我们又可以取新区间[a,b]的中点。
经过N次迭代后,剩下的区间长为(b- a)/2N。
这也是结果的绝对误差限。
如此继续下去就达到是有根区间逐步缩小的目的,在这一些相互包含的子区间中构造收敛的数列{}kx来逼近根*x。
实验过程:1;C语言程序# include <stdio.h># include <conio.h># include <math.h># define PRECISION 1e12double f(double c){double m,x,m1,m2,m3;x=c;m1=x*x;m2=m1*x;m3=m1*m1;m=m3*m3-36*m3*m2+546*m2*m3-4536*m3*x+22449*m3-67284*m2+118124*m1-109584*x+40320; return(m);}double Root(float a,float b){ int i;i=0;double x1,x2;x1=a;x2=b;do{printf ("\n i=%d,x1=%f,x2=%f ",i,x1,x2);if(f(x1)*f((x1+x2)/2)<0)x2=(x1+x2)/2;elsex1=(x1+x2)/2;i++;}while (i<=100);return (x1);}void main(){float x1,x2,r;printf ("\n input x1,x2: \n ") ;scanf ("%f %f",&x1,&x2);r=Root(x1,x2);printf ("\n Root x=%f",r);}2.结果分析当a7=-36是,迭代到i=21时,出现x1=x2=6.500000,不再发生变化,出现精确解 x=root=x1=6.500000,收敛速度在数列xn 越靠近根时越慢。
二分法求方程的实根
二分法求方程的实根一:实验目的 通过编程实现二分法,并利用所编程序求函数x e x y --=3在(0,1)的近似解,然后比较和计算器所求的结果,从理性和实践上认识两种计算方法。
二:基本原理连续函数的零点定理1、假定f(x)在区间(x ,y )上连续 , 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2]。
2、假设f(a)<0,f(b)>0,a<b①令a a =1,()11121,b a x b b +==,如果f(x)=0,该点就是零点。
如果0)()(1<x f a f ,则新的有根区间为[][]x a b a ,,122=;否则[][]122,,b x b a =。
此时有[][]2211,,b a b a ⊃,且()112221a b a b -=-。
对区间[]22,b a 重复上述做法多步有[][][][] n n b a b a b a b a ,,,,332211⊃⊃⊃且()a b a b n n n -=--121(式1)记*x 为0)(=x f 的根,我们有[]n n b a x ,*∈,即),3,2,1(* =≤≤n b x a n n 由(式1)及夹逼定理有:*lim lim x b a n n n n ==∞→∞→,实际计算时,当ε<-)(n n a b 时,取)(21*n n b a x +≈作为所求根近似值。
三:实验步骤1:建立如下函数文件f.m :Function f=f(x)f=x e x --32:通过如下框图编写二分法程序:erfen.m开始输入f,a,b,delta计算fa,fb,fa*fbfa*fb>0计算最多二分次数max1计算c=(a+b)/2, fcfc=0fb*fc>0b=c,a=a a=c,b=b|a-b|<=0.0005结束是否是否是否是否(3)、在Matlab 命令窗口键入:[c,err,yc]=bisect(‘f ’,0,1,0.005)(4)、得出结果,并与计算器所得结果比较分析误差。
二分法实验报告
二分法实验报告二分法实验报告引言:二分法是一种常用的数值计算方法,广泛应用于求解方程的根、函数的最值等问题。
本实验旨在通过对二分法的实际应用,探讨其原理和优势,并对其在不同场景下的适用性进行分析。
一、二分法原理及步骤二分法,又称折半法,是一种通过不断缩小搜索范围来逼近目标的方法。
其基本原理是将待搜索的区间不断二分,然后根据目标值与中间值的关系,确定下一步搜索的范围,直至找到目标或满足精度要求。
具体步骤如下:1. 确定初始搜索范围[a, b],其中a和b分别为区间的下界和上界。
2. 计算中间值c = (a + b) / 2。
3. 判断目标值与中间值的关系:- 若目标值等于中间值,则找到目标,结束搜索。
- 若目标值小于中间值,则下一步搜索范围为[a, c]。
- 若目标值大于中间值,则下一步搜索范围为[c, b]。
4. 重复步骤2和步骤3,直至找到目标或满足精度要求。
二、实验设计与结果分析为了验证二分法的有效性和适用性,我们选取了两个不同的场景进行实验:求解方程的根和函数的最值。
1. 求解方程的根我们选择了一个简单的一元二次方程作为实验对象:x^2 - 4x + 3 = 0。
根据二分法的原理,我们可以将搜索范围设置为[0, 4],然后通过不断缩小范围来逼近方程的根。
经过多次迭代计算,我们得到了方程的根x ≈ 1和x ≈ 3。
通过与解析解进行对比,我们发现二分法得到的结果非常接近真实值,证明了二分法在求解方程根的问题上的有效性。
2. 求解函数的最值我们选取了一个简单的函数f(x) = x^2 - 2x + 1作为实验对象,目标是找到函数的最小值。
根据二分法的原理,我们可以将搜索范围设置为[0, 2],然后通过不断缩小范围来逼近最小值所在的位置。
经过多次迭代计算,我们得到了函数的最小值f(x) ≈ 0。
通过与解析解进行对比,我们发现二分法得到的结果非常接近真实值,证明了二分法在求解函数最值的问题上的有效性。
数值计算方法实验报告
数值计算⽅法实验报告《数值计算⽅法》实验报告实验题⽬⼆分法求⾮线性⽅程的根专业班级11级数学师范⼆班姓名李洪学号201102024056指导⽼师李梦联系电话188********⼀、实验⽬的熟悉⼆分法求⽅程近似根的数值⽅法,与⽤计算器解出的值进⾏⽐较,并学会误差分析。
⼆、实验原理⼆分法的基本思路是通过计算隔根区间的中点,逐步将隔根区间缩⼩,从⽽可得⽅程的近似根数列}{n x 。
(≤-+1*k x x ?)三、实验内容已知0)()3(3=-=-e x x f 在[]1,0上有⼀个实根*x ,0)1(0)0(>本实验中的⽤到的求根⽅法有①⼆分法,②计算器求根。
四、实验步骤1.输⼊:a ,b 值及精度控制?量;2.if 0)()(>b f a f then 返回第1步,重新输⼊a ,b 值else 转第3步;3.while ?>-b a 时做(1))(21b a x +=,计算)(x f ;if )(x f =0 then 输出x ,停机。
(2)if0)()(4.输出)(21b a x +=。
五、 Matlab 源程序1.erfen.m:function [c,err,yc]=erfen(f,a,b,delta)ya = feval(f,a);yb = feval(f,b);if ya * yb > 0 ,return,endmax1 = 1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb * yc > 0b=c;yb=yc;elsea=c;ya=yc;endif b-aendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);2.f.m:function f=f(x);f=x^3-exp(-x);六、运⾏结果七、计算机计算结果⼋、实验分析1、⼆分法和计算器均能解出⽅程的根。
二分法实验报告
数值计算方法实验报告班级:数学师范2班姓名:***学号:************指导老师:**非线性方程的数值解法——二分法【实验目的】用二分法求解一般方程0)(=x f 的根;通过上机进一步加深了对二分法的理解与应用的能力。
【基本原理】对于方程0)(=x f 的第一部是确定它的有根区间[]b a ,。
设[]b a C x f ,)(∈,若0)()(<b f a f ,则由连续函数零点定理知,方程0)(=x f 在[]b a ,内至少有一个根;又若)'(x f 在区间()b a ,内恒正或恒负,则此根在()b a ,内唯一。
【实验步骤】(1)输入:a ,b 的值及精度控制量ε;(2)If 0)()(>b f a f then 返回第(1)步,重新输入a,b 值else 转第(3)步;(3)While ε>-b a 时做 1))(21b a x +=,计算)(x f ;If 0)(=x f then 输出x ,停机。
2)If 0)()(>b f a f then [][]x a b a ,,= else [][]b x b a ,,= endwhile;(4) 输出)(21b a x +=。
【Matlab 编码】【实验结果】【实验分析】 方程3()0x f x x e -=-=的一个实根,因为0)1(,0)0(><f f ,2'()30x f x x e -=+>故)(x f 在()1,0内有唯一实根,精度ε=0.00005,下面是用二分法求解过程:【误差分析】7730.0*=x , 7725.0=x绝对误差:**()e x x x =-=0.0005 【算法优劣分析】有效数字的取值不同,收敛速度较慢。
当方法0)(=x f 在[]b a ,上有唯一实根时,二分法肯定是收敛的,程序简单,且易于估计误差之大小;它的缺点是不能求方程具有偶重根和复根,收敛速度慢。
计算方法实验五牛顿法,牛顿下山法,切线法,二分法
计算机实现数值积分 实验目的:非线性方程求解 实验内容:1.二分法的 Matlab 实现; 2.牛顿法的 Matlab 实现; 3.牛顿下山法、割线法、艾特金加速法、重根 迭代法、非线性方程组牛顿法中任选其一。 实验要求:1.每种算法要求达到给定的精度,输出近似 解结果及所需迭代次数; 2. P.239、171,或自选题目; 3.每个算法至少实验一个题目。
Therefore,the root is x=1.3571,iteration number is k=2.
6.在 MATLAB 工作窗口输入程序 [k,xk,yk,piancha,xdpiancha]=newtonqx(1,1e-8, 1e-8,100) 7.运行结果 y =16 y =26 y =0.3350 ans =1.0000 1.3846 0.3350 0.6154 0.4444 y =0.3350 y =18.5207 y =-0.0481
-0.0481
0.0181
0.0132
0.0072
0.0026
0.0019
-0.0011
0.0004
0.0003
0.0002
0.0001
0.0000
-0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
-0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
-0.0000
Therefore,the root is x=1.3688,iteration number is k=7.
pare the number of computations for finding the root of
方程求根二分法
实验项目 非线性方程求解方法 理论内容 非线性方程求根的二分法 实验室名称 文理馆 203
实验日期 2016.09.02 授课日期 2016.09.02 微机编号 E1
实验目的及要求:
1、 使学生掌握非线性方程求解二分法的基本理论。 2、使学生借助于计算机这一高效计算工具和本课程中的基本数值计算方法
}
3
public class Demo02 { public static void main(String[] args) { double temp = 1.0; double y = (double) 1.0; double a = 1; double b = 2; for (int i = 2; i < 300; i++) { y = (a + b) / ((double) 2.0); temp = Math.sin(y)-y*y/2; System.out.print(a + "|"); System.out.print(y + "|"); System.out.print(b + "\n"); if (temp < 0) { b = y; } else { a = y; } if (b - a <= 5*Math.pow(0.1, 6)) { System.out.println(y); break; } } }
解,虽然我们得到了最终结果但是这种方法所体现时间复杂度非常的高,计算量庞大,在计算误差
精确度位数比较高时,我们需对二分法进行改进。
实验报告评分标准
评分项目
满分 得分
评分项目
实验步骤及程序 10
计算方法上机2 方程求根
实验报告名称方程求根班级:学号:姓名:成绩:1实验目的(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。
(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
2 实验内容求方程f(x)=x^3+x^2-3*x-3在1.5附近的根。
3实验步骤二分法算法给定区间(a,b),并设f(a)与f(b)符号相反,取ε为根的容许误差,δ为|f(x)|的容许误差。
①令c=(a+b)/2.②如果(c-a)<ε或|f(c)|<δ,则输出c,结束;否则执行③。
③如果f(a)*f(c)>0,则a=c;否则令b=c,重复①②③。
牛顿迭代法算法给定初始值x0,ε为根的容许误差,η为|f(x)|的容许误差,N为迭代次数的容许值。
①如果f(x0)’=0或迭代次数大于N,则算法失败,结束;否则执行②。
②计算x1=x0-f(x0)/f(x0)’.③令x0=x1,转向①。
4 程序设计二分法c语言程序设计:#include <stdio.h>#include <math.h>#define eps 5e-6#define delta 1e-6float Bisection(float a,float b,float(*f)(float)){float c, fc,fa=(*f)(a),fb=(*f)(b);int n=1;printf("二分次数\t\tc\t\tf(c)\n");while(1){if(fa*fb>0){printf("不能用二分法求解");break;}c=(a+b)/2,fc=(*f)(c);if(fabs(fc)<delta)break;else if(fa*fc<0){ b=c;fb=fc;}else{a=c;fa=fc;}if(b-a<eps)break;printf("%d\t\t%f\t\t%f\n",n++,c,fc);}return c;}float f(float x){return x*x*x+x*x-3*x-3;}void main(){float a=1,b=2;float x;x=Bisection(a,b,f);printf("\n方程的根是:%f",x);}牛顿法c语言程序设计:#include<stdio.h>#include<math.h>#define N 100#define eps 1e-6#define eta 1e-8float Newton(float(*f)(float),float(*f1)(float),float x0) {float x1,d;int k=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++>N||fabs((*f1)(x1))<eps){printf("\n Newton迭代散发");break;}d=fabs(x1)<1?x1-x0:(x1-x0)/x1;x0=x1;printf("x(%d)=%f\t",k,x0);}while(fabs(d)>eps&&fabs((*f)(x1))>eta);return x1;float f(float x){return x*x*x+x*x-3*x-3;}float f1(float x){return 3.0*x*x+2*x-3;}void main(){float x0,y0;printf("请输入迭代值x0\n");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("方程的根为:%f\n",y0);}5实验结果及分析二分法的输出结果:牛顿法的输出结果:实验分析:上面程序取三个不同初值,得到同样的结果,但迭代次数不同,初值越接近所求的根,迭代次数越少。
二分法实验报告
二分法实验报告二分法实验报告引言:二分法,也称为二分查找法或折半查找法,是一种常用的查找算法。
它的基本思想是将有序数组分成两部分,通过比较目标值与数组中间元素的大小关系,确定目标值可能存在的位置,然后逐步缩小查找范围,直到找到目标值或确定不存在。
本实验旨在通过编写二分法算法并进行实验验证,探究二分法的效率和应用。
实验方法:1. 设计二分法算法在实验开始之前,我们首先需要设计一个二分法算法来实现查找功能。
具体算法如下:- 选取有序数组arr和目标值target作为输入参数。
- 初始化变量left为数组的起始索引,right为数组的结束索引。
- 当left小于等于right时,执行以下步骤:- 计算中间索引mid,mid = (left + right) / 2。
- 如果arr[mid]等于target,返回mid。
- 如果arr[mid]大于target,将right更新为mid - 1。
- 如果arr[mid]小于target,将left更新为mid + 1。
- 如果循环结束时仍未找到目标值,返回-1。
2. 编写实验代码根据上述算法设计,我们可以使用任何编程语言来实现二分法算法。
在本实验中,我们选择使用Python编写实验代码。
以下是代码示例:```pythondef binary_search(arr, target):left = 0right = len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] > target:right = mid - 1else:left = mid + 1return -1arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]target = 5result = binary_search(arr, target)print("目标值在数组中的索引为:", result)```3. 进行实验验证在编写完实验代码后,我们可以使用不同的测试用例来验证二分法的正确性和效率。
(完整word版)数值分析报告-二分法和牛顿法方程求根(word文档良心出品)
《数值分析》实验报告一**: **学号: PB********实验一一、实验名称方程求根二、实验目的与要求:通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。
三、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。
(一)二分法算法:给定区间[a,b],并设f (a )与f (b )符号相反,取δ为根的容许误差,ε为值的容许误差。
(1)令c=(a+b)/2(2)如果(c-a)< δ或)(c f <ε,则输出c ,结束;否则执行(3)(3)如果f(a)f(c)<0,则令)()(,c f b f c b ←←;否则,则令)()(,c f a f c a ←←,重复(1),(2),(3)。
(二)牛顿迭代法:给定初值0x ,ε为根的容许误差,η为)(x f 的容许误差,N 为迭代次数的容许值。
(1)如果)(x f <η或迭代次数大于N ,则算法结束;否则执行(2)。
(2)计算)('/)(0001x f x f x x -=(3)若 < 或 < ,则输出 ,程序结束;否则执行(4)。
(4)令 = ,转向(1)。
四、实验题目与程序设计1、二分法3.1.1、用二分法求方程a. f(x)= x x tan 1--在区间[0,π/2]上的根,c. f(x)=6cos 22-++-x e x x 在区间[1,3]上的根。
源程序:3.1.1.a#include<stdio.h>#include<math.h>void main(){float a,b;double c,y,z;printf("plese input two number a and b:\n");scanf("%f%f",&a,&b);c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);while(fabs(b-a)>0.00001|| fabs(y)>0.00001){z=1/a-tan(a);if(z*y<0)b=c;elsea=c;c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);}x x 01-ε)(1x f ηx 1x 0x 1}输入0 1.5707563( /2~1.5705563)得到下表:由上表可以看出刚开始时f(c)取值幅度很大,但是经过一段历程之后,幅度变得平缓甚至基本接近与零,我们认为,x=0.8603是方程的根,结果与实际想要得到的值相当接近。
数值分析实验报告之二分法求根 java
《数值分析》实验报告实验三 非线性方程求根一、实验目的1.掌握二分法、牛顿迭代法等常用的非线性方程迭代算法;2.培养编程与上机调试能力。
二、实验要求1.用C 语言设计出二分法和牛顿法的程序,并且选择不同的初值,观察所需的迭代次数和迭代结果。
三、实验原理1.二分法计算f(x)=0的二分法如下:① 输入求根取间[a,b]和误差控制量ε,定义函数f(x)。
如果 0)()(<b f a f ,转②;否则退出选用其它求根方法② 当|a-b|>ε时,计算中点x=(a+b)/2以及f(x)的值;分情况处理ε<|)(|x f :停止计算,x x =*,转④0)()(<x f a f :修正区间 ],[],[b a x a →0)()(<b f x f :修正区间 ],[],[b a b x →③ 2*b a x += ④ 输出近似根*x四、实验内容1.用二分法求方程01)(3=--=x x x f 在区间[1.0,1.5]内的一个实根,要求精确到小数点后2位。
五、实验结果输入零点所在区间时:输入错误的区间时:二分法程序代码:import java.awt.Container;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.GridLayout;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.Color;import javax.swing.JLabel;import java.awt.Font;import javax.swing.JTextField;import javax.swing.JButton;import javax.swing.SwingConstants;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;public class Erfenfaa implements ActionListener{ JFrame frame;private JTextField textField1;private JTextField textField2;private JTextField textField3;private JTextField textField4;JPanel panel_1 ,panel_2 ,panel_22,panel_3 ,panel_4 ; JLabel label1,label2,labelaa,labelbb,label_2,label_3; JButton submit,cancel;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {new Erfenfaa();} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public Erfenfaa() {frame = new JFrame("二分法解方程");frame.setSize(380,480);frame.setVisible(true);frame.setContentPane(createcontentPane());frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);centerFrame();// frame.setBounds(100, 100, 396, 300);frame.setResizable(false);}public Container createcontentPane(){Container contentPane=frame.getContentPane();contentPane.setLayout(new GridLayout(5,1,5,0));//由上至下 4行1列panel_1 = new JPanel();//面板panel_1放置label1和label2panel_1.setLayout(new FlowLayout(FlowLayout.CENTER,5,35));panel_1.setBackground(Color.WHITE);label1 = new JLabel("二分法解方程");label1.setFont(new Font("宋体", Font.BOLD, 18));panel_22= new JPanel();//面板panel_1放置label1和label2panel_22.setLayout(new FlowLayout(FlowLayout.CENTER,5,35));panel_22.setBackground(Color.WHITE);label2 = new JLabel("y=x^3-x-1");label2.setBounds(180, 41, 101, 24);panel_2 = new JPanel();//面板jpanel_2放置a,b,控制误差量panel_2.setBackground(Color.WHITE);panel_2.setLayout(null);labelaa= new JLabel("请输入区间[a,b]中的a:");labelaa.setFont(new Font("宋体", Font.BOLD, 12));labelaa.setBounds(80, 10, 172, 15);textField1 = new JTextField(10);//textField1输入a的值textField1.setBounds(219, 7, 42, 21);labelbb = new JLabel("请输入区间[a,b]中的b:");labelbb.setFont(new Font("宋体", Font.BOLD, 12));labelbb.setBounds(80, 38, 172, 15);textField2 = new JTextField(10);//textField2输入b的值textField2.setBounds(219, 35, 42, 21);label_2 = new JLabel("请输入控制误差量:");label_2.setFont(new Font("宋体", Font.BOLD, 12));label_2.setBounds(80, 63, 117, 15);textField3 = new JTextField(10); //textField3输入控制误差量textField3.setBounds(191, 60, 66, 21);panel_3 = new JPanel();//面板panel_3放置确定和取消按钮panel_3.setBackground(Color.WHITE);panel_3.setLayout(new FlowLayout(FlowLayout.CENTER,20,30));submit = new JButton("确定");//确定按钮submit.addActionListener(this);submit.setHorizontalAlignment(SwingConstants.CENTER);cancel = new JButton("取消");//取消按钮cancel.addActionListener(this);cancel.setHorizontalAlignment(SwingConstants.CENTER);panel_4 = new JPanel();//面板panel_4放置“方程解”标签和输出解文本块panel_4.setBackground(Color.WHITE);panel_4.setLayout(new FlowLayout(FlowLayout.CENTER,5,30));label_3 = new JLabel("方程解为:");label_3.setFont(new Font("宋体", Font.BOLD, 12));label_3.setBounds(24, 8, 65, 15);textField4 = new JTextField();//输出解或区间范围不对textField4.setBounds(99, 5, 97, 15);textField4.setColumns(25);panel_1.add(label1);panel_22.add(label2);panel_2.add(labelaa);panel_2.add(textField1);panel_2.add(labelbb);panel_2.add(textField2);panel_2.add(label_2);//控制误差量panel_2.add(textField3);panel_3.add(submit);panel_3.add(cancel);panel_4.add(label_3);panel_4.add(textField4);contentPane.add(panel_1);contentPane.add(panel_22);contentPane.add(panel_2);contentPane.add(panel_3);contentPane.add(panel_4);return contentPane;}public void centerFrame(){//窗口居中int x,y,screenWidth,screenHeight,frameWidth,frameHeight;Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();screenWidth=screenSize.width;//取得屏幕宽度和高度screenHeight=screenSize.height;frameWidth=frame.getWidth();frameHeight=frame.getHeight();x=(screenWidth-frameWidth)/2;y=(screenHeight-frameHeight)/2;frame.setLocation(x,y);}public void actionPerformed(ActionEvent e) {//事件触发JButton button=(JButton)e.getSource();float a,b,p,w;if(button==submit){String o=textField1.getText();String l=textField2.getText();String m=textField3.getText();a= Float.parseFloat(o);b= Float.parseFloat(l);p= Float.parseFloat(m);w=b-a;if(z(a,b)==true){textField4.setText(String.valueOf(fun(w,b,a,p)));//浮点型强制转换为字符型}if(z(a,b)==false){textField4.setText(String.valueOf("方程值不在所输入的区间内,请选择其他方法"));}}if(button==cancel){textField1.setText("");textField2.setText("");textField3.setText("");}}public static boolean z(float a,float b){//判断区间是否包括零点float a11=y(a);float a21=y(b);if((a11*a21)<0){return true;}elsereturn false;}public static float y(float x){//设置y的函数,y=x^3-x-1float y;y=x*x*x-x-1;return y;}public static float fun(float w,float b,float a,float p){//二分法方程float X=0,x;while(Math.abs(w)>p){w=b-a;x=(a+b)/2;if(Math.abs(y(x))<p){X=x;break;}if(y(a)*y(x)<0){b=x;fun(w, b, a, p);}if(y(x)*y(b)<0){a=x;fun(w, b, a, p);}}return X;}}六、讨论分析。
(完整word版)数值分析报告-二分法和牛顿法方程求根(word文档良心出品)
《数值分析》实验报告一**: **学号: PB********实验一一、实验名称方程求根二、实验目的与要求:通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。
三、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。
(一)二分法算法:给定区间[a,b],并设f (a )与f (b )符号相反,取δ为根的容许误差,ε为值的容许误差。
(1)令c=(a+b)/2(2)如果(c-a)< δ或)(c f <ε,则输出c ,结束;否则执行(3)(3)如果f(a)f(c)<0,则令)()(,c f b f c b ←←;否则,则令)()(,c f a f c a ←←,重复(1),(2),(3)。
(二)牛顿迭代法:给定初值0x ,ε为根的容许误差,η为)(x f 的容许误差,N 为迭代次数的容许值。
(1)如果)(x f <η或迭代次数大于N ,则算法结束;否则执行(2)。
(2)计算)('/)(0001x f x f x x -=(3)若 < 或 < ,则输出 ,程序结束;否则执行(4)。
(4)令 = ,转向(1)。
四、实验题目与程序设计1、二分法3.1.1、用二分法求方程a. f(x)= x x tan 1--在区间[0,π/2]上的根,c. f(x)=6cos 22-++-x e x x 在区间[1,3]上的根。
源程序:3.1.1.a#include<stdio.h>#include<math.h>void main(){float a,b;double c,y,z;printf("plese input two number a and b:\n");scanf("%f%f",&a,&b);c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);while(fabs(b-a)>0.00001|| fabs(y)>0.00001){z=1/a-tan(a);if(z*y<0)b=c;elsea=c;c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);}x x 01-ε)(1x f ηx 1x 0x 1}输入0 1.5707563( /2~1.5705563)得到下表:由上表可以看出刚开始时f(c)取值幅度很大,但是经过一段历程之后,幅度变得平缓甚至基本接近与零,我们认为,x=0.8603是方程的根,结果与实际想要得到的值相当接近。
数值计算方法实验报告
数值计算方法实验报告数值计算方法实验报告引言:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。
在科学研究和工程应用中,数值计算方法被广泛应用于求解方程、优化问题、模拟仿真等领域。
本实验报告将介绍数值计算方法的基本原理和实验结果。
一、二分法求根二分法是一种通过不断折半缩小搜索区间来求解方程根的方法。
在实验中,我们选取了一个简单的方程f(x) = x^2 - 4 = 0来进行求根实验。
通过不断将搜索区间进行二分,我们可以逐步逼近方程的根。
实验结果表明,通过二分法,我们可以得到方程的根为x = 2。
二、牛顿迭代法求根牛顿迭代法是一种通过不断逼近方程根的方法。
在实验中,我们同样选取了方程f(x) = x^2 - 4 = 0进行求根实验。
牛顿迭代法的基本思想是通过对方程进行线性近似,求得近似解,并不断迭代逼近方程的根。
实验结果表明,通过牛顿迭代法,我们可以得到方程的根为x = 2。
三、高斯消元法求解线性方程组高斯消元法是一种通过变换线性方程组的系数矩阵,将其化为上三角矩阵的方法。
在实验中,我们选取了一个简单的线性方程组进行求解实验。
通过对系数矩阵进行行变换,我们可以将其化为上三角矩阵,并通过回代求解得到方程组的解。
实验结果表明,通过高斯消元法,我们可以得到线性方程组的解为x = 1,y = 2,z = 3。
四、插值与拟合插值与拟合是一种通过已知数据点来构造函数模型的方法。
在实验中,我们选取了一组数据点进行插值与拟合实验。
通过拉格朗日插值多项式和最小二乘法拟合,我们可以得到数据点之间的函数模型。
实验结果表明,通过插值与拟合,我们可以得到数据点之间的函数关系,并可以通过该函数模型来进行预测和拟合。
结论:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。
通过本次实验,我们学习了二分法求根、牛顿迭代法求根、高斯消元法求解线性方程组以及插值与拟合的基本原理和应用。
这些方法在科学研究和工程应用中具有广泛的应用前景。
二分法实验报告
实验报告方程求根——二分法一、目的和要求1)通过对二分法的编程练习,掌握方程求根的二分法的算法;2)通过对二分法的上机运算,进一步体会二分法的特点。
二、实习内容1)二分法的编程实现。
2)进行有根区间和误差限的比较和讨论。
三、算法流程图:1)准备:计算f(x)在有根区间[a, b]端点处的值f(a), f(b)。
2)二分:计算f(x)在区间中点c=2ba处的函数值f(c)。
3)判断•若f(c)与f(a)异号,则根位于区间[a, c]内,以c代替b;•若f(c)与f(a)同号,则根位于区间[c, b]内,以c代替a;四、实验步骤1)完成二分法的程序设计及录入;2)完成程序的编译和链接,并进行修改;3)用书上的例子对程序进行验证,并进行修改;4)对比估算次数与实际二分次数;5)输入不同的区间初值a, b,查看二分次数的变化;6)输入不同的误差限,查看二分次数的变化;7)完成实验报告。
五、实验结果1.经编译、链接及例子验证结果正确的源程序:#include <stdio.h>#include <math.h>float f(float x);void main(){float a,b,c,EPS,DELTA,fa,fb,fc,fab;int i=1;printf("please input a,b,EPS,DELTA\n");scanf("%f%f%f%f",&a,&b,&EPS,&DELTA);fa=f(a);fb=f(b);fab=fa*fb;if(fab>0)printf("无根");while(fab<0){c=(a+b)/2;fc=f(c);if((fa*fc)<0){b=c;fb=fc;printf("%d %20f %20f\n",i,c,fc);i++;}else if((fb*fc)<0){a=c;fa=fc;printf("%d %20f %20f\n",i,c,fc);i++;}if( fabs(fc)<DELTA || (b-a)<EPS ){printf("输出c为:%f\n",c);break;}}}float f(float x){float f;f=x*x*x+x*x-3*x-3;return f;}2. 实例验证结果:1)方程:f(x)=x3+x2-3x-3=02)输入初始参数:a=1, b=2, EPS=5e-63)结果输出:3. 改变a, b的值为:a=0, b=2, EPS不变,仍为5e-6,其结果为:4. 改变EPS的值为:EPS=5e-4, a, b不变,仍为a=1, b=2,其结果为:六、分析和讨论1.估算次数与实际二分次数的分析和讨论估算次数总是比实际二分次数少一次。
数值计算 二分法 实验报告
[k,a,b,x,wuca,ya,yb,yx]
if yx==0
a=x; b=x;
elseif yb*yx>0
b=x;yb=yx;
else
a=x; ya=yx;
end
if b-a< abtol , return, end
end
k=max1; x; wuca; yx=fun(x);
《计算方法》数值实验报告
班级
090711
学号
43
姓名
杨树成
实验室
3-102
设备编号
07
日期
2012.06.01
实验题目
编写二分法的MATLAB主程序并验算书P深对二分算法的理解。应用所编程序解决实际算例。
2、实验要求:
(1)认真分析课题要求,复习相关理论知识,选择适当的解决方案;
(4)运行结果
a=0.3
b=0.4
abtol=0.5e-2
x = 0.33906, yx= -0.00397
4、实验小结体会:
1、进一步加深了对二分法的理解与应用的能力。
2、在运用MATLAB的过程中,通过对for循环结构的运用,帮助我复习了上学期所学的MATLAB程序结构。让我对顺序、选择、循环三种程序结构有了更好的认识,进一步巩固运用MATLAB编程的能力。
并有 , ,且后一区间的长度都是前一区间长度的一半,所以 的长度为 。当 时,区间 的长度必趋于零,即这些区间最终收缩于一点 ,显然 就是方程 的根。
(3)源程序
function [k,x,wuca,yx]=erfen(a,b,abtol)
a(1)=a; b(1)=b;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=k+1;
end
x=(a+b)/2;
end
函数2:
function [ f ] = func1( x )
f=sqrt(x^2+1)-tan(x);
end
三、实验数据:
求方程f(x)= 在区间[0,π/2]内的实根,是精度达到10^-5
在命令窗口中输入:
f=@func1;[x0,k]=dichotomy(0,pi/2,f,10^-5)
输出结果如下:
x0 =0.9415
k =18
四、实验数据分析及结论:
结果分析:
f=feval(f,x0)
f =3.9345e-06趋近于0,所以x0是方程f(x)= 在区间[0,π/2]内的近似实根。
%f表示所求解方程的函数名
%emg是精度指标
%x表示所求近似解
%k表示循环次数
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=0;
while abs(b-a)>emg
if fab==0
x=(a+b)/2;
return;
elseif fa*fab<0
b=(a+b)/2;
else a=(a+b)/2;
对二分法的分析:
二分法的优点是算法简单,且总是收敛的,缺点是收敛速度太慢,一个可取的办法是用二分法为后面的加速算法加上适当的初值。
计算方法实验报告(实验名称方程求根—来自二分法姓名李鹏飞
学号
2012221104210026
专业年级
12级计科一班
一、实验目的:
用二分法求解非线性方程f(x)=0在区间[a,b]内的根
二、实验代码:
函数1:
function [ x,k ] = dichotomy( a,b,f,emg )
%a,b表示求解区间[a,b]的端点