C语言求解一元二次方程的解源码(迭代法,二分法,牛顿迭代法)

C语言求解一元二次方程的解源码(迭代法,二分法,牛顿迭代法)
C语言求解一元二次方程的解源码(迭代法,二分法,牛顿迭代法)

#include

#include

#include

#define maxint 32767.0

#define minint -32768.0

#define accuracy 0.0000001//精确度,值越小计算结果越精确

float a,b,c;//系数

float dt;//b^2-4ac

float x1=0.0,x2=0.0;//方程的解

void read();

void setDt();

int assertX();

void binarySolution();

void interation();

void newtonInteration();

double f(double x);

double f1(double x);

double absolute(double x);

void accurate();

int main(void)

{

int end=1;

while(end!=0)//继续运算

{

accurate();

printf("按任意键继续(输入0退出):\n");

scanf("%d",&end);

}

}

//读取a,b,c

void read()

{

printf("请输入方程ax^2+bx+c=0的系数a,b,c:\n");

printf("请输入二次项系数a:");

while(0==scanf("%f",&a)||a==0)

{

while('\n' != getchar()){}

printf("输入无效!请重新输入二次项系数a:");

}

printf("请输入一次项系数b:");

while(0==scanf("%f",&b))

{

while('\n' != getchar()){}

printf("输入无效!请重新输入一次项系数b:");

}

printf("请输入常数项c:");

while(0==scanf("%f",&c))

{

while('\n' != getchar()){}

printf("输入无效!请重新输入常数项c:");

}

}

//计算dt

void setDt()

{

dt=b*b-4*a*c;

}

//判断是否有解

int assertX()

{

if(dt>=0) return 1;

return 0;

}

//循环计算控制

void accurate()

{

read();

setDt();

int method=0;

printf("请选择求解方法:\n\t1.二分法\n\t2.迭代法\n\t3.牛顿迭代法\n请选择:");

while((0==scanf("%d",&method))||(method!=1&&method!=2&&method!=3))

{

while('\n' != getchar()){}

printf("输入无效!请重新选择:");

}

if(!assertX())

{

printf("该方程无解!\n");

}

else

{

switch(method)

{

case 1:

binarySolution();

break;

case 2:

interation();

break;

case 3:

newtonInteration();

break;

}

printf("方程%fx^2+%fx+%f=0的解为:x1=%.10f x2=%.10f\n",a,b,c,x1,x2); }

}

//二分法

void binarySolution()

{

double min=minint,temp=(-1.0*b)/(2*a),max=maxint,middle=0.0;

//求解X1

while((max-temp)>=accuracy)

{

middle=(max+temp)/2;

if(a>0)//开口向上

{

if(f(middle)>0)

max=middle;

else

temp=middle;

}

else//开口向下

{

if(f(middle)>0)

temp=middle;

else

max=middle;

}

}

x2=temp;

//求解X2

temp=(-1.0*b)/(2*a);

while((temp-min)>=accuracy)

{

middle=(min+temp)/2;

if(a>0)//开口向上

{

if(f(middle)>0)

min=middle;

else

temp=middle;

}

else//开口向下

{

if(f(middle)>0)

temp=middle;

else

min=middle;

}

}

x1=temp;

}

//迭代法

void interation()

{

//求解X1,在曲线对称轴处选择初始点

double index=(-1.0*b)/(2*a),temp;

if(b!=0)//b不等于0时进行迭代

{

temp=index;

index=-1.0*(a*temp*temp+c)/b;

while((absolute(index-temp))>accuracy) {

temp=index;

index=-1.0*(a*temp*temp+c)/b;

}

x1=index;

x2=(-1.0*b)/a-x1;

}

else//b=0时ax^2+c=0直接求解

{

x1=sqrt(-1.0*c/a);

x2=-x1;

}

}

//牛顿迭代法

void newtonInteration()

{

//求解X1,在曲线对称轴右侧选取初始点

double index=(-1.0*b)/(2*a)+10,temp; temp=index;

index=temp-f(temp)/f1(temp);

while((absolute(index-temp))>accuracy) {

temp=index;

index=temp-f(temp)/f1(temp);

}

x1=index;

//求解X2,在曲线对称轴左侧选取初始点

index=(-1.0*b)/(2*a)-10,temp;

temp=index;

index=temp-f(temp)/f1(temp);;

while((absolute(index-temp))>accuracy) {

temp=index;

index=temp-f(temp)/f1(temp);

}

x2=index;

}

