数值分析实验报告二分法(一)

合集下载

数值分析实验报告62338

数值分析实验报告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.因为经常被使用,故可以写一个函数。

武汉理工大学计算机学院数值分析实验报告

武汉理工大学计算机学院数值分析实验报告

武汉理工大学计算机学‎院数值分析实验报告‎武汉理工大学计算机学‎院数值分析实验报告‎‎篇一:数‎值分析实验报告学‎生实验报告‎书实验课程名称开‎课学院指导教‎师姓名学生姓‎名学生专业班级数‎值分析计算机科学与‎技术学院熊盛武 2‎01X—— 201X‎学年第二学期‎实验课程名称:‎数值分析‎篇‎二:数值分‎析实验报告武汉理工‎大学学生实验‎报告书实验课‎程名称:数‎值分析开课‎名学生姓名‎:201X‎1—— 201X学年‎第二学期第一‎次试验(1)‎二分法计算流程图:‎简单迭代法算‎法流程图:(‎2)(3)牛‎顿迭代法流程图:‎(4)弦截法算法‎程序流程图:‎‎篇三:‎数值分析实验报告湖‎北民族学院理学院《数‎值分析》课程实验报告‎(一)湖北民‎族学院理学院《数值分‎析》课程实验报告‎(二) xn?)篇‎四:数值分析‎实验报告数值分析实‎验报告姓名:‎学号:学院‎:老师:‎ XXX XXX‎X实验一一‎、实验内容用雅克比‎迭代法和高斯塞德尔迭‎代法求解课本例‎3.1,设置精度为1‎0-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) xx‎x x一初始向量代入迭‎代公式,求出,再以代‎入同一迭代公式,求出‎,1、雅克比‎迭代法 ?(k)?(‎k) {x}{x}收‎敛时,如此反复进行,‎得到向量序列。

当其极‎限即为原方程组的解。

‎2、高斯塞德‎尔迭代法:‎在雅可比(Jacbi‎)迭代法中,如果当新‎的分量求出后,马上用‎它来代替旧的分量,‎则可能会更快地接近方‎程组的准确解。

基于这‎种设想构造的迭代公式‎称为高斯-塞德尔(G‎a uss-Seide‎l)迭代法。

数值分析实验报告——非线性方程求根

数值分析实验报告——非线性方程求根

数值分析实验报告——非线性方程求根一、实验目的:1.掌握求解非线性方程的常用方法;2.了解非线性方程求根问题的数值解法;3.熟悉使用数值分析软件进行非线性方程求根的实现。

二、实验原理:非线性方程指的是形如f(x)=0的方程,其中f(x)是一个非线性函数。

非线性方程求根的常用方法包括二分法、割线法和牛顿法等。

其中,二分法是通过不断缩小区间范围来逼近方程的解;割线法是通过使用割线来逼近方程的解;牛顿法则是通过使用切线来逼近方程的解。

对于给定的非线性方程,可以根据实际情况选择合适的方法进行求根。

三、实验内容:1.编写求解非线性方程的函数,包括二分法、割线法和牛顿法;2.使用编写的函数求解给定的非线性方程,比较各个方法的收敛速度和精确程度;3.根据实际情况分析和选择合适的方法进行求根。

四、实验步骤:1.针对给定的非线性方程,编写二分法的函数实现:(1)首先确定方程的解存在的区间;(2)根据方程的解存在的区间,使用二分法逐步缩小区间范围;(3)根据设定的精度要求,不断循环迭代,直至满足要求或达到迭代次数限制;2.针对给定的非线性方程,编写割线法的函数实现:(1)首先需要确定方程的解存在的初始点;(2)根据方程的解存在的初始点,根据割线的定义进行迭代;(3)设定迭代的精度要求和限制次数,结束迭代;3.针对给定的非线性方程,编写牛顿法的函数实现:(1)首先需要确定方程的解存在的初始点;(2)根据方程的解存在的初始点,根据牛顿法的定义进行迭代;(3)设定迭代的精度要求和限制次数,结束迭代;4.根据给定的非线性方程,分别使用二分法、割线法和牛顿法进行求解,并比较各个方法的收敛速度和精确程度;5.分析实际情况,选择合适的方法进行求解。

五、实验结果:4.通过比较,发现割线法和牛顿法的收敛速度较快,精确程度较高,因此选择割线法进行求解。

六、实验总结:通过本次实验,我掌握了求解非线性方程的常用方法,并使用数值分析软件实现了二分法、割线法和牛顿法。

