计算方法实验一-二分法
- 格式:docx
- 大小:571.17 KB
- 文档页数:4
数学计算方法实验报告习题二2.估计用二分法求方程f(x)=x3+4x2-10=0在区间[1,2]内根的近似值,为使方程不超过10时所需的二分次数。
f(x k)程序过程:function two (tolerance)a=1;b=2;counter=0;while (abs(b-a)>tolerance)c=(a+b)/2;fa=a^3+4*a^2-10;fb=b^3+4*b^2-10;fc=c^3+4*c^2-10;if ((fa==0|fb==0)) disp(counter);elseif (fa*fc<0)b=c;counter=counter+1;elseif (fb*fc<0)a=c;counter=counter+1;elseif (fb==0)disp(counter);endendsolution=(a+b)/2;disp(solution);disp(counter);实验结果:6.取x0=1.5,用牛顿迭代法求第三中的方程根.f(x)=x3+4x2-10=0的近似值(精确到||x k+1-x k|≦10-5,并将迭代次数与3题比较。
程序过程:function six (g)a=1.5;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=1;while(abs(b-a)>g)a=b;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=k+1;endformat long;disp(a);disp(k);实验结果:程序结果计算结果8.用弦割法求方程f(x)=x3-3x2-x+9=0在区间[-2,-1]内的一个实根近似值x k,|f(x k)|≦10-5.程序过程:function eight (t)a=-2;b=-1;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=1;while(abs(c-b)>t)a=b;b=c;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=k+1;endformat long;disp(k);disp(b);实验结果: 计算结果9.用艾特肯算法求方程x3+4x2-10=0在区间[1,2]内的根的近似值(取x0=1.5,g(x)=410 x ,精确到|x k+1-x k |≦10-5,并与2,3,6结果比较。
实验一方程求根(1)二分法
1、实验程序
实现二分法的MATLAB函数文件agui_bisect.m
2. 在MATLAB命令窗口输入及实验结果及操作界面
(2)迭代法
1、实验程序
实现二分法的MATLAB函数文件agui_iterative.m
2、在MATLAB命令窗口输入及实验结果及操作界面
(3)牛顿法
1、实验程序
实现二分法的MATLAB函数文件agui_newton.m
2、在MATLAB命令窗口输入及实验结果及操作界面
结果分析:
由上面的对二分法、迭代法、牛顿法三种方法的三次实验结果,我们可以得出这样的结论:
二分法要循环k=10次,迭代法要迭代k=4次,牛顿法要迭代k=2次才能达到精度为0.5*10^-3的要求,而且方程0210=-+x e x
的精确解经计算,为0.0905250,由此可知,牛顿法和迭代法的精确度要优越于二分法。
而这三种方法中,牛顿法不仅计算量少,而且精确度高。
从而可知牛顿迭代法收敛速度明显加快,但由所学的内容可知,其收敛性与初值有关,它是局部收敛的。
二分法收敛虽然是速度最慢,但也常用于求精度不高的近似根。
而迭代法是逐次逼近的方法,原理简单,但存在收敛性和收敛速度的问题。
总之各种方法都各有优劣,适用于不同的情况中,须具体情况具体分析。
数值计算方法实验报告实验目的:通过实验验证不同数值计算方法在求解数学问题时的精度和效率,并分析其优缺点。
实验原理:实验内容:本实验选取了三个典型的数值计算问题,并分别采用了二分法、牛顿迭代法和梯度下降法进行求解。
具体问题和求解方法如下:1. 问题一:求解方程sin(x)=0的解。
-二分法:利用函数值的符号变化将解空间不断缩小,直到找到满足精度要求的解。
-牛顿迭代法:通过使用函数的斜率来逼近方程的解,并不断逼近真实解。
-梯度下降法:将方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到方程的解。
2.问题二:求解函数f(x)=x^2-3x+2的极小值点。
-二分法:通过确定函数在一个区间内的变化趋势,将极小值所在的区间不断缩小,从而找到极小值点。
-牛顿迭代法:通过使用函数的导数和二阶导数来逼近极小值点,并不断逼近真实解。
-梯度下降法:将函数转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到函数的极小值点。
3. 问题三:求解微分方程dy/dx = -0.1*y的解。
-二分法:通过离散化微分方程,将微分方程转化为一个差分方程,然后通过迭代计算不同点的函数值,从而得到函数的近似解。
-牛顿迭代法:将微分方程转化为一个积分方程,并通过迭代计算得到不同点的函数值,从而得到函数的近似解。
-梯度下降法:将微分方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,从而得到函数的近似解。
实验步骤:1.编写代码实现各个数值计算方法的求解过程。
2.对每个数值计算问题,设置合适的初始值和终止条件。
3.运行程序,记录求解过程中的迭代次数和每次迭代的结果。
4.比较不同数值计算方法的精度和效率,并分析其优缺点。
实验结果:经过实验测试,得到了如下结果:-问题一的二分法迭代次数为10次,求解结果为x=0;牛顿迭代法迭代次数为4次,求解结果为x=0;梯度下降法迭代次数为6次,求解结果为x=0。
-问题二的二分法迭代次数为10次,求解结果为x=1;牛顿迭代法迭代次数为3次,求解结果为x=1;梯度下降法迭代次数为4次,求解结果为x=1-问题三的二分法迭代次数为100次,求解结果为y=e^(-0.1x);牛顿迭代法迭代次数为5次,求解结果为y=e^(-0.1x);梯度下降法迭代次数为10次,求解结果为y=e^(-0.1x)。
MAAB计算方法迭代法牛顿法二分法实验报告实验目的:比较MAAB计算方法中迭代法、牛顿法和二分法的优缺点,探究它们在求解方程中的应用效果。
实验原理:1、迭代法:将方程转化为x=f(x)的形式,通过不断迭代逼近方程的根。
2、牛顿法:利用函数在特定点的切线逼近根的位置,通过不断迭代找到方程的根。
3、二分法:利用函数值在区间两端的异号性质,通过不断二分缩小区间,最终逼近方程的根。
实验步骤:1、选择一元方程进行求解,并根据方程选择不同的计算方法。
2、在迭代法中,根据给定的初始值和迭代公式,进行迭代计算,直到满足预设的迭代精度要求。
3、在牛顿法中,选择初始点,并根据切线方程进行迭代计算,直到满足预设的迭代精度要求。
4、在二分法中,选择区间,并根据函数值的异号性质进行二分,直到满足预设的迭代精度要求。
5、根据计算结果,比较三种方法的求解效果,包括迭代次数、计算时间、求解精度等指标。
实验结果与分析:通过对多个方程进行测试,得到了以下实验结果:1、迭代法的优点是简单易懂,适用范围广,但当迭代公式不收敛时会导致计算结果不准确。
2、牛顿法的优点是收敛速度较快,但需要计算函数的一阶导数和二阶导数,对于复杂函数较难求解。
3、二分法的优点是收敛性较好,不需要导数信息,但收敛速度较慢。
4、对于线性方程和非线性方程的求解,牛顿法和迭代法通常比二分法更快速收敛。
5、对于多重根的方程,二分法没有明显优势,而牛顿法和迭代法能更好地逼近根的位置。
6、在不同的方程和初值选择下,三种方法的迭代次数和求解精度略有差异。
7、在时间效率方面,二分法在收敛速度较慢的同时,迭代次数较少,牛顿法在收敛速度较快的同时,迭代次数较多,而迭代法对于不同方程有较好的平衡。
结论:1、对于不同类型的方程求解,可以根据具体情况选择合适的计算方法。
2、迭代法、牛顿法和二分法各有优缺点,没有绝对的最优方法,需要权衡各种因素选择最适合的方法。
3、在实际应用中,可以根据方程的特点和精度要求综合考虑不同方法的优劣势,以获得较好的求解效果。
《数值分析》实验报告实验一方程求根一、实验目的:掌握二分法、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轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。
MATLAB计算方法迭代法牛顿法二分法实验报告实验报告一、引言计算方法是数学的一门重要应用学科,它研究如何用计算机来解决数学问题。
其中,迭代法、牛顿法和二分法是计算方法中常用的数值计算方法。
本实验通过使用MATLAB软件,对这三种方法进行实验研究,比较它们的收敛速度、计算精度等指标,以及它们在不同类型的问题中的适用性。
二、实验方法1.迭代法迭代法是通过不断逼近解的过程来求得方程的根。
在本实验中,我们选择一个一元方程f(x)=0来测试迭代法的效果。
首先,我们对给定的初始近似解x0进行计算,得到新的近似解x1,然后再以x1为初始近似解进行计算,得到新的近似解x2,以此类推。
直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对复杂方程的迭代计算来评估迭代法的性能。
2.牛顿法牛顿法通过使用函数的一阶导数来逼近方程的根。
具体而言,对于给定的初始近似解x0,通过将f(x)在x0处展开成泰勒级数,并保留其中一阶导数的项,得到一个近似线性方程。
然后,通过求解这个近似线性方程的解x1,再以x1为初始近似解进行计算,得到新的近似解x2,以此类推,直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对不同类型的方程进行牛顿法的求解,评估它的性能。
3.二分法二分法是通过将给定区间不断二分并判断根是否在区间内来求方程的根。
具体而言,对于给定的初始区间[a,b],首先计算区间[a,b]的中点c,并判断f(c)与0的大小关系。
如果f(c)大于0,说明解在区间[a,c]内,将新的区间定义为[a,c],再进行下一轮的计算。
如果f(c)小于0,说明解在区间[c,b]内,将新的区间定义为[c,b],再进行下一轮的计算。
直到新的区间的长度小于规定的误差阈值为止。
本实验将通过对复杂方程的二分计算来评估二分法的性能。
三、实验结果通过对一系列测试函数的计算,我们得到了迭代法、牛顿法和二分法的计算结果,并进行了比较。
本科生实验报告实验课程数值计算方法学院名称信息科学与技术学院专业名称计算机科学与技术学生姓名学生学号指导教师实验地址实验成绩二〇一六年五月二〇一六年五月1实验一 非线性方程求根1.1问题描绘实验目的:掌握非线性方程求根的基本步骤及方法, 。
实验内容:试分别用二分法、简单迭代法、Newton 迭代法、弦截法(割线法、双点弦法),求x 5-3x 3+x-1=0在区间[-8,8]上的所有实根,偏差限为10-6。
要求:议论求解的全过程,对所用算法的局部收敛性,优弊端等作剖析及比 较,第2章算法思想2.1二分法思想:在函数的单一有根区间内,将有根区间不停的二分,找寻方程的解。
步骤:1.取中点mid=(x0+x1)/2 2.若f(mid)=0,则mid 为方程的根,不然比较与两头的符号,若与f(x0) 异号,则根在[x0,mid]之间,不然在[mid,x1]之间。
3并重复上述步骤,直抵达到精度要求,则 mid 为方程的近似解。
开始读入a,b,emid=(a+b)/2 F(a)*f(b)<0是 a=mid b=mid no |a-b|<e? yes 输出mid结束22.2简单迭代法思想:迭代法是一种逐次迫近的方法,它是固定公式频频校订跟的近似值,使之逐渐精准,最后获得精度要求的结果。
步骤:1.结构迭代公式f(x),迭代公式一定是收敛的。
2.计算x1,x1=f(x0).3.判断|x1-x0|能否知足精度要求,如不知足则重复上述步骤。
4.输出x1,即为方程的近似解。
开始输入x0,eX1=f(x0)f为迭代函数X1=x0;No|x1-x0|<eyes输出x1结束32.3Newton迭代法思想:设r是的根,选用作为r的初始近似值,过点做曲线的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。
过点做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。
重复以上过程,得r的近似值序列,此中,称为r的次近似值步骤:1.计算原函数的导数f’(x);结构牛顿迭代公式2.计算,若f’(x0)=0,退出计算,不然持续向下迭代。
计算方法上机实验报告土木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 越靠近根时越慢。
二分法实验报告二分法实验报告引言:二分法是一种常用的数值计算方法,广泛应用于求解方程的根、函数的最值等问题。
本实验旨在通过对二分法的实际应用,探讨其原理和优势,并对其在不同场景下的适用性进行分析。
一、二分法原理及步骤二分法,又称折半法,是一种通过不断缩小搜索范围来逼近目标的方法。
其基本原理是将待搜索的区间不断二分,然后根据目标值与中间值的关系,确定下一步搜索的范围,直至找到目标或满足精度要求。
具体步骤如下: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。
通过与解析解进行对比,我们发现二分法得到的结果非常接近真实值,证明了二分法在求解函数最值的问题上的有效性。
学院 长望学院 专业 大气科学实验班 年级 班次 1 姓名 仙女 学号
1. 引言-问题重述
问题一要求对方程3()250f x x x =--=,用二分法,至少找到一个根,并展示一下信息:(a )近似根(b )初始猜测(区间)(c )迭代次数(d )停止准则(3)收敛速度 问题二要求用二分法求出以下两个方程的近似根:
(a )5()10f x x x =--=,
(b )22520x e x -+=.
2. 数学公式-数值方法和参数定义
二分法求根原理为:若[,]f C a b ∈,严格单调,且()()0f a f b <g ,则f 在(,)a b 上有一实根。
其基本思想为:逐步将区间分半,计算中点处的函数值,根据介值定理选择比原区间缩小一半的有根区间,如此继续下去,直到得到满足精度要求,从而求出满足给定精度的根的近似值。
针对问题一,本文根据方程,定义函数f(x)=a*x*x*x+b*x*x+c*x+d=0,其中,,,a b c d 为各项系数;精度16eps e =-;,m n 分别为求根区间的左右端点,即收敛区间[,]m n ;i 为近似根;v 为收敛速度,count 为当前迭代次数。
其中,count 为单精度int 类型,其余均为双精度double 类型。
基于以上参数定义,设置收敛准则为:当根和函数值的精度小于所设置精度时,结束循环,并输出收敛区间、迭代次数、近似根以及收敛速度。
具体表现为:每进行一次循环视近似根i 的相对位置对收敛区间进行修正,同时对迭代次数+1;收敛速度可通过下式计算:
11
n n n n x x v x x +--=-. 针对问题二(a )在问题一的基础上,更改方程f(x)=a*x*x*x+b*x*x+c*x+d=0的系数以及相关项即可求得相应结果。
对于(b )将方程改为:exp(2*x)-5*x*x+20=。
3. 数值实验-讨论和分析数值结果
针对方程3()250f x x x =--=,首先对其求导,判断单调性,再进行需略估算,发现(2)(3)0f f <g ,于是设置初始收敛区间为[2,3],进而通过二分法求得结果如图1。
结果为:迭代次数21次,近似跟* 2.094551x =,收敛速度为0.5.
针对方程5()10f x x x =--=,通过人工求导,判断单调性,粗略估算初始收敛区间为[1,2],同样,通过二分法求解,结果如图2。
结果为:迭代次数21,近似跟* 1.167304x =,收敛速度为0.5.
针对方程22520x e x -+=,通过求导,判断单调性,粗略估算初始收敛区间为[1,0]-,
学院 长望学院 专业 大气科学实验班 年级 班次 1 姓名 仙女 学号 同样,通过二分法求解,结果如图2。
结果为:迭代次数17次,近似跟*0.672398x =-,收敛速度为0.5.
图1 方程3
()250f x x x =--=的求解结果
图2 方程5()10f x x x =--=的求解结果
学院 长望学院 专业 大气科学实验班 年级 班次 1 姓名 仙女 学号
图3 方程22520x e x -+=的求解结果
4. 结论 二分法算法简单,容易理解,且总是收敛的,收敛速度与方程无关,恒为0.5,速度较慢,当精度为16eps e =-时,迭代次数基本在15~25之间。
然而,仅适用于单调函数,当所求函数非单调时,须进行预估;此外,不能求复根、偶数重根等。
5. 程序
#include <stdio.h>
#include <math.h>
const double eps = 0.5*1e-6; //定义我们计算的精度
double a,b,c,d;//假定我们输入的函数是一元三次方程组,a*x*x*x+b*x*x+c*x+d=0 double f(double x) //定义我们的函数
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
int count=0;
double m,n,v=0.0;//求根区间[m,n]
double i,j,sum;
printf("请输入一元三次方程组的系数:a,b,c,d:");
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
学院长望学院专业大气科学实验班年级班次 1 姓名仙女学号
printf("\n请输入初始求根区间[m,n]:");
scanf("%lf%lf",&m,&n);
if(f(m)*f(n)<0)
{
while(fabs(m-n)>eps)
{
i=(m+n)/2.0;
sum=f(i);
printf("第%d次迭代区间为:[%lf,%lf] 近似根:%lf 函数值:%lf\n",count,m,n,i,sum);
if(fabs(sum)<eps)//停止准则
{
break;
}
else if(f(i)*f(m)<0)
{
n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
}
else if(f(i)*f(n)<0)
{
m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
}
count++;
}
}
/*else{
printf("请输入正确的初始求根区间") ;
} */
printf("收敛区间:[%lf,%lf]\n迭代次数:%d",m,n,count);
j=(m+n)/2;
v=(m-j)/(n-m);
v=fabs(v);
printf("\n该方程组的近似根:x*=%lf\n收敛速度:%lf\n",j,v);
return 0;
}。