数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))
数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

本科生实验报告

实验课程数值计算方法

学院名称信息科学与技术学院

专业名称计算机科学与技术

学生姓名

学生学号

指导教师

实验地点

实验成绩

二〇一六年五月二〇一六年五月

实验一非线性方程求根

1.1问题描述

实验目的:掌握非线性方程求根的基本步骤及方法,。

实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+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,e

mid=(a+b)/2

F(a)*f(b)<0

|a-b|

a=mid

b=mid

结束

输出mid

yes

no

2.2 简单迭代法

思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似

值,使之逐步精确,最后得到精度要求的结果。 步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。

2.计算x1,x1=f(x0).

3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。

4.输出x1,即为方程的近似解。

开始输入x0,e

X1=f(x0)

|x1-x0|

X1=x0;

输出x1

结束

No

yes

f为迭代函数

2.3 Newton迭代法

思想:设r是的根,选取作为r的初始近似值,过点做曲线的切线L,L的方程为,求出L与x轴交点

的横坐标,称x

1

为r的一次近似值。过点做曲线

的切线,并求该切线与x 轴交点的横坐标,称为r 的二次近似

值。重复以上过程,得r 的近似值序列,其中,称为r 的

次近似值

步骤:1.计算原函数的导数f ’(x);构造牛顿迭代公式

2.计算 ,若f’(x0)=0,退出计算,否则继续向下迭代。

3.若|x1-x0|满足精度要求,x1即为方程的近似解。

开始

输入

x0,e

X1=x0-f(x0)/f(x1)

|x1-x0|

X1=x0;

输出x1

结束

No

yes

f ’(x0)=0

2.4弦截法

思想:为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f’(x)。

步骤: 1.构造双点弦法的公式

2.计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x0);

3.判断f(x2)是否满足精度要求,若没有则按照上述步骤继续迭代,否则输出x2.x2即为方程的近似解。

开始

输入x0,x1,e

x2=x1-x0-f(x1)(x1-x0)/f(x1)-f(x0)

|f(x2)|

X1=x0;X2=x1;f(x1)=f(x0);f(x2)=f(x1);

结束

No

计算f (x2)

输出x2

<

>=

第3章 测试结果及分析

测试结果

函数图像

函数Y=x5-3x3+x-1

二分法(表1-1,1-2,1-3)

[-1.6,-1.3]

k xk k xk k xk

0 -1.45 5 -1.50156 10 -1.50493

1 -1.525 6 -1.50391 11 -1.505

2 -1.4875 7 -1.50508 12 -1.50504

3 -1.50625 8 -1.50449 13 -1.50506

4 -1.49688 9 -1.50479 14 -1.50507

表1-1

区间[-1.2,-0.9]

k xk k xk k xk

0 -1.05 5 -0.998437 10 -1.00005

1 -0.975 6 -1.00078 11 -0.999976

2 -1.0125 7 -0.999609 12 -1.00001

3 -0.99375 8 -1.0002 13 -0.999994

4 -1.00312 9 -0.999902 14 -1

表1-2

区间[1.5,1.8]

k xk k xk k xk

0 1.65 7 1.69102 14 1.69029

1 1.725 8 1.69043 15 1.69029

2 1.6875 9 1.69014 16 1.69029

3 1.70625 10 1.69028 17 1.69028

4 1.69687 11 1.69036 18 1.69028

5 1.69219 12 1.69032

6 1.68984 13 1.6903

表1-3

简单迭代法(表2-1.2-2.2-3)

初值-1.5

k xk k xk k xk

1 -1.5 7 -1.50435 13 -1.50493

2 -1.50217 8 -1.5045

3 1

4 -1.50497

3 -1.50287 9 -1.50466 15 1.50499

4 -1.50341 10 -1.50476 16 -1.50501

5 -1.50381 11 -1.50483 17 -1.50504

6 -1.50412 12 -1.50489 18 -1.50505

表2-1

初值-1

k x

1 -1

2 -1

表2-2

k xk k xk k xk

1 1.6 8 1.6886

2 15 1.69023

2 1.65669 9 1.68927 16 1.69025

3 1.66987 10 1.68967 17 1.69027

4 1.6779 11 1.68991 18 1.69027