数值分析上机实践报告

数值分析上机实践报告

数值分析上机实践报告一、实验目的本次实验主要目的是通过上机操作,加深对数值分析算法的理解,并熟悉使用Matlab进行数值计算的基本方法。

在具体实验中,我们将实现三种常见的数值分析算法:二分法、牛顿法和追赶法,分别应用于解决非线性方程、方程组和线性方程组的求解问题。

二、实验原理与方法1.二分法二分法是一种常见的求解非线性方程的数值方法。

根据函数在给定区间端点处的函数值的符号,不断缩小区间的长度,直到满足精度要求。

2.牛顿法牛顿法是求解方程的一种迭代方法,通过构造方程的泰勒展开式进行近似求解。

根据泰勒展式可以得到迭代公式,利用迭代公式不断逼近方程的解。

3.追赶法追赶法是用于求解三对角线性方程组的一种直接求解方法。

通过构造追赶矩阵,采用较为简便的向前追赶和向后追赶的方法进行计算。

本次实验中,我们选择了一组非线性方程、方程组和线性方程组进行求解。

具体的实验步骤如下:1.调用二分法函数,通过输入给定区间的上下界、截止误差和最大迭代次数,得到非线性方程的数值解。

2.调用牛顿法函数,通过输入初始迭代点、截止误差和最大迭代次数,得到方程组的数值解。

3.调用追赶法函数,通过输入追赶矩阵的三个向量与结果向量,得到线性方程组的数值解。

三、实验结果与分析在进行实验过程中,我们分别给定了不同的参数,通过调用相应的函数得到了实验结果。

下面是实验结果的汇总及分析。

1.非线性方程的数值解我们通过使用二分法对非线性方程进行求解,给定了区间的上下界、截止误差和最大迭代次数。

实验结果显示,根据给定的输入,我们得到了方程的数值解。

通过与解析解进行比较,可以发现二分法得到的数值解与解析解的误差在可接受范围内,说明二分法是有效的。

2.方程组的数值解我们通过使用牛顿法对方程组进行求解,给定了初始迭代点、截止误差和最大迭代次数。

实验结果显示,根据给定的输入,我们得到了方程组的数值解。

与解析解进行比较,同样可以发现牛顿法得到的数值解与解析解的误差在可接受范围内,说明牛顿法是有效的。

哈工大数值分析实验报告

哈工大数值分析实验报告


实验报告一:非线性方程求解.................................................................................... 1
摘要、前言、数学原理 ............................................................................................. 1 Python 程序设计 ........................................................................................................ 2 结果分析和讨论 ......................................................................................................... 6 结论 ........................................................................................................................... 12 摘要、前言、数学原理 ........................................................................................... 13 Python 程序设计 ...................................................................................................... 14 结果分析和讨论 ....................................................................................................... 16 结论 ........................................................................................................................... 17 摘要、前言、数学原理 ........................................................................................... 18 Python 程序设计 ...................................................................................................... 19 结果分析和讨论 ..................................................................................................... 26 结论 ........................................................................................................................... 30 摘要、前言、数学原理 ........................................................................................... 31 Python 程序设计 ...................................................................................................... 32 结果分析和讨论 ....................................................................................................... 33 结论 ........................................................................................................................... 35

数值分析实验报告模板

数值分析实验报告模板

数值分析实验报告模板篇一:数值分析实验报告(一)(完整)数值分析实验报告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);写成如上形式即可,下面给出主程序。

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)
N=input('please enter the largest number of iterations:N=');
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日
课程
名称
数值分析基础性实验
实验项目
名称
数值计算算法及实现

数值分析实验五(二分法,牛顿迭代法)

数值分析实验五(二分法,牛顿迭代法)

实验五一、实验目的与要求:1、通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;2、比较二者的计算速度和计算精度。

二、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点。

二分法算法:给定区间[a,b],并设与符号相反,取为根的容许误差,为的容许误差。

(1)令c=(a+b)/2(2)如果(c-a)<或,则输出,结束;否则执行(3)(3)如果,则令;否则则令,重复(1),(2),(3)。

牛顿迭代法算法:给定初值 , 为根的容许误差,为 的容许误差,N 为迭代次数的容许值。

(1)如果 =0或迭代次数大于N ,则算法失败,结束;否则执行(2)。

(2)计算 = - (3)若 < 或 < ,则输出 ,程序结束;否则执行(4)。

