数值分析-二分法 实验报告
数值分析实验报告62338
数值分析实验报告(第二章)实验题目:分别用二分法、牛顿迭代法、割线法、史蒂芬森迭代法求方程的根,观察不同初始值下的收敛性,并给出结论。
问题分析:题目有以下几点要求:1.不同的迭代法计算根,并比较收敛性。
2.选定不同的初始值,比较收敛性.实验原理:各个迭代法简述二分法:取有根区间的重点,确定新的有根区间的区间长度仅为区间长度的一版。
对压缩了的有根区间重复以上过程,又得到新的有根区间,其区间长度为的一半,如此反复,……,可得一系列有根区间,区间收敛到一个点即为根。
牛顿迭代法:不动点迭代法的一种特例,具有局部二次收敛的特性。
迭代格式为割线法:是牛顿法的改进,具有超线性收敛的特性,收敛阶为1。
618. 迭代格式为史蒂芬森迭代法:采用不动点迭代进行预估校正。
至少是平方收敛的。
迭代格式为这里可采用牛顿迭代法的迭代函数。
实验内容:1.写出该问题的函数代码如下:function py= f(x)syms k;y=(k^2+1)*(k—1)^5;yy=diff(y,k);py(1)=subs(y,k,x);py(2)=subs(yy,k,x);end2.分别写出各个迭代法的迭代函数代码如下:二分法:function y=dichotomie(a,b,e)i=2;m(1)=a;while abs(a-b)〉et=(a+b)/2;s1=f(a);s2=f(b);s3=f(t);if s1(1)*s3(1)<=0b=t;elsea=t;endm(i)=t;i=i+1;endy=[t,i+1,m];end牛顿迭代法:function y=NewtonIterative(x,e)i=2;en=2*e;m(1)=x;while abs(en)〉=es=f(x);t=x—s(1)/s(2);en=t—x;x=t;m(i)=t;i=i+1;endy=[x,i+1,m];end牛顿割线法:function y=Secant(x1,x2,e)i=3;m(1)=x1,m(2)=x2;while abs(x2—x1)〉=es1=f(x1);s2=f(x2);t=x2—(x2—x1)*s2(1)/(s2(1)—s1(1));x1=x2;x2=t;m(i)=t;i=i+1;endy=[x2,i+1,m];end史蒂芬森迭代法:Function p=StephensonIterative(x,e)i=2;m(2)=x;en=2*e;while abs(en)〉=ey=fai(x);z=fai(y);t=x—(y-x)^2/(z—2*y+x); en=t-x;x=t;m(i)=t;i=i+1;endp=[x,i+1,m];end3.因为经常被使用,故可以写一个函数。
计算方法,二分法实验报告
实验报告 ___二分法班级: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轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。
武汉理工大学计算机学院数值分析实验报告
武汉理工大学计算机学院数值分析实验报告武汉理工大学计算机学院数值分析实验报告篇一:数值分析实验报告学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级数值分析计算机科学与技术学院熊盛武 201X—— 201X学年第二学期实验课程名称:数值分析篇二:数值分析实验报告武汉理工大学学生实验报告书实验课程名称:数值分析开课名学生姓名:201X1—— 201X学年第二学期第一次试验(1)二分法计算流程图:简单迭代法算法流程图:(2)(3)牛顿迭代法流程图:(4)弦截法算法程序流程图:篇三:数值分析实验报告湖北民族学院理学院《数值分析》课程实验报告(一)湖北民族学院理学院《数值分析》课程实验报告(二) xn?)篇四:数值分析实验报告数值分析实验报告姓名:学号:学院:老师: XXX XXXX实验一一、实验内容用雅克比迭代法和高斯塞德尔迭代法求解课本例3.1,设置精度为10-6。
?8-32??x1??20???411?1??x233??6312??x??36? ??3??二、实验公式 ?? 雅克比迭代法的基本思想:设方程组Ax?b的系数矩阵的对角线元素 ??aii?0(i?1,2,...,n),根据方程组A x?b推导出一个迭代公式,然后将任意选取的?(0)?(1)?(1)?(2) xxx x一初始向量代入迭代公式,求出,再以代入同一迭代公式,求出,1、雅克比迭代法 ?(k)?(k) {x}{x}收敛时,如此反复进行,得到向量序列。
当其极限即为原方程组的解。
2、高斯塞德尔迭代法:在雅可比(Jacbi)迭代法中,如果当新的分量求出后,马上用它来代替旧的分量,则可能会更快地接近方程组的准确解。
基于这种设想构造的迭代公式称为高斯-塞德尔(Ga uss-Seidel)迭代法。
数值分析原理实验报告
一、实验目的通过本次实验,掌握数值分析的基本原理和方法,了解数值分析在科学和工程领域的应用,培养动手能力和分析问题的能力。
二、实验内容1. 二分法求方程根(1)原理:二分法是一种在实数域上寻找函数零点的算法。
对于连续函数f(x),如果在区间[a, b]上f(a)f(b)<0,则存在一个根在区间(a, b)内。
二分法的基本思想是将区间[a, b]不断二分,缩小根所在的区间,直到满足精度要求。
(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化区间[a, b]和中间点c=a+(b-a)/2;③ 判断f(c)与f(a)的符号,若符号相同,则将区间缩小为[a, c],否则缩小为[c,b];④ 重复步骤②和③,直到满足精度要求;⑤ 输出根的近似值。
2. 牛顿法求方程根(1)原理:牛顿法是一种在实数域上寻找函数零点的算法。
对于可导函数f(x),如果在点x0附近,f(x0)f'(x0)≠0,则存在一个根在点x0附近。
牛顿法的基本思想是通过泰勒展开近似函数,然后求解近似方程的根。
(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化迭代次数n=0,近似根x0;③ 计算导数f'(x0);④ 求解近似方程x1=x0-f(x0)/f'(x0);⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1,n=n+1,返回步骤③。
3. 雅可比迭代法解线性方程组(1)原理:雅可比迭代法是一种解线性方程组的迭代算法。
对于线性方程组Ax=b,雅可比迭代法的基本思想是利用矩阵A的对角线元素将方程组分解为多个一元线性方程,然后逐个求解。
(2)实验步骤:① 输入系数矩阵A和常数向量b;② 初始化迭代次数n=0,近似解向量x0;③ 计算对角线元素d1, d2, ..., dn;④ 更新近似解向量x1=x0-A/d1, x2=x0-A/d2, ..., xn=x0-A/dn;⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1, x2, ..., xn,n=n+1,返回步骤③。
数值分析上机实践报告
数值分析上机实践报告一、实验目的本次实验主要目的是通过上机操作,加深对数值分析算法的理解,并熟悉使用Matlab进行数值计算的基本方法。
在具体实验中,我们将实现三种常见的数值分析算法:二分法、牛顿法和追赶法,分别应用于解决非线性方程、方程组和线性方程组的求解问题。
二、实验原理与方法1.二分法二分法是一种常见的求解非线性方程的数值方法。
根据函数在给定区间端点处的函数值的符号,不断缩小区间的长度,直到满足精度要求。
2.牛顿法牛顿法是求解方程的一种迭代方法,通过构造方程的泰勒展开式进行近似求解。
根据泰勒展式可以得到迭代公式,利用迭代公式不断逼近方程的解。
3.追赶法追赶法是用于求解三对角线性方程组的一种直接求解方法。
通过构造追赶矩阵,采用较为简便的向前追赶和向后追赶的方法进行计算。
本次实验中,我们选择了一组非线性方程、方程组和线性方程组进行求解。
具体的实验步骤如下:1.调用二分法函数,通过输入给定区间的上下界、截止误差和最大迭代次数,得到非线性方程的数值解。
2.调用牛顿法函数,通过输入初始迭代点、截止误差和最大迭代次数,得到方程组的数值解。
3.调用追赶法函数,通过输入追赶矩阵的三个向量与结果向量,得到线性方程组的数值解。
三、实验结果与分析在进行实验过程中,我们分别给定了不同的参数,通过调用相应的函数得到了实验结果。
下面是实验结果的汇总及分析。
1.非线性方程的数值解我们通过使用二分法对非线性方程进行求解,给定了区间的上下界、截止误差和最大迭代次数。
实验结果显示,根据给定的输入,我们得到了方程的数值解。
通过与解析解进行比较,可以发现二分法得到的数值解与解析解的误差在可接受范围内,说明二分法是有效的。
2.方程组的数值解我们通过使用牛顿法对方程组进行求解,给定了初始迭代点、截止误差和最大迭代次数。
实验结果显示,根据给定的输入,我们得到了方程组的数值解。
与解析解进行比较,同样可以发现牛顿法得到的数值解与解析解的误差在可接受范围内,说明牛顿法是有效的。
数值分析实验报告62338
m(1)=x1,m(2)=x2; while abs(x2-x1)>=e
s1=f(x1); s2=f(x2); t=x2—(x2—x1)*s2(1)/(s2(1) -s1(1)); x1=x2; x2=t; m(i)=t; i=i+1; end y=[x2,i+1,m]; end 史蒂芬森迭代法: Function
1
2
3
4
5
图 1.2 不同迭代法下迭代值得收敛情况
二分法收敛效果较差,牛顿迭代法和牛顿割线法相近,史蒂芬森迭代法收敛 次数高于 1,效果最好 3. 不同初值的收敛情况
二分法
2
6
5 1
4
3 0
2
-1
1
0 -2
-1
-2 -3
-3
-4
-4
0
10 20
30
40
0
牛顿迭代法
50
100
150
图 1.3 二分法,牛顿迭代法下不同初值的收敛情况
牛顿割线法 8
史蒂芬森迭代法 2.5
6
2 4
2
1.5
0
-2
1
-4 0.5
-6
-8
0
0
20
40
60
80
0
2
4
6
8
图 1.4 牛顿割线法,史蒂芬森迭代法下不同初值的收敛情况
1. 二分法的五个初始区间分别为
《数值分析实验》实验
数值分析实验实验1 方程求根一、实验目的:1.掌握常用的求非线性方程近似根的数值方法,用所学方法求非线性方程满足指定精度要求的数值解,比较各种方法的异同点并进行收敛性分析。
2.通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点。
3.编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
二、实验内容:1.用二分法求方程0104)(23=-+=x x x f 在1.5附近的根。
2.用牛顿迭代法求方程033)(23=--+=x x x x f 在1.5附近的根。
3.用简单迭代法求解非线性方程3sin )1(2=-+x x 的根。
取迭代函数)1sin 3(*5.0)(2x x x --+=ϕ,精度取2101-⨯4.(选做)用牛顿法求下列方程的根: (1)02=-x e x ; (2)01=-x xe ; (3)02lg =-+x x 。
5.(选做)编写一个弦截法程序,求解题目4中的方程。
6.(选做)Matlab 函数fzero 可用于求解非线性方程的根。
例如,fzero(@(x) x^3+4*x^2-10, 1.5)可以求解题目1。
尝试用此方法求解实验中的其他题三、实验要求:1.程序要添加适当的注释,程序的书写要采用缩进格式。
2.程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
3.程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
四、实验步骤1.按照实验内容和实验要求编写代码 2.编译并运行代码 3.检查是否发生错误五、实验源代码与实验结果实验1源代码:运行结果:实验2源代码:运行结果:实验3源代码:运行结果:4(1)的源代码:运行结果:4(2)的源代码:运行结果:4(3)的源代码:运行结果:5(3)的源代码:运行结果:六、实验心得体会通过本次实验我加深了对二分法、简单迭代法、牛顿迭代法和弦截法算法思想的了解,并对各个不同方法的优劣有了更深的理解。
数值分析实验报告模板
数值分析实验报告模板篇一:数值分析实验报告(一)(完整)数值分析实验报告12345篇二:数值分析实验报告实验报告一题目:非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。
本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。
利用二分法求解给定非线性方程的根,在给定的范围内,假设f(x,y)在[a,b]上连续,f(a)xf(b) 直接影响迭代的次数甚至迭代的收敛与发散。
即若x0 偏离所求根较远,Newton法可能发散的结论。
并且本实验中还利用利用改进的Newton法求解同样的方程,且将结果与Newton法的结果比较分析。
前言:(目的和意义)掌握二分法与Newton法的基本原理和应用。
掌握二分法的原理,验证二分法,在选对有根区间的前提下,必是收敛,但精度不够。
熟悉Matlab语言编程,学习编程要点。
体会Newton使用时的优点,和局部收敛性,而在初值选取不当时,会发散。
数学原理:对于一个非线性方程的数值解法很多。
在此介绍两种最常见的方法:二分法和Newton法。
对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b) Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式xk?1?xk?f(xk) f'(xk)产生逼近解x*的迭代数列{xk},这就是Newton法的思想。
当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。
另外,若将该迭代公式改进为xk?1?xk?rf(xk) 'f(xk)其中r为要求的方程的根的重数,这就是改进的Newton 法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。
程序设计:本实验采用Matlab的M文件编写。
其中待求解的方程写成function的方式,如下function y=f(x);y=-x*x-sin(x);写成如上形式即可,下面给出主程序。
数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)
for k=1:N
x=(a+b)/2;
fx=feval(f,x);fa=feval(f,a);
if abs((b-a)/2)<e || abs(fx)<e
disp('the number of iterations is');k
f=input('please enter a function:f(x)=');
x0=input('please enter the initial value:x0=');
e=input('please enter error:e=');
N=input('please enter the largest number of iterations:N=');
disp('the approximate solution is');x
disp('f(x) is');fx
disp('the number of iterations is');k
return
else
x0=x;
end
end
end
disp('The maximum number of iterations is reached, stop calculation');
开课学院、实验室:实验时间:2014年1月1日
课程
名称
数值分析基础性实验
实验项目
名称
数值计算算法及实现
数值分析实验报告(二分法求年利率)
《数值分析》课程实验报告【实验内容与要求】每个月存250元,并持续20年,希望在20年后本金和利息的总值达到250000元。
年利率x 为多少时可以满足需求?【算法说明】1. 将方程简化,然后用二分法逼近方程的根,从而求解。
2. 二分法求解思想方程 f(x)=0在区域【a,b 】内求解 A. 计算端点的值f(a),f(b);B. 计算f(x)在区间中点(a+b )/2处的值,即)2ba f(+的值; C. 若0)2ba f(=+则(a+b )/2就是方程的根,计算过程结束,否则继续检验: 若0)(f )2ba f(<+a ,则以(a+b )/2代替b,否则以(a+b )/2代替a. 反复执行步骤B,C 直到区间【a,b 】的长度小于允许误差ε,此时中点(a+b )/2即为所有近似根。
【源程序】程序1(ps:二分法) #include <math.h> #include <stdio.h> //float p; //int n; int m=250000; void main() { float x,x1=0,x2=1;float p;int n;float F(float x,float x1,float x2);printf("请输入每个月存入的金额p和存款年份n的值:\n");scanf("%f%d",&p,&n);printf("x=%f\n",F(x,x1,x2));}float F(float x,float x1,float x2){float f,f1,f2;float p;int n;do{f1=(p*12/x1)*(pow((1+x1/12),n*12)-1)-m;f2=(p*12/x2)*(pow((1+x2/12),n*12)-1)-m;}while(f1*f2>0); //确保输入的x1,x2使得f1,f2符号相反do{x=(x1+x2)/2; //求x1,x2的中点f=(p*12/x)*(pow((1+x/12),n*12)-1)-m;if(f1*f>0) //当f与f1符号相同时{x1=x;f1=f;}else if(f2*f>0) //当f与f2符号相同时{x2=x;f2=f;}}while(fabs(f)>1e-6); //判断条件fabs(f)>1e-6的意思是f的值趋于0 return x;}程序2(ps:程序二是根据题意及结果分析直接写的代码,并没有用二分法)#include<iostream>#include <math.h>using namespace std;double sum=250;//sum表示总的本息和double fun(double x){//计算本息和double sum1=250;//sum1表示每个月的本息和for(int i=0;i<240;i++){//20年,共240个月sum1*=(1+x/12);sum+=sum1;}return sum;}void main(){double x=0.0035;//0.0035是我网上搜的最小的利率do{fun(x);x+=0.0001;//利率增加的单位大小为0.0001}while(sum<250000);//当本息和小于250000时,一直执行程序cout<<"所求的最小年利率为:"<<x<<endl;}【实验结果】程序一得出的答案,但是可能是方程有问题,故答案有问题,即得到利率为0程序二得出的结果年利率为x=0.004【实验结果分析与说明】设每个月存钱p,且年利率为x,存了N 次后,钱的总数为Nxp xp xp xp p )121()121()121()121(y 32+++++++++=P 为最近年的钱数第一年的本金和利息 )121(xp +第二年的本金和利息 )121()121()121]()121([p 2xp xp xp x+++=+++…………第N 年的本金和利息Nxp xp xp xp p )121()121()121()121(32+++++++++求N 项级数和的公式为:qq qqqN N--=+++++11q 132故)1)121((12/)121(1)121(1p)121()121()121()121(y 32-+=+-+-=+++++++++=N Nxx p xxxp xp xp xp p N利用二分法 对方程求解。
数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法说课材料
数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法实验报告一:实验题目 一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。
二、 实验内容1、编写二分法、牛顿迭代法程序,并使用这两个程序计算02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。
2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。
3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭代法求这个方程的最小正根。
4、用牛顿法求方程的根,精确至8位有效数字。
比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。
三、 实验程序第1题:02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。
画图函数:function Test1()% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0r = 0:0.01:1;y = r + exp(r) - 2plot(r, y);grid on 二分法程序:计算调用函数:[c,num]=bisect(0,1,1e-4)function [c,num]=bisect(a,b,delta)%Input –a,b 是取值区间范围% -delta 是允许误差%Output -c 牛顿迭代法最后计算所得零点值% -num 是迭代次数ya = a + exp(a) - 2;yb = b + exp(b) - 2;if ya * yb>0return;endfor k=1:100c=(a+b)/2;yc= c + exp(c) - 2;if abs(yc)<=deltaa=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif abs(b-a)<deltanum=k; %num为迭代次数break;endendc=(a+b)/2;err=abs(b-a);yc = c + exp(c) - 2;牛顿迭代法程序:计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:function [y] = func1(x)y = x + exp(x) - 2;end迭代算法:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;%num为迭代次数break;endendc=p0;第2题:由题意得到算式:计算调用函数:[c,num]=newton(@func2,0.02,1e-8)程序:先用画图法估计出大概零点位置在0.02附近。
数值分析实验报告
数值分析实验报告2012326601071 信息与计算科学2班焦仁兵1. 二分法求解非线性方程1.1 问题求方程F(x)=x^3-x^2-2x+1=0 在区间(0,1)内的一个实根,要求准确到小数点后的第六位。
1.2 程序代码#include<iostream>using namespace std;int A=0,B=1,t=0;double c;double fun(double x){double y=x*x*x-x*x-2*x+1;return y;}double time(int t){int s=1;for(int i=0;i<=t;i++)s=s*2;return s;}double jisuan(double a,double b){if (fun(a)*fun(b)<0){c=(a+b)/2;if ((B-A)/time(t)<0.0005)return c;elseif (fun(a)*fun(c)<0){b=c;t++;jisuan(a,b);}elseif (fun(c)*fun(b)<0){a=c;t++;jisuan(a,b);}}}void main(){jisuan(0,1);cout<<"在误差范围内的函数根的值为:x="<<c<<endl;cout<<"迭代次数为:"<<t<<"次"<<endl;system("pause");}2.实验结果:2 牛顿法求解非线性方程2.1 问题试用Newton法求 F(x)=x*(x+1)^2-1=02.2 程序代码##include<iostream>#include<math.h>using namespace std;double fun(double x){double y=x*(x+1)*(x+1)-1;return y;}double daoshu(double x){double y=(x+1)*(3*x+1);return y;}double jisuan(double x){double y;y=x-fun(x)/daoshu(x);if (fabs(y-x)<=0.00005)//浮点数的绝对值{return y;}else return jisuan(y); }void main (){cout<<"在误差范围内的函数值为:"<<jisuan(0.4)<<endl;system("pause"); } 2.实验结果:3 迭代法求解线性方程组3.1 问题求解方程组 ⎪⎩⎪⎨⎧=++=+-=++,03102311,03321012,03123110x x x x x x x x x3.2 程序代码#include <iostream>#include <math.h>using namespace std;int i,j,k; //计数器int M = 2000;int Array(double ***Arr, int n){ double **p;int i;return 1;}void main(){double eps ;cout<<"默认最多迭代次数为2000次"<<endl<<"迭代精度为:";cin>>eps;double **matrix;int n;cout<<"矩阵大小为:";cin>>n;double *X;X= new double[n];double *Y;Y= new double[n];double *G;G= new double[n];for(i=0;i<n;i++){Y[i]=0;}if(!Array(&matrix,n))cout<<"内存分配失败!";elsecout<<"请输入矩阵:"<<endl;for( i=0;i<n;i++){for( j=0;j<n;j++){cin>>matrix[i][j];}}cout<<"请输入右端项:"<<endl;double *B;B = new double[n];for(i=0;i<n;i++){cin>>B[i];}for (i = 0 ;i< n;i++){if (fabs(matrix[i][i]) < eps){cout <<"打印失败"<<endl;return;cout << X[i] <<" ";}p=(double **)malloc(n*sizeof(double *));if(!p)return 0;for(i=0;i<n;i++){p[i]=(double *)malloc(n*sizeof(double));if(!p[i])return 0;}*Arr=p;}double T = matrix[i][i];for ( j = 0 ; j< n;j++){matrix[i][j] = -matrix[i][j]/T;}matrix[i][i] = 0;G[i] = B[i]/T;}int counter = 0;while (counter < M){for (i = 0;i < n; i++){double temp = 0;for (j = 0;j<n; j++){temp = temp + matrix[i][j]*X[j];}X[i] = G[i] + temp;}double temp = 0;for (i = 0 ;i< n ; i++){temp = temp + fabs(X[i] - Y[i]);}if (temp <= eps)break;else{for( i = 0; i < n ;i++){Y[i] = X[i];}}counter++;}cout << "迭代次数为:"<<counter<<"次。
数值分析实验报告
武汉理工大学学生实验报告书实验课程名称:数值分析开课名称:计算机科学与技术学院指导老师姓名:熊盛武学生姓名:学生专业班级:20011—— 2012学年第二学期第一次试验(1)二分法计算流程图:(2)简单迭代法算法流程图:(3)牛顿迭代法流程图:(4)弦截法算法程序流程图:二分法程序源代码:#include<iostream>#include<cmath>#define f(x) (x*x*x-x-1)using namespace std;int main(){int i;float x,t,a,b,e;cout<<"请输入求根区间a,b"<<"控制变量e"<<endl;cin>>a>>b>>e; i=0;while ((b-a)>e){i++;x=(a+b)/2;if (f(a)*f(x)<0) b=x;if (f(a)*f(x)>0) a=x;}t=(a+b)/2;cout<<"在求根区间a,b间近似根t="<<t<<endl;cout<<"所需二分法次数i="<<i<<endl;return 0;}调试过程,实验结果及分析:计算x*x*x-x-1=0 在[1,2]内的近似根。
精度达到0.0001时,程序运行结果如下图:当精度达到0.00001时,程序运行如下图:调试过程中如果把while ((b-a)>e)改为while ((b-a)<e),算然会出现程序运行之后的界面,但是输出的近似根是1.5,迭代次数i=0,也就是说程序的循环体没有执行,这是因为求根呢区间远远大于精度。
从而跳过循环体直接输出前面输入的数据。
由运行结果看出:精度达到0.0001时,二分法次数为14。
(完整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是方程的根,结果与实际想要得到的值相当接近。
数值分析实验报告11633
数值分析实验报告(第二章)实验题目:分别用二分法、牛顿迭代法、割线法、史蒂芬森迭代法求方程|f(x)=(丿+ 1)(x - 1J5= 0的根:-=,观察不同初始值下的收敛性,并给出结论。
问题分析:题目有以下几点要求:1.不同的迭代法计算根,并比较收敛性。
2.选定不同的初始值,比较收敛性。
实验原理:各个迭代法简述二分法:取有根区间[也b]的重点切,确定新的有根区间〔621 ]的区间长度仅为门;区间长度的一版。
对压缩了的有根区间 *」丨重复以上过程,又得到新的有根区间[眈bg],其区间长度为3仁切]的一半,如此反复,……,可得一系列有根区间,区间收敛到一个点即为根。
牛顿迭代法:不动点迭代法的一种特例,具有局部二次收敛的特性。
迭代格式为心+ 1 二靭-77^7,n = 0, 1r2,-・割线法:是牛顿法的改进,具有超线性收敛的特性,收敛阶为.迭代格式为Xn M -卡(其』_ 卡&- - iJ 「八二仁2,…史蒂芬森迭代法:采用不动点迭代进行预估校正。
至少是平方收敛的。
迭代格式为y n= * GJZn = * (yn)这里二■可采用牛顿迭代法的迭代函数。
实验内容:1.写出该问题的f00函数代码如下:fun ctio n py= f(x)syms k;y=(k A2+1)*(k-1)A5;yy=diff(y,k);py(1)=subs(y,k,x);py(2)=subs(yy,k,x);end2.分别写出各个迭代法的迭代函数代码如下:二分法:function y=dichotomie(a,b,e)i=2;m(1)=a;while abs(a-b)>et=(a+b)/2;s2=f(b);s3=f(t);if s1(1)*s3(1)v=0b=t;elsea=t;endm(i)=t;s1=f(a); i=i+1;endy=[t,i+1,m];end牛顿迭代法:fun ctio n y=Newto nl terative(x,e) i=2;en=2*e;m(1)=x;while abs(en)>=es=f(x);t=x-s(1)/s(2);en=t-x;x=t;m(i)=t;i=i+1;endy=[x,i+1,m];end牛顿割线法:function y=Seca nt(x1,x2,e)i=3;m(1)=x1,m(2)=x2;while abs(x2-x1)>=es1=f(x1);s2=f(x2); t=x2-(x2-x1)*s2(1)/(s2(1)-s1(1));x1=x2;x2=t;m(i)=t;i=i+1;endy=[x2,i+1,m];end史蒂芬森迭代法:Function p=Stephensonlterative(x,e) i=2;m(2)=x;en=2*e;while abs(e n)>=ey=fai(x);z=fai(y);t=x-(y-x)A2/(z-2*y+x);en=t-x;x=t;i=i+1;endp=[x,i+1,m];end3.因为®oo经常被使用,故可以写一个eu)函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验报告
1. 二分法
1.C++实验代码:
#include<iostream>
using namespace std;
int A=0,B=1,t=0;
double c;
double fun(double x)
{
double y=x*x*x-x*x-2*x+1;
return y;
}
double time(int t)
{
int s=1;
for(int i=0;i<=t;i++)
s=s*2;
return s;
}
double jisuan(double a,double b)
{
if (fun(a)*fun(b)<0)
{
c=(a+b)/2;
if ((B-A)/time(t)<0.0005)
return c;
else
if (fun(a)*fun(c)<0)
{
b=c;
t++;
jisuan(a,b);
}
else
if (fun(c)*fun(b)<0)
{
a=c;
t++;
jisuan(a,b);
}
}
}
void main()
{
jisuan(0,1);
cout<<"在误差范围内的函数根的值为:x="<<c<<endl;
cout<<"迭代次数为:"<<t<<"次"<<endl;
system("pause");
}
2.实验结果:
3.实验中碰到的问题:
本来是打算用可输入式子然后用二分法计算的,但在编程的时候发现貌似很复杂还要区分数字和计算符号,所以先直接用题目中的式子先写算法了。
或者笔算很简单的算法,在计算机实现起来还是有点难度的,比如每算一次区间长度都要除2,我的程序路在一个函数中做不到这一点,在这个程序中就要另外设一个函数来运算。
总体通过几个函数的相互调用,以及递归方法,完成了这个二分法的计算。