5 1.68278 12 1.6900

6 19 1.69028

6 1.68573 13 1.69015 20 1.69028

7 1.68753 14 1.6902

表2-3

牛顿迭代法(表3-1.3-2,3-3)

初值-1.5 结果x=-1.50507

k xk k xk

1 -1.5 4 -1.50504

2 -1.50471 5 -1.50506

3 -1.50497 6 -1.50507

表3-1

初值-1 结果x=-1.50507

k x

1 -1

2 -1

表3-2

初值1.6 结果x=1.69028

k xk k xk

1 1.6 5 1.69024

2 1.68602 6 1.69027

3 1.68893 7 1.69028

4 1.6898

5 8 1.69028

表3-3

双点弦法(表4-1.4-2,4-3)

区间[-1.6,-1.3] 结果x=-1.50507

k xk f(xk) k xk f(xk)

1 -1.5 0.03125 5 -1.50667 0.0784566

2 -1.66149 0.376502 6 -1.505 -0.010079

3 -1.47175 -1.56322 7 -1.50507 0.000440988

4 -1.492 0.186801 8 -1.50507 2.30387e-006

表4-1

区间[-1.2,-0.9] 结果x= -1

k xk f(xk)

1 -1.01393 0.0415678

2 -1.0002 0.000607777

3 -0.999999 -3.11969e-006

4 -1 2.11001e-010

表4-2

区间[1.5,1.8] 结果x=1.69028

k xk f(xk)

1 1.64403 -0.676455

2 1.68071 -0.151106

3 1.69126 0.0157988

4 1.69027 -0.000313515

5 1.69028 -6.3006e-007

表4-3

从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦

截法的收敛速度。二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然收敛高,但要求导数,计算的复杂度高!双点弦法随稍慢于牛顿跌代法,可以用差商代替牛顿迭代法中的导数,降低了计算的复杂度!

附录:源程序清单

#include

#include

using namespace std;

double foot =0.3;//定义寻根步长

int a=-8,b=8;

double*rn=new double[5];//解的区间double*r =new double[5];// 方程近似解

int m=0;//根的个数int x_count;

double precision=0.000001;//精度要求

//函数的表达式(x^5-3x^3+x-1)

double f(double x){

return(pow(x,5)-3*pow(x,3)+x-1);

}

void init(){//根据函数图像确定根的区间和迭代初值

r[0]=-1.5;

r[1]=-1;

r[2]=1.6;

rn[0]=-1.6;

rn[1]=-1.2;

rn[2]=1.5;

}

//寻找根的区间

void search(){ //若没有给出区间和初值,进行逐步搜索有根区间

for(int i=0;i*foot-8<8;i++){

if(f(i*foot-8)*f((i+1)*foot-8)<0){

rn[m]=i*foot-8;

m++;

}

}

}

//=====================二分法

==========================

double Dichotomy (double a,double b){

double mid=0;

int i=0;

while(fabs(b-a)>precision){

mid =(a+b)/2;

if(f(a)*f(mid)<=0) b=mid; //判断与端点函数值得符号

else a=mid;

cout<

}

r[x_count++]=mid;

return mid;

//返回最终结果

}

//================简单迭代法

=========================

//构造迭代公式

double fitera(double x){

double result=0;

double xx=3*pow(x,3)-x+1;

if(xx<=0){

xx=-xx;

return pow(xx,1.0/5.0)*(-1);}

else

return pow(xx,1.0/5.0);

}

//简单迭代

double itera(double x0){

cout<

double x1=fitera(x0);

while(fabs(x1-x0)>precision){

x0=x1;

x1=fitera(x0); //没有到达精度要求继续迭代

cout<

}

return x1;//返回最终结果

}

//===============牛顿迭代法

==================

//计算函数的一阶导数fderivatives(double x)double fderivatives(double x){

return5*pow(x,4)-9*(x,2)+1;

}

//构造牛顿迭代公式newtonitera(double x) double newtonitera(double x){

if(fderivatives(x)==0)return-1;

//若导数为0 则停止迭代

else

return x-(f(x)/fderivatives(x));

}

//牛顿迭代