x 0εη)(x f )('x f x 1x 0)()('0x x o f f x x 01-ε)(1x f ηx 1x0x1(4)令= ,转向(1)。

三、实验题目:1、用二分法求方程f(x)=x^3+4*x*x-10在区间[1,1.5]上的根,要求求出具有3位有效数的近似根。

2、用牛顿法求方程x^3-3x-1=0在x=2附近的根。

四、程序:一、二分法#include<stdio.h>float f(float x){return x*x*x+4*x*x-10;}void main(){float a,b,c;a=1.0;b=1.5;for(;b-a>=0.01;){c=(a+b)/2;if(f(a)*f(c)==0)break;else if(f(a)*f(c)<0)b=c;elsea=c;}printf("方程的近似根为%f\n",c);printf("保留三位有效数字为%0.2f\n",c); }二、牛顿迭代法#include<stdio.h>#include<math.h>float f(float x){return x*x*x-3*x-1;}float g(float x){return 3*x*x-3;}void main(){float x0,x1,a,b,N;int i;i=0;printf("请输入初值X0,根的容许误差,|f(x)|的容许误差,迭代次数的容许值N。

数值分析上机实验报告

数值分析上机实验报告
for k=1:n+1;
if k~=q;
l=l.*(x-s(k))./(s(q)-s(k));
else
l=l;
end
end
f=f+Rf(s(q))*l;%求插值函数
end
plot(x,f,'r')%作出插值函数曲线
grid on
hold on
分段线性插值源程序
clear
n=input('将区间分为的等份数输入:\n');
结论:
对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,二且总体上来说速度比较慢。Newton法,收敛速度要比二分法快,但是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结果可能不时预期需要得结果。改进的Newton法求解重根问题时,如果初值不当,可能会不收敛,这一点非常重要,当然初值合适,相同情况下其速度要比Newton法快得多。
前言:(目的和意义)
1.深刻认识多项式插值的缺点。
2.明确插值的不收敛性怎样克服。
3.明确精度与节点和插值方法的关系。
数学原理:
在给定n+1个节点和相应的函数值以后构造n次的Lagrange插值多项式,实验结果表明(见后面的图)这种多项式并不是随着次数的升高对函数的逼近越来越好,这种现象就是Rung现象。
3.用Newton法求解下列方程
a) x0=0.5;
计算结果为
x=;
f(x)=;
k=4;
由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快。
b) x0=1;
c) x0=0.45, x0=0.65;
当x0=0.45时,计算结果为

数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法说课材料

数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法说课材料

数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法实验报告一:实验题目 一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。

二、 实验内容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<<"次。

数值分析实验报告

数值分析实验报告

《数值分析》实验报告学院:计算机科学与软件学院姓名:XXX班级:计算机XX班学号:XXXXXX实验一:舍入误差与数值稳定性实验目的:1、 通过上机编程,复习巩固以前所学程序设计语言;2、 通过上机计算,了解舍入误差所引起的数值不稳定性。

3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。

实验内容:用两种不同的顺序计算644834.11000012≈∑=-n n ,分析其误差的变化。

实验流程图:实验源程序:#include <stdio.h>#include <math.h>void main(){ int i;float s1=0,s2=0,d1,d2;for (i=1;i<=10000;i++)s1=s1+1.0f/(i*i);for (i=10000;i>=1;i--)s2=s2+1.0f/(i*i);d1=(float)(fabs(1.644834-s1));d2=(float)(fabs(1.644834-s2));printf("正向求和结果为%f\n 误差为%f\n\n",s1,d1);printf("反向求和结果为%f\n 误差为%f\n\n",s2,d2);if(d1<d2)printf("正向求和误差小于负向求和误差\n");else if(d1==d2)printf("正向求和误差等于负向求和误差\n"); elseprintf("正向求和误差大于负向求和误差\n");}实验结果:实验分析:第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。

这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。

数值分析实验报告

数值分析实验报告

武汉理工大学学生实验报告书实验课程名称:数值分析开课名称:计算机科学与技术学院指导老师姓名:熊盛武学生姓名:学生专业班级: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文档良心出品)

(完整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

数值分析实验报告之二分法求根 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文档良心出品)