//函数f(x)

double f(double x)

{

return a*x*x+b*x+c;

}

//函数f(x)的一次导函数

double f1(double x)

{

return 2.0*a*x+b;

}

//求解绝对值

double absolute(double x) {

if(x<=0) return (-1.0*x); return x*1.0;

}

牛顿迭代法文献综述

“牛顿迭代法”最新进展文献综述牛顿法是一种重要的迭代法,它是逐步线性化的方法的典型代表。牛顿迭代法又称为牛顿-拉夫逊方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。 介绍一下牛顿迭代法研究的前沿进展,1992年南京邮电学院基础课部的夏又生写的一篇题名一类代数方程组反问题的牛顿迭代法,对一类代数方程组反问题提出了一个可行的迭代解法。从算法上看,它是一种解正问题—迭代—解正问题迭代改善的求解过程。湖南师范大学的吴专保;徐大发表的题名堆浸工艺中浸润面的非线性问题牛顿迭代方法,为了研究堆浸工艺的机理,用牛顿迭代公式寻求浸润面的非线性方程的数值解,经过14次迭代的误差达到了,说明此算法收敛有效。浙江大学电机系的林友仰发表的牛顿迭代法在非线性电磁场解算中的限制对非线性电磁场解算中的限制做了分析,求解非线性方程组时迭代法是不可避免的。牛顿—拉斐森迭代法由于它的收敛速度快常被优先考虑。应用这个方法的主要问题是求雅可比矩阵。因为雅可比矩阵元素的计算非常费时。然而,本文要说明的是当利用以三角形为单元的有限元法求解非线性方程组时,应用牛顿法其雅可比矩阵容易求得,并且它保持了原系数的对称性和稀疏性,因而节省了时间。与此相反,若在差分法中应用牛顿迭代,并且按习惯用矩形网格进行剖分,则雅可比阵的计算很费时,而且不再保持原有对称性,这就使得存贮量和计算时间大为增加。南株洲工学院信息与计算科学系的吕勇;刘兴国发表的题名为牛顿迭代法加速收敛的一种修正格式,主要内容牛顿迭代法是求解非线性方程的一种重要的数值计算方法,在通常情况下,它具有至少平方收敛。本文利用文献[4]所建立的迭代格式xn+1=xn-αf(xfn)(x+n)f′(xn),对迭代格式中的参数α的讨论,实现了牛顿迭代法加速收敛的一种修正格式。

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

非线性方程组的牛顿迭代法的应用

CENTRAL SOUTH UNIVERSITY 数值分析实验报告