double newton(double x0){

double x1=newtonitera(x0);

while(fabs(x1-x0)>precision){

x0=x1;

if(newtonitera(x0)==-1)break;

x1=newtonitera(x0); //继续迭代

cout<

}

return x1;

//返回最终结果

}

//==================双点弦法迭代

======================

//构造弦截法的迭代公式

double twopointchord_f(double x0,double x1){ return x1-(f(x1)/(f(x1)-f(x0)))*(x1-x0);

}

//双点弦法迭代

double twopointchord(double x0,double x1){ double x3=twopointchord_f(x0,x1);

cout<

while(fabs(f(x3))>precision){

cout<<"f(x3)"<

x0=x1;

x1=x3;

x3=twopointchord_f(x0,x1); //没有到达精度要求继续迭代

// cout<

}

cout<

return x3;//返回最终结果

}

//测试

void main(){

init(); //初始化区间和迭代初值

/* 测试代码输出每次的迭代结果和最终结果

cout<<"------------------------二分法

----------------------"<

for(int i =0;i<3;i++){

double result=0;

cout<<"有根区间为["<

"<

result=Dichotomy(rn[i],rn[i]+foot);

//将区间端点带入公式

cout<<"求得近似解为"<

}

cout<<"------------------------迭代法

----------------------"<

for(i =0;i<3;i++){

double result=0;

cout<<"有根区间为["<

"<

double x0 =r[i];

//取得初值

result=itera(x0);

//带入公式

cout<<"求得近似解为"<

cout<<"------------------------牛顿迭代

----------------------"<

for(i =0;i<3;i++){

double result=0;

cout<<"有根区间为["<

"<

double x0 =r[i];

//取得初值

result=newton(x0);

//带入公式

cout<<"求得近似解为"<

MAAB计算方法迭代法牛顿法二分法实验报告

姓名 实验报告成绩 评语: 指导教师(签名) 年 月 日 说明:指导教师评分后,实验报告交院(系)办公室保存。 实验一 方程求根 一、 实验目的 用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。并比较方法的优劣。 二、 实验原理 (1)、二分法 对方程0)(=x f 在[a ,b]内求根。将所给区间二分,在分点 2a b x -=判断是否0)(=x f ;若是,则有根2a b x -=。否则,继续判断是否0)()(

+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(') (00x f x f 。取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。迭代公式为:=+1 k x -0x )(')(k k x f x f 。 三、 实验设备:MATLAB 软件 四、 结果预测 (1)11x = (2)5x = (3)2x =0,09052 五、 实验内容 (1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超 过3105.0-?。 (2)、取初值00=x ,用迭代公式=+1 k x -0x )(') (k k x f x f ,求方程0210=-+x e x 的近似根。要求误差不超过3105.0-?。 (3)、取初值00=x ,用牛顿迭代法求方程0210=-+x e x 的近似根。要求误差 不超过3105.0-?。 六、 实验步骤与实验程序 (1) 二分法 第一步:在MATLAB 软件,建立一个实现二分法的MATLAB 函数文件如下: function x=agui_bisect(fname,a,b,e) %fname 为函数名,a,b 为区间端点,e 为精度 fa=feval(fname,a); %把a 端点代入函数,求fa fb=feval(fname,b); %把b 端点代入函数,求fb if fa*fb>0 error('两端函数值为同号'); end

牛顿迭代法

牛顿迭代法 李保洋 数学科学学院信息与计算科学学号:060424067 指导老师:苏孟龙 摘要:牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,即牛顿迭代法.迭代法是一种不断用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“牛顿迭代法”属于近似迭代法,本文主要讨论的是牛顿迭代法,方法本身的发现和演变和修正过程,避免二阶导数计算的Newton迭代法的一个改进,并与中国古代的算法,即盈不足术,与牛顿迭代算法的比较. 关键词:Newton迭代算法;近似求解;收敛阶;数值试验;中国古代数学; 九章算术;Duffing方程;非线性方程;收敛速度;渐进性 0 引言: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“二分法”和“牛顿迭代法”属于近似迭代法. 迭代算法是用计算机解决问题的一种基本方法.它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值.具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制. (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败. 所以利用迭代算法解决问题,需要做好以下三个方面的工作: 1、确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 2、建立迭代关系式.所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 3、对迭代过程进行控制,在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地重复执行下去.迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定.对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件. 1牛顿迭代法:

数值分析报告-二分法和牛顿法方程求根

《数值分析》实验报告一 姓名: 周举 学号: PB09001046

实验一 一、实验名称 方程求根 二、实验目的与要求: 通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点; 比较二者的计算速度和计算精度。 三、实验内容: 通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。 (一)二分法 算法:给定区间[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 #include 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; else a=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

数值方法C++代码大全上(包括二分法迭代法牛顿法等等)

1.二分法 #include #include #include //调用fabs函数。 double f(double x) //定义函数F(x)。 { return 2*x*x*x-x-1; } void main() { double a,b,w,x; cout<<"请输入方程根的区间[a,b]及误差w:"; cin>>a>>b>>w; x=(a+b)/2; while(fabs(f(x))>w&&fabs(a-b)>w){ //用while循环控制中值折算的条件。if(f(x)*f(b)<0) a=x; //进行二分,缩小求值范围。else if(f(a)*f(x)<0) b=x; x=(a+b)/2; } cout< #include #include #include using namespace std; typedef double (*pFun)(double x); double getIterativeValue(double x) {

return pow((x+1)/2,(double)1.0/3); } double Solve(pFun f,double x,double e,int n) { double res; while(n--) { res = f(x); if(fabs(res - x) < e) { outPrint("第%d次次迭代以后返回值为:%0.7lf \n",10-n,res); break; } else x = res; outPrint("第%d次迭代以后x值为:%0.7lf\n ",10-n,x); } return res; } int main() { cout << setprecision(7); double x,e; cout << "输入初值和精度:" << endl; cin >> x >> e; cout << Solve(getIterativeValue,x,e,10) << endl; system("pause"); return 0; } 3.牛顿法 #include #include #include #include using namespace std;

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

本科生实验报告 实验课程数值计算方法 学院名称信息科学与技术学院 专业名称计算机科学与技术 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年五月二〇一六年五月

实验一非线性方程求根 1.1问题描述 实验目的:掌握非线性方程求根的基本步骤及方法,。 实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+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为方程的近似解。

2.2 简单迭代法 思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。 步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。 2.计算x1,x1=f(x0). 3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。 4.输出x1,即为方程的近似解。

开始 输入x0,e X1=f(x0)|x1-x0|

求一个整数开根号--二分法和牛顿迭代法(求根)

求一个整数开根号--二分法和牛顿迭代法(求根) 问题叙述 求解1232cos 0x x -+=的解;通过编写matlab 程序分别用分析二分法和牛顿迭代法求解方程,通过两种方法的比较,分析二者求解方程的快慢程度。 一、问题分析 由matlab 画图命令,容易得到此方程解的范围为(2,4);两种迭代方法,在使用相同的误差(0.00001)的情况下,得出matlab 迭代次数,通过次数的比较得出二者求解速度快慢比较。 二、实验程序及注释 (1)、二分法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; a=2;b=4; %求解区间; er=b-a;ya=f(a);k=0;er0=0.00001; %误差分析; while er>er0 x0=.5*(a+b); y0=f(x0); if ya*y0<0 b=x0; %二分法求解程序; else a=x0; ya=y0; end disp([a,b]);er=b-a;k=k+1 %显示各个区间值和求解次数; end disp([a,b]); %显示最后一个区间值; (2)、牛顿迭代法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; b=3;a=4;k=0; %求解区间; y0=f(b);y=f(a); while abs(b-a)>0.00001 t=a-y*(a-b)/(y-y0); b=a;y0=y; %牛顿迭代法求解程序; a=t;y=f(a); k=k+1; disp([b,a]);k %显示各个区间值和求解次数; end disp([b,a]); %显示最后一个区间值;

数值分析——二分法和牛顿法

二分法和牛顿法的比较 二分法的基本思想是对有根区间[a,b]逐次分半,首先计算区间[a,b]的中间点x0,然后分析可能出现的三种情况:如果f(x0)f(a)<0,则f(x)在区间[a,x0]内有零点;如果f(x0)f(b)<0,则f(x)在区间[x0,b]内有零点;如果f(x0)=0,则x0是f(x)在区间[a,b]内所求零点。但是二分法的缺点是收敛速度慢且不能求复根。牛顿迭代法的基本思想是将方程f(x)=0中函数f(x)线性化,以线性方程的解逼近非线性方程的解其迭代函数为) (') ()(x f x f x x -=?。牛顿迭代法的缺点是可能发生被零除错误,且可能出现死循环。 用二分法和牛顿法分别计算多项式02432 3 =-+-x x x 的解。该多项式的解为1、1+i 和1-i ,使用二分法计算时,区间为(-1,2),使用牛顿法计算时取初始值为0。误差都为0.0001。 编程如下 二分法(erfen.m): syms x ; fun=x^3-3*x^2+4*x-2; a=-1; b=2; d=0.0001; f=inline(fun); e=b-a; k=0; while e>d c=(a+b)/2; if f(a)*f(c)<0 b=c; elseif f(a)*f(c)>0 a=c; else a=c;b=c; end e=e/2; k=k+1; end k x=(a+b)/2 牛顿法(newton.m): function [k,x,wuca] = newton() k=1; x0=0; tol=0.0001; yx1=fun(x0); yx2=fun1(x0); x1=x0-yx1/yx2; while abs(x1-x0)>tol x0=x1; yx1=fun(x0); yx2=fun1(x0); k=k+1; x1=x1-yx1/yx2; end k x=x1 wuca=abs(x1-x0)/2 end function y1=fun(x) y1=x^3-3*x^2+4*x-2; end function y2=fun1(x) y2=3*x^2-6*x+4; end 分析结果得知,在相同的误差精度下,二分法需要计算15次,而牛顿法只需计算5次,得知牛顿法比二分法优越。

二分法和牛顿法求解非线性方程(C语言)

(1)二分法求解非线性方程: #include #include #define f(x)((x*x-1)*x-1) void main() {float a,b,x,eps; int k=0; printf("intput eps\n");/*容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f,%f",&a,&b); if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do {x=(a+b)/2; k++; if(f(a)*f(x)<0)/*如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x; else if(f(a)*f(x)>0)/*否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2;/*取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f,k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721,k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x)/*定义函数f(x)*/ {return((-3*x+4)*x-5)*x+6;} float f1(float x)/*定义函数f(x)的导数*/

二分法 牛顿迭代法

2014级硕士研究生数值分析上机实习 (第一次) 姓名:乔永亮 学号:14S030125 学院:船舶与海洋工程学院 实习题目:分别用二分法和Newton 迭代法求方程02010223=-++x x x 的根. 实习目的:掌握两种解法,体会两种解法的收敛速度. 实习要求:用C 程序语言编程上机进行计算,精确到8位有效数字. 报告内容: 1. 确定实根的个数以及所在区间. 解:对函数3 2 ()21020f x x x x =++-求导,得2 ()34100f x x x '=++=。 易知()0f x '>恒成立,所以函数(x)f 没有极值,只有一个实根。又可以知道(1)0f <,(2)0f >方程在区间(1,2)有一个实根,且为奇数重根,可以二分法和Newton 求解 2. 将最后两次计算结果填入下表(保留8位数字): 3. 实习过程中遇到哪些问题?如何解决?有何心得体会? 在编程的过程中由于对基本计算原理的理解有一定不足,同时对编程语言的不熟悉,导致在编程过程中错误百出,耗费了大量时间。但是通过课本以及网络对所需知识的不断学习,通过尝试不同的方法,最终还是得到了几种不同的思路与方法。通过这次编程,深深的感受到自己的不足,同时也明白了数学与计算机编程的紧密结合,不努力提高自己在当今社会就要被淘汰。

4. 两种解法的计算程序(此页写不下时可以加页): 二分法(Fortran 语言) program Analysis1 real::a,b,c,m real::fa,fc a=1. b=2. m=0.0001 !-------------------- do while(abs(b-a)>=m) c=(a+b)/2 fa=a**3+2.*a*a+10.*a-20 fc=c**3+2.*c*c+10.*c-20 if(fa*fc<0) then b=c else a=c end if write(*,"(f10.7)")c end do pause end program Anslysis1 牛顿迭代法(Fortran语言) program Analysis2 implicit none !定义变量---------------------------------------------------------------external f,df real m,x0,x1,f,df integer i !初始化变量-------------------------------------------------------------m=0.0001 x0=1.5 !牛顿迭代法-------------------------------------------------------------do while(abs(f(x0))>=m) x1=x0-f(x0)/df(x0) x0=x1 i=i+1 write(*,"(i4,f10.7)")i,x0 end do

牛顿法和割线法

作业十(第五章):1. 在区间(0,1.5)上分别用二分法、牛顿法和割线法编程求下面的函数的零点,精度要求10-10。 22 ()=cos(2) f x x x 二分法 function [X]=bisection(fx,xa,xb,n,delta) % 二分法解方程 % fx是由方程转化的关于x的函数,有fx=0。 % xa 解区间上限 % xb 解区间下限 %解区间人为判断输入 % n 最多循环步数,防止死循环。 %delta 为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); for i=1:n xc=(xa+xb)/2;x=xc;fc=eval(fx);