(完整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是方程的根,结果与实际想要得到的值相当接近。

二分法实验报告

二分法实验报告

实验报告方程求根——二分法一、目的和要求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.估算次数与实际二分次数的分析和讨论估算次数总是比实际二分次数少一次。

数值分析实验报告

数值分析实验报告

数值分析实验报告一、实验目的数值分析是一门研究用计算机求解数学问题的数值方法及其理论的学科。

本次实验的目的在于通过实际操作和编程实现,深入理解和掌握数值分析中的常见算法,提高运用数值方法解决实际问题的能力,并对算法的精度、稳定性和效率进行分析和比较。

二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。

实验所依赖的主要库包括 NumPy、Matplotlib 等。

三、实验内容(一)函数逼近与插值1、拉格朗日插值法通过给定的离散数据点,构建拉格朗日插值多项式,对未知点进行函数值的估计。

2、牛顿插值法与拉格朗日插值法类似,但采用了不同的形式和计算方式。

(二)数值积分1、梯形公式将积分区间划分为若干个梯形,通过计算梯形面积之和来近似积分值。

2、辛普森公式基于抛物线拟合的方法,提高积分近似的精度。

(三)线性方程组求解1、高斯消元法通过逐行消元将线性方程组化为上三角形式,然后回代求解。

2、 LU 分解法将系数矩阵分解为下三角矩阵 L 和上三角矩阵 U,然后通过两次前代和回代求解。

(四)非线性方程求解1、二分法通过不断将区间一分为二,逐步缩小根所在的区间,直到满足精度要求。

2、牛顿迭代法利用函数的切线来逼近根,通过迭代逐步收敛到根的近似值。

四、实验步骤(一)函数逼近与插值1、拉格朗日插值法定义计算拉格朗日基函数的函数。

根据给定的数据点和待求点,计算插值多项式的值。

输出插值结果,并与真实值进行比较。

2、牛顿插值法计算差商表。

构建牛顿插值多项式。

进行插值计算和结果分析。

(二)数值积分1、梯形公式定义积分区间和被积函数。

按照梯形公式计算积分近似值。

分析误差。

2、辛普森公式同样定义积分区间和被积函数。

运用辛普森公式计算积分近似值。

比较与梯形公式的精度差异。

(三)线性方程组求解1、高斯消元法输入系数矩阵和右端项向量。

进行消元操作。

回代求解方程。

输出解向量。

2、 LU 分解法对系数矩阵进行 LU 分解。

数值分析实验报告二分法(一)

数值分析实验报告二分法(一)

数值分析实验报告(一) 一.实验名称:二分法求非线性方程的根二.实验目的:运用二分法求方程根三.题目:用二分法求解方程x^3+4x^2-10=0要求误差小于.四.程序:#include<>#include<>float fun(float x){float y;y=x*x*x+4*x*x-10;return y;}float BM(float a,float b){float eps1=,eps2=;float z,t;while(1){z=(a+b)/2;t=(b-a)/2;if((fabs(fun(z))<eps2)||t<eps1)break;else{if(fun(a)*fun(z)<0){b=z;}else{a=z;}}}return z;}main(){float a,b,j;cout<<"请输入区间下限a:"<<endl;cin>>a;cout<<"请输入区间下限b:"<<endl;cin>>b;if(fun(a)*fun(b)<0){j=BM(a,b);cout<<j<<endl;}elsecout<<"在该区间没有解"<<endl;}五.运行结果:六.体会:二分法程序简单,对函数f(x)要求不高,收敛性好。

.通过这次学习,我又学会了一种方法,在以后会更好的掌握和应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析实验报告(一) 一.实验名称:
二分法求非线性方程的根
二.实验目的:
运用二分法求方程根
三.题目:
用二分法求解方程
x^3+4x^2-10=0
要求误差小于0.0005.
四.程序:
#include<iostream.h>
#include<math.h>
float fun(float x)
{
float y;
y=x*x*x+4*x*x-10;
return y;
}
float BM(float a,float b)
{
float eps1=0.005,eps2=0.0001;
float z,t;
while(1)
{
z=(a+b)/2;
t=(b-a)/2;
if((fabs(fun(z))<eps2)||t<eps1)
break;
else
{
if(fun(a)*fun(z)<0)
{
b=z;
}
else
{
a=z;
}
}
}
return z;
}
main()
{
float a,b,j;
cout<<"请输入区间下限a:"<<endl;
cin>>a;
cout<<"请输入区间下限b:"<<endl;
cin>>b;
if(fun(a)*fun(b)<0)
{
j=BM(a,b);
cout<<j<<endl;
}
else
cout<<"在该区间没有解"<<endl;
}
五.运行结果:
六.体会:
二分法程序简单,对函数f(x)要求不高,收敛性好。

.通过这次学习,我又学会了一种方法,在以后会更好的掌握和应用。

相关文档
最新文档