非线性方程组的牛顿迭代法的应用 一、问题背景 非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化的,为得到更符合实际的解答,往往需要直接研究非线性科学,它是21世纪科学技术发展的重要支柱,非线性问题的数学模型有无限维的如微分方程,也有有限维的。道遥咏计算机进行科学计算都要转化为非线性的单个方程或方程组的求解。从线性到非线性是一个质的变化,方程的性质有本质不同,求解方法也有很大差别。本文主要介绍的是非线性方程组的牛顿迭代法的数值解法。 二、数学模型 对于方程()0=x f ,如果()x f 湿陷性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将线性方程()0=x f 逐步归结为某种线性方程来求解。 设已知方程()0=x f 有近似根k x (假定()0'≠k x f ),将函数()x f 在点k x 展开,有 ()()()()k k k x x x f x f x f -+≈', 于是方程()0=x f 可近似地表示为 ()()()0'=-+k k k x x x f x f 这是个线性方程,记其根为1+k x ,则1+k x 的计算公式 ()() k k k k x f x f x x ' 1- =+, ,1,0=k 这就是牛顿法。 三、算法及流程 对于非线性方程 ()()()???? ????????=n n n n x L x x f M x L x x f x L x x f f ,,,,,,,,,2 1212211 在()k x 处按照多元函数的泰勒展开,并取线性项得到

数值计算(二分法、简单迭代法、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次,得知牛顿法比二分法优越。

牛顿迭代法及其应用教学提纲

编号 毕业设计(论文)题目 Newton Raphson 算法及其应用 二级学院数学与统计学院 专业信息与计算科学 班级108010101

学生姓名侯杰学号10801010106 指导教师职称 时间 目录 摘要 (3) Abstract (3) 一、绪论 (4) 1.1 选题的背景和意义 (4) 1.2 牛顿迭代法的优点及缺点 (4) 二、Newton Raphson 算法的基本原理 (5) 2.1 Newton Raphsn算法 (5) 2.2 一种修正的Newton Raphsn算法 (7) 2.3 另外一种Newton Raphsn算法的修正 (11) 三、Newton Raphson 算法在计算方程中的应用 (18) 四、利用牛顿迭代法计算附息国债的实时收益率 (21) 4.1附息国债实时收益率的理论计算公式 (22) 4.2附息国债实时收益率的实际计算方法 (22)

4.3利用牛顿迭代法计算 (23) 五、结论 (26) 致谢 (27) 参考文献 (28) 摘要 牛顿在17世纪提出的一种近似求解方程的方法,即牛顿拉夫森迭代法.迭代法是一种不断的用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或被称为一次解法,即一次性解决的问题.迭代法又分为精确迭代以及近似迭代.“牛顿迭代法”就属于近似迭代法,本文主要讨论的就是牛顿迭代法,方法本身的发现到演变到修正的过程,避免二阶导数计算的Newton迭代法的一个改进,以及用牛顿迭代法解方程,利用牛顿迭代法计算国债的实时收益率。 关键词:Newton Raphson迭代算法;近似解;收益率; Abstract In the 17th century,Newton raised by an approximate method of solving equations,that is Newton Iteration,a process of recursion new value constantly with the old value of variable. Correspond with the iterative method is a direct method or as a solution,that is a one-time problem solving. Iteration is divided into exact iterative and approximate iterative. "Newton Iterative Method" are approximate iterative method. This article mainly focuses on the Newton Iteration. The main contents of this article include the discovery,evolution and amendment process of this methods; an improve of avoiding calculating Newton Iteration with second-order derivative; Newton Raphson iterative method of solving equations and Calculating the real-time yield of government bonds. Keywords: Newton Iterative Algorithm; approximate solution; Yield;

二分法和牛顿法求解非线性方程(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)的导数*/

非线性方程组的牛顿迭代法的应用

非线性方程组的牛顿迭代法的应用

CENTRAL SOUTH UNIVERSITY 数值分析实验报告

非线性方程组的牛顿迭代法的应用 一、问题背景 非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化的,为得到更符合实际的解答,往往需要直接研究非线性科学,它是21世纪科学技术发展的重要支柱,非线性问题的数学模型有无限维的如微分方程,也有有限维的。道遥咏计算机进行科学计算都要转化为非线性的单个方程或方程组的求解。从线性到非线性是一个质的变化,方程的性质有本质不同,求解方法也有很大差别。本文主要介绍的是非线性方程组的牛顿迭代法的数值解法。 二、数学模型 对于方程()0=x f ,如果()x f 湿陷性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将线性方程()0=x f 逐步归结为某种线性方程来求解。 设已知方程()0=x f 有近似根k x (假定()0'≠k x f ),将函数()x f 在点k x 展开,有 ()()()()k k k x x x f x f x f -+≈', 于是方程()0=x f 可近似地表示为 ()()()0'=-+k k k x x x f x f 这是个线性方程,记其根为1+k x ,则1+k x 的计算公式 () () k k k k x f x f x x ' 1- =+, ,1,0=k 这就是牛顿法。 三、算法及流程 对于非线性方程 ()()()???? ????????=n n n n x L x x f M x L x x f x L x x f f ,,,,,,,,,2 12 12211 在()k 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

线性方程组的迭代法应用及牛顿迭代法的改进

线性方程组的迭代法应用及牛顿迭代法的改进 摘要: 迭代解法就是通过逐次迭代逼近来得到近似解的方法。由于从不同 的问题而导出的线性代数方程组的系数矩阵不同,因此对于大型稀疏矩阵所对应线性代数方程组,用迭代法求解。本文论述了Jacobi 法,Gauss-Seidel 法,逐次超松弛法这三种迭代法,并在此基础上对牛顿型的方法进行了改进,从而使算法更为精确方便。 关键词:线性方程组,牛顿迭代法,Jacobi 法,Gauss-Seidel 法,逐次超松弛 法 1.线性方程组迭代法 1.1线性方程组的迭代解法的基本思想 迭代法求解基本思想:从某一初始向量X (0)=[x 1(0) ,x 2(0) ,……………x n (0) ]出发,按某种迭代规则,不断地对前一次近似值进行修改,形成近似解的向量{X (k)}。当近似解X (k) =[x 1(k) ,x 2(k) ,……………x n (k) ]收敛于方程组的精确解向量X* =[x 1*,x 2*,……………x n *]时,满足给定精度要求的近似解向量X (k)可作为X*的数值解。 1.2 线性方程组的迭代法主要研究的三个问题 (1) 如何构造迭代公式 (2) 向量数列{X (k)}的收敛条件 (3) 迭代的结束和误差估计 解线性方程组的迭代解法主要有简单迭代法、 Gauss-Seidel 法和SOR 法。简单迭代法又称同时代换法或Jacobi 法,是最简单的解线性方程组的迭代解法也是其他解法的基础。 1.3Jacobi 迭代法 设方程组点系数矩阵n n j A ai R ???=∈??满足条件0ii a ≠,i=0,1,2, …n 。把A 分解为 A=D+L+U

牛顿法和割线法

作业十(第五章):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]); %显示最后一个区间值;

利用牛顿迭代法求解非线性代数方程组

利用牛顿迭代法求解非线性代数方程组 一、 问题描述 在实际应用的很多领域中,都涉及到非线性方程组的求解问题。由于方程的非线性,给我们解题带来一定困难。牛顿迭代法是求解非线性方程组的有效方法。下面具体对牛顿迭代法的算法进行讨论,并通过实例理解牛顿迭代法。 二、 算法基本思想 牛顿迭代法求解非线性代数方程组的主要思想是将非线性函数线性化。下面我们具体讨论线性化过程: 令: ()()()()?? ?? ????????=????? ???????=????????????=0000,,2121 n n x x x x x f x f x f x F (3-1) 则非线性方程组(3-2) ()()()0 ,,,0 ,,,0,,,21212211===n n n n x x x f x x x f x x x f (3-2) 可写为向量形式 ()0=x F (3-3) ? ()0=x F 成为向量函数。

设()()() ()k n k k x x x ,,,2 1 是方程组(3-2)的一组近似解,把它的左端在()()() ()k n k k x x x ,,,2 1 处用多元函数的泰勒展式展开,然后取线性部分,便得方程组(3-2)得近似方程组 ()()() ( ) ()()() () ()()()() ( )()()() () ()()() () ( ) ()()() () ()0 ,,,,,,0 ,,,,,,0 ,,,,,,1 21211 2122121 211211=???+=???+=???+∑∑∑===k j n j k n k k n k n k k n k j n j k n k k k n k k k j n j k n k k k n k k x x x x x f x x x f x x x x x f x x x f x x x x x f x x x f (3-4) 这是关于()()()n i x x x k i i k i ,,2,1 =-=?的线性方程组,如果它的系数矩阵 ????????? ???????????????????????????????n n n n n n x f x f x f x f x f x f x f x f x f 2 1 2221 2121 11 (3-5) 非奇异,则可解得 () ()()???? ?? ? ???????---?????????? ??????????????????????????????=?????????????????-n n n n n n n k n k k f f f x f x f x f x f x f x f x f x f x f x x x 21 1 2 1 2221 2121 11 21 (3-6) 矩阵(3-5)称为向量函数()x F 的Jacobi 矩阵,记作()x F ' 。又记

牛顿迭代法论文

目录 一牛顿迭代法的简介 (4) 1.1 牛顿迭代法的产生背景 (4) 1.2 牛顿迭代法的概述 (4) 1.3 牛顿迭代法的优点 (4) 二牛顿迭代法的分析 (4) 2.1 牛顿迭代法的思想 (4) 2.2 牛顿迭代法的要求 (5) 2.3 牛顿.迭代法 (6) 三牛顿迭代求根的方法 (7) 四牛顿迭代法具体例子的实现 (7) 伍牛顿迭代法的收敛性 (10) 六、迭代求根应注意的事项 (10) 七、参考文献 (11) 八附录.c语言代码 (13)

题目: 牛顿法---插值方法 摘要: 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。牛顿迭代法是一个重要的计算方法和思想。牛顿迭代法的主要功能:计算方程时可以比较快速方便的计算出来结果但并不影响计算出来结果的精确度,运用于多种工业设计和数学设计方面. 关键字: 牛顿迭代方程根算法

一 .牛顿迭代法简介 1.1 牛顿迭代法的产生背景 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。 1.2 牛顿迭代法的概述 牛顿迭代法(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.3 牛顿迭代法的优点 迭代法是求方程近似根的一个重要方法,也是计算方法中的一种基本方法,它的算法简单,是用于求方程或方程组近似根的一种常用的算法设计方法。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具

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

实验报告一:实验题目 一、 实验目的 掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容 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)

相关文档
最新文档