X=[i,xc,fc]; if fc*fa<0 xb=xc; else xa=xc; end if (xb-xa)

return end while k<=m x=x0;g=eval(diff(fx)); x1=x0-F/g; x=x1;F=eval(fx);k=k+1; if abs(F)<=e X=[x1 F k];return end if k>m fprintf('牛顿法迭代M次没有找到方程的根') return end x0=x1; end fprintf('\n%s%.4f\t%s%d','X=',X,'k=',k) %输出结果牛顿法结果: 迭代5次结果0.5149 割线法:function [X]=gx9(fx,x0,x1,m,e)

二分法和牛顿迭代法求解方程的比较

二分法和牛顿迭代法求解方程的比较 200822401018 徐小良 一、问题叙述 求解1232cos 0x x -+=的解;通过编写matlab 程序分别用分析二分法和牛顿迭代法求解方程,通过两种方法的比较,分析二者求解方程的快慢程度。 二、问题分析 由matlab 画图命令,容易得到此方程解的范围为(2,4);两种迭代方法,在使用相同的误差(0.00001)的情况下,得出matlab 迭代次数,通过次数的比较得出二者求解速度快慢比较。 三、实验程序及注释 (1)、二分法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; a=2;b=4; %求解区间; er=b-a;ya=f(a);k=0;er0=0.00001; %误差分析; while er>er0 x0=.5*(a+b); y0=f(x0); if ya*y0<0 b=x0; %二分法求解程序; else a=x0; ya=y0; end disp([a,b]);er=b-a;k=k+1 %显示各个区间值和求解次数; end disp([a,b]); %显示最后一个区间值; (2)、牛顿迭代法程序: clear; %清除所有内存数据; f=inline('12-3*x+2*cos(x)'); format long %数据显示格式设为长型; b=3;a=4;k=0; %求解区间; y0=f(b);y=f(a); while abs(b-a)>0.00001 t=a-y*(a-b)/(y-y0); b=a;y0=y; %牛顿迭代法求解程序; a=t;y=f(a); k=k+1; disp([b,a]);k %显示各个区间值和求解次数; end disp([b,a]); %显示最后一个区间值;

数值分析求解非线性方程根的二分法,简单迭代法和牛顿迭代法

实验报告一:实验题目 一、 实验目的 掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容 1、编写二分法、牛顿迭代法程序,并使用这两个程序计算 02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 4 10- ,比较两种方法收敛速度。 2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。 3、由中子迁移理论,燃料棒的临界长度为下面方程的根cot x =(x 2?1)/2x ,用牛顿迭代法求这个方程的最小正根。 4、用牛顿法求方程f (x )=x 3?11x 2+32x ?28=0的根,精确至8位有效数字。比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。 三、 实验程序 第1题: 02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。 画图函数: function Test1() % f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0 r = 0:0.01:1; y = r + exp(r) - 2 plot(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>0 return; end for k=1:100 c=(a+b)/2; yc= c + exp(c) - 2; if abs(yc)<=delta a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if abs(b-a)

二分法-牛顿法-梯形法原理及流程图

二分法-牛顿法-梯形法原理 及流程图 -标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

1:二分法流程图: 二分法基本思路:

一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。 解方程即要求f(x)的所有零点。 假定f(x)在区间(x ,y )上连续 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2], 现在假设f(a)<0,f(b)>0,a=a ,从①开始继续使用 ② 中点函数值判断。 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。 这样就可以不断接近零点。 通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。 从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。另外,二分法不能计算复根和重根。 二分法步骤: 用二分法求方程()0f x =的根*x 的近似值k x 的步骤 ① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。 ② 取,a b 的中点12 a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算, 运行后输出结果*1x x = 若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。取111,a a b x ==; 若1()()0f a f x >,则取111,a x b b ==; ④ 若12k k b a ε -≤(ε为预先给定的要求精度)退出计算,运行后输出结果 *2k k a b x +≈,反之,返回步骤1,重复步骤1,2,3 二分法Mtalab 程序 syms x; fun=input('(输入函数形式)fx='); a=input('(输入二分法下限)a=');

1 牛顿迭代法的简介

1 牛顿迭代法的简介 1.1 牛顿迭代法的概述 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。 设r是f(x) = 0的根,选取x0作为r初始近似值,过点 (x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0) f'(x0)(x-x0),求出L与x轴交点的横坐标x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴的横坐标x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。 解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数f(x) = f(x0)+(x -x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有

f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0- f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。 1.2 牛顿迭代法的优点 迭代法是求方程近似根的一个重要方法,也是计算方法中的一种基本方法,它的算法简单,是用于求方程或方程组近似根的一种常用的算法设计方法。 牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。 牛顿法是方程求根的一个有力方法,常常能快速求出其他方法求不出或者难以求出的解。假定有一个函数y=f(x),方程f(x)=0在x = r 处有一个根,对于此根,先估计一个初始值Xo(可以是猜测的)。得到一个更好的估计值X1。为此f(X)=Xo处作该曲线的切线,并将其延长与x 轴相交。切线与x轴的交点通常很接近r ,我们用它作为下一个估计值X1,求出X1后,用X1代替Xo。重复上述过程,在x=X1处作曲线的另一条切线,并将其延长至与x轴相交,用切线的x轴截距作为下一个近似值X2……这样继续下去,所得出的这个x轴截距的序列通常迅速接近根r。

MATLAB计算方法迭代法牛顿法二分法实验报告要点

姓名实验报告成绩 评语: 指导教师(签名) 年月日

说明:指导教师评分后,实验报告交院(系)办公室保存。 实验一 方程求根 一、 实验目的 用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。并比较方法的优劣。 二、 实验原理 (1)、二分法 对方程0)(=x f 在[a ,b]内求根。将所给区间二分,在分点2a b x -= 判 断是否0)(=x f ;若是,则有根 2a b x -= 。否则,继续判断是否0)()(

(1)11x =0.09033 (2)5x =0.09052 (3)2x =0,09052 五、 实验内容 (1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不 超过 3 105.0-?。 (2)、取初值00=x ,用迭代公式=+1k x -0x )(') (k k x f x f ,求方程0210=-+x e x 的 近似根。要求误差不超过 3 105.0-?。 (3)、取初值00=x ,用牛顿迭代法求方程0210=-+x e x 的近似根。要求误 差不超过 3 105.0-?。 六、 实验步骤与实验程序 (1) 二分法 第一步:在MATLAB 7.0软件,建立一个实现二分法的MATLAB 函数文件agui_bisect.m 如下: function x=agui_bisect(fname,a,b,e) %fname 为函数名,a,b 为区间端点,e 为精度 fa=feval(fname,a); %把a 端点代入函数,求fa fb=feval(fname,b); %把b 端点代入函数,求fb if fa*fb>0 error('两端函数值为同号'); end %如果fa*fb>0,则输出两端函数值为同号 k=0 x=(a+b)/2 while(b-a)>(2*e) %循环条件的限制

二分法-牛顿法-梯形法原理及流程图

1:二分法流程图: 二分法基本思路:

一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。 解方程即要求f(x)的所有零点。 假定f(x)在区间(x ,y )上连续 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2], 现在假设f(a)<0,f(b)>0,a=a ,从①开始继续使用 ② 中点函数值判断。 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。 这样就可以不断接近零点。 通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。 从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。另外,二分法不能计算复根和重根。 二分法步骤: 用二分法求方程()0f x =的根*x 的近似值k x 的步骤 ① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。 ② 取,a b 的中点12 a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算,

运行后输出结果*1x x = 若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。取111,a a b x ==; 若1()()0f a f x >,则取111,a x b b ==; ④ 若12k k b a ε-≤(ε为预先给定的要求精度)退出计算,运行后输出结果 *2k k a b x +≈,反之,返回步骤1,重复步骤1,2,3 二分法Mtalab 程序 syms x; fun=input('(输入函数形式)fx='); a=input('(输入二分法下限)a='); b=input('(输入二分法上限)b='); d=input('输入误差限 d=')%二分法求根 %f=inline(x^2-4*x+4); %修改需要求解的inline 函数的函数体 f=inline(fun);%修改需要求解的inline 函数的函数体 e=b-a; k=0 ; while e>d c=(a+b)/2; if f(a)*f(c)<0 b=c; elseif f(a)*f(c)>0 a=c;

牛顿迭代法与二分法1

用二分法和牛顿迭代法编程 一. 实验课题 用二分法和牛顿迭代法编程求方程 sinx-x2/2=0 的实根,要求误差不超过0.00001。输出迭代次数,初始值和根的近似值;再构造不同的迭代函数,用迭代法求解,并进行比较。 二. 实验步骤 (一) 用matlab作函数y=sinx-x2/2的图,步骤如下: 先作一个名为fun1.m的 M文件 function y1=fun1(x) y1=sinx-x2/2; 接着使用下列命令在区间[-0.5,2]上作该函数的图象,并估计y1=0时x的根的大致区间。 x=-0.5:0.01:2; plot (x,fun1(x),‘b’) hold on plot(x,zeros(size(x))) hold off grid

由图象的结果观察可知:上述方程在(1,1.5)上有一实根。 (二)用二分法求方程的近似根 由|b-a|/(2^(n+1))≤ε可以得到n≥13, 故预定最大计算次数为15次。 作一个名为fun2.m的M文件,步骤如下:function X=fun2(a,b) n=15; ε=0.01; k=1; X=(a+b)/12; while fabs(a-b)≥ε if fun1(X)==0; break end

if fun1(a)*fun1(X)<0; b=X; else a=X; end k=k+1; if k>n,k, error(‘fail’) else X=(a+b)/2; end end [‘Iterative times=’,int2str(k)] 在命令窗口输入命令:r=fun2(1,1.5) 运行后得到结果为:ans=Iterative times=13 r=1.4408 (三)用牛顿迭代法求方程的近似根 具体步骤如下: 1. 选择迭代函数φ(x)=x-f(x)/f’(x)。 2.选定初始值x0与x1,并算出相应的f(x0)与f(x1),并保证迭代算出的x1比x0更接近所求的根。 3.对于预定的精度ε>0,取x0=0.5,当|x k+1-x k|≥ε时,停止迭代过程并取x k+1,则 x k+1即为方程根的近似值。否则转回去继续算,若迭代次数超过预先给定的次数仍达不到精度要求,则输出迭代失败的标志。 定义一个名为fun3.m的M文件

二分法-牛顿法-梯形法原理及流程图

1:二分法流程图:

Y 二分法基本思路: 一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。解方程即要求f(x)的所有零点。假定f(x)在区间(x,y)上连续 先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2], 现在假设f(a)<0,f(b)>0,a=a,从①开始继续使用 ②中点函数值判断。 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,

从①开始继续使用 中点函数值判断。 这样就可以不断接近零点。 通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。 从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。另外,二分法不能计算复根和重根。 二分法步骤: 用二分法求方程()0f x =的根*x 的近似值k x 的步骤 ① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。 ② 取,a b 的中点12a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算, 运行后输出结果*1x x = 若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。取111,a a b x ==; 若1()()0f a f x >,则取111,a x b b ==; ④ 若12k k b a ε -≤(ε为预先给定的要求精度)退出计算,运行后

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

实验五 一、实验目的与要求: 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 1

x0x1 (4)令= ,转向(1)。 三、实验题目: 1、用二分法求方程f(x)=x^3+4*x*x-10在区间[1,1.5]上的根,要求求出具有3位有效数的近似根。 2、用牛顿法求方程x^3-3x-1=0在x=2附近的根。 四、程序: 一、二分法 #include 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;

相关文档
最新文档