实验五用Newton法计算方程的根.doc

合集下载

使用“牛顿迭代法”求解方程

使用“牛顿迭代法”求解方程

使⽤“⽜顿迭代法”求解⽅程使⽤⽜顿迭代法求解⽅程尽管通过因式分解和利⽤求根公式可以很⽅便的得出多项式⽅程的根,但⼤多数时候这个多项式的次数都很⾼,计算将变得⾮常复杂,因此,我们必须转向⼀些近似解法。

⽜顿迭代法是其中最好的⽅法之⼀。

从根本上说,⽜顿迭代法通过⼀系列的迭代操作使得到的结果不断逼近⽅程的实根。

⾸先,要选择⼀个初始值x=x0,使得该初始值接近实根的值。

然后,迭代计算如下的公式:x i+1 = x i - f(x i) / f '(x i)直到x i+1达到⼀个满意的近似结果为⽌。

在这个公式中,f(x)是要求解的多项式⽅程,⽽f '(x)是f(x)的导数。

多项式求导多项式求导是微积分的基础,现在让我们来看看针对多项式求导的公式化描述。

要计算出多项式的求导结果,只需要对多项式的每⼀项套⽤如下两个公式:d/dx * k = 0, d/dx *kx r = krx r-1这⾥的k是为常数,r是有理数,x是未知数。

符号d/dx表⽰求导,其中x是多项式中的变量。

对于多项式中的每⼀常数项,套⽤第⼀个公式;否则,就⽤第⼆个公式。

假设有如下函数:f(x) = x3 + 5x2 +3x +4要得到求导后的结果f '(x),对该多项式的前三项套⽤第⼆个公式,最后⼀项套⽤第1个公式,得到结果如下:f '(x) = 1 * 3x(3-1) + 5 * 2x(2-1) + 3 * 1x(1-1) + 0 = 3x2 + 10x +3有时候也有必要进⾏⾼阶求导,即导数的导数。

⽐如,f(x)的2阶求导可记为f ''(x),它是对f '(x)的求导结果。

同理,f(x)的3阶求导可记为f'''(x),这是对f ''(x)的求导结果,以此类推。

因此,在前⾯的例⼦中,如果要计算f(x)的2阶导数的话,我们按照如下的⽅式对f '(x)求导即可:f ''(x) = 3 * 2x(2-1) + 10 * 1x(1-1) + 0 =6x +10理解1阶和2阶导数理解1阶和2阶导数的意义,是正确使⽤⽜顿迭代法⾮常重要的⼀点。

牛顿法求非线性方程的根

牛顿法求非线性方程的根

学科前沿讲座论文班级:工程力学13-1班姓名:陆树飞学号:02130827牛顿法求非线性方程的根一 实验目的(1)用牛顿迭代法求解方程的根(2)了解迭代法的原理,了解迭代速度跟什么有关题目:用Newton 法计算下列方程(1) 013=--x x , 初值分别为10=x ,7.00=x ,5.00=x ;(2) 32943892940x x x +-+= 其三个根分别为1,3,98-。

当选择初值02x =时给出结果并分析现象,当6510ε-=⨯,迭代停止。

二 数学原理对于方程f(x)=0,如果f(x)是线性函数,则它的求根是很容易的。

牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来求解。

设已知方程f(x)=0有近似根x k (假定k f'(x )0≠) ,将函数f(x)在点x k 进行泰勒展开,有k k k f(x)f(x )+f'(x )(x-x )+≈⋅⋅⋅于是方程f(x)=0可近似的表示为k k k f(x )+f'(x )(x-x )=0这是个线性方程,记其根为x k+1,则x k+1的计算公式为k+1k ()x =x -'()k k f x f x ,k=0,1,2,… 这就是牛顿迭代法。

三 程序设计(1)对于310x x --=,按照上述数学原理,编制的程序如下program newtonimplicit nonereal :: x(0:50),fx(0:50),f1x(0:50)!分别为自变量x ,函数f(x)和一阶导数f1(x)integer :: kwrite(*,*) "x(0)="read(*,*) x(0) !输入变量:初始值x(0)open(10,file='1.txt')do k=1,50,1fx(k)=x(k-1)**3-x(k-1)-1f1x(k)=3*x(k-1)**2-1x(k)=x(k-1)-fx(k)/f1x(k) !牛顿法write(*,'(I3,1x,f11.6)') k,x(k) !输出变量:迭代次数k 及x 的值 write(10,'(I3,1x,f11.6)') k,x(k)if(abs(x(k)-x(k-1))<1e-6) exit !终止迭代条件end dostopend(2)对于32943892940x x x +-+=,按照上述数学原理,编制的程序如下program newtonimplicit nonereal :: x(0:50),fx(0:50),f1x(0:50)!分别为自变量x ,函数f(x)和一阶导数f1(x)integer :: kwrite(*,*) "x(0)="read(*,*) x(0) !输入变量:初始值x(0)open(10,file='1.txt')do k=1,50,1fx(k)=x(k-1)**3+94*x(k-1)**2-389*x(k-1)+294f1x(k)=3*x(k-1)**2+188*x(k-1)-389x(k)=x(k-1)-fx(k)/f1x(k) !牛顿法write(*,'(I3,1x,f11.6)') k,x(k) !输出变量:迭代次数k 及x 的值 write(10,'(I3,1x,f11.6)') k,x(k)if(abs(x(k)-x(k-1))<5e-6) exit !终止迭代条件end dostopend四 结果分析和讨论(1)对于方程 013=--x x , 当初始值初值分别为10=x ,7.00=x ,5.00=x 时;所得结果如下分析与讨论:从计算结果可以看出,当取的初始值不同时,虽然均得到了近似解x*=1.324718,但收敛速度明显不同。

使用牛顿迭代法求解平方根

使用牛顿迭代法求解平方根

使用牛顿迭代法求解平方根牛顿迭代法是一种用于求解方程的数值方法,它可以用来近似求解平方根。

本文将介绍牛顿迭代法的原理和步骤,并通过一个简单的示例来说明其应用。

牛顿迭代法的基本思想是通过不断逼近函数的零点来求解方程。

对于求解平方根的问题,我们可以将其转化为求解方程f(x) = x^2 - a = 0的根,其中a为待求平方根的数。

我们需要选择一个初始点x0作为迭代的起点。

然后,通过牛顿迭代公式x = x0 - f(x0)/f'(x0)来计算下一个近似解x1,其中f'(x)表示函数f(x)的导数。

这个公式的意义是用切线与x轴的交点作为下一个近似解。

接下来,我们用x1作为新的起点,再次应用迭代公式计算x2。

不断重复这个过程,直到我们得到一个满足精度要求的近似解。

下面,通过一个具体的例子来演示牛顿迭代法的求解过程。

假设我们要求解的平方根是2,我们可以选择初始点x0 = 1作为起点。

我们计算f(x0)和f'(x0)的值。

代入f(x) = x^2 - 2的表达式,我们得到f(1) = 1^2 - 2 = -1和f'(1) = 2。

然后,代入牛顿迭代公式,得到x1 = 1 - (-1)/2 = 1.5。

接着,我们计算f(x1)的值,代入f(1.5) = 1.5^2 - 2 = 0.25。

由于f(x1)的值不满足精度要求,我们继续迭代。

以x1作为新的起点,计算f(x1)和f'(x1)的值。

代入公式,得到x2 = 1.5 - 0.25/2 = 1.375。

计算f(x2)的值,代入f(1.375) = 1.375^2 - 2 = -0.140625。

再次迭代,以x2作为新的起点,计算f(x2)和f'(x2)的值。

代入公式,得到x3 = 1.375 - (-0.140625)/2 = 1.4140625。

计算f(x3)的值,代入f(1.4140625) = 1.4140625^2 - 2 = -0.0009765625。

NEWTON 法求根

NEWTON 法求根

f (x k ) xk +1= xk - (xk − xk−1 ),即为割线法。收敛阶为 1.618。 f (xk ) − f (xk −1 )
3、大 M 法
用某一给定的数 M 来代替f ′ ( xk )得到迭代公式: x k +1 =xk -
19
f (x k ) ,这种做法更加简便。称作大 M 法。 M 下一页
x k +1 = ϕ( x k ) 具有局部收敛性。再将ϕ( x k ) 在根 x * 处展开,利
用条件(*),则有ϕ ( x
k
) = ϕ(x ) +
*
ϕ ( p ) (ζ )
p!
( xk − x * ) p
*
注意到 ϕ( x k ) = x k +1, ( x * ) = ϕ
ϕ ( p ) (ζ ) * ( xk − x * ) p 由上式得 xk +1 − x = x p!
n
xn
,所以迭代公式为
3 2 xn+1 = xn −(xn + 2xn +10xn − 20 /(3xn + 4xn +10 选取x 0 = 1 ,计算结果 ) 2 )
1 2 3 4 1 .4 1 1 7 6 4 7 0 6 1 .3 6 9 3 3 6 4 7 1 1 .3 6 8 8 0 8 1 8 9 1 .3 6 8 8 0 8 1 0 8
< ε
1
f0 f 0′
迭代一次,得到新的近

f1 < ε 2
.则终止迭代,
以 x1作为所求的根;否则转步四。此处 ε1 , ε 2 是允许误差,
15
下一页
返回

实验五 用Newton法计算方程的根

实验五 用Newton法计算方程的根

五. 讨论分析当初始值选取离零点较远时将导致算法无法使用,例如第三题,将初始值改为2就无法计算出结果了,显示如下例如求020sin 35=-+-x x e x 的根,其中控制精度1010-=eps ,最大迭代次数40=M ,在steffensen 加速迭代方法的程序中,我们只需改动:it_max=40; ep=1e-10, 其余不变 。

利用以上程序,我们只需输入:phi=inline('exp(5*x)-sin(x)+(x)^3-20');[x_star,index,it]=steffensen(phi,0.5)可得:x_star = 0.637246094753909index = 0it = 41观察上述结果,index = 0,it = 41表明迭代失败,所以使用以上方法估计的时候,应该尽量估计出解的范围,偏离不应过大,距离增加迭代次数增加,也有可能迭代失败六. 改进实验建议根据上述分析,我认为,应该先对函数作一个简图,方便知道解的大概位置,然后我们才将这个大概值代入Newton 法或者Steffensen 中进行求解。

当然,我们可以用其他数学软件实现Newton 迭代法,我们可以用z-z 超级画板,其操作流程为:牛顿迭代法的公式是:x n+1=x n-f(x n)/f'(x n)。

下面我们就用牛顿迭代法设计程序求方程f(x)=ln(x)+2*x-6的近似解。

(一)观察方程f(x)=0的零点位置(1)显示坐标系的坐标刻度。

(2)作出函数y=ln(x)+2*x-6的图像,如下图所示:可以观察到方程的根在区间[2,3]上,我们可以设定近似解的初始值为2。

(二)设计求方程近似解的程序(1)在程序工作区中输入:f(x){ln(x)+2*x-6;}执行后,返回结果为:>> f(x) #这表示在计算机已经完成了函数f(x)的定义。

(2)定义f(x)的导函数g(x),在程序工作区中输入:Diff(f(x),x);执行后,返回结果为:>> 2+1/x #得到了f(x)的导函数。

牛顿迭代法求平方根

牛顿迭代法求平方根

牛顿迭代法求平方根牛顿迭代法(NewtonMethod)又称为牛顿-拉夫(Newton-Raphson)方法,是19世纪摩尔神父特拉沃尔纳斯牛顿在1700年创立的数值分析方法,用于解决多项式方程的根。

本文便以牛顿迭代法求求平方根这一话题,来具体介绍牛顿迭代法的原理和实现技术。

一、牛顿迭代法的概念所谓迭代法,就是重复运用某种规律多次得到解决方案。

牛顿迭代法是一种数值分析方法,它通过使用一系列近似极值点的迭代来搜索解决方案。

它既可以用来解决线性方程,也可以解决更复杂的非线性方程。

牛顿-拉夫(Newton-Raphson)方法对于求解平方根特别有效,可以快速收敛。

二、牛顿迭代法求求平方根1.一个数a的平方根,首先要把它转换为求解根的形式,即把求平方根转换为函数求解的问题:$f(x)=x^2-a=0$2.解函数f(x)的解时,可以采用牛顿迭代法,牛顿迭代法核心步骤:(1)求函数f(x)的导数:$f^{prime}(x)=2x$(2)找准一个初始值$x_0$,把它代入函数f(x)和其导数$f^{prime}(x)$,得到下一次的值:$x_1=x_0-frac{f(x_0)}{f^{prime}(x_0)}$(3)重复执行上述步骤,直到xn收敛:$x_{n+1}=x_n-frac{f(x_n)}{f^{prime}(x_n)}$3. 以求a的平方根为例:(1)函数$f(x)=x^2-a$的导数是$f^{prime}(x)=2x$(2)设$x_0$为猜测的值,则可以得到:$x_1=x_0-frac{x_0^2-a}{2x_0}$(3)重复此步骤,直到$x_n$收敛:$x_{n+1}=x_n-frac{x_n^2-a}{2x_n}$三、牛顿迭代法求求平方根应用实例这里以求解输入为12的平方根为例,用牛顿迭代法求出其平方根值。

首先,把问题转换为函数求解的问题,函数为:$f(x)=x^2-12=0$接着,求函数的导数:$f^{prime}(x)=2x$设猜测的$x_0$值为3,则可以得到:$x_1=3-frac{3^2-12}{2times3}=3-frac{3}{6}=2.5 $ 重复上述步骤,经10次迭代,可收敛到:$x_{10}=3.464101615$从上述结果可以看出,用牛顿迭代法求出的12的平方根为3.464101615,误差极小。

牛顿法

牛顿法

牛顿法牛顿迭代法牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。

多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。

方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。

牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程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.01x =-xe2.02lg =-+x x【算法说明】牛顿法计算算法:1. 选定初始近似值0x ,计算)(f ,)(f 0000x f x f '='=2.按照公式 0001x f f x '-= 迭代一次,得到新的近似值1x ,计算)(f ,)(f 1111x f x f '='=3.如果 1x 满足1εδ<或者21f ε<,则终止迭代,以1x 作为所求的根;否则转步骤4,此处21,εε是允许误差,而⎪⎪⎩⎪⎪⎨⎧≥-<-=时x 当,x x 时x ,当x 111101c x c x δ 其中c 是取绝对误差或者相对误差的控制常数,一般可取c=1;4.如果迭代次数达到预先指定的次数N ,或者0f 1=',则方法失败,否则以),,x (111f f '代替),,x (000f f '转步骤2继续迭代。

【源程序】方程1的代码: #include<math.h> #include<stdio.h> int main() { double f,f1,x0,x1;printf("请输入x1的值:\n");scanf("%lf",&x1);do{x0=x1;f=exp(-1*x0)-x0;f1=-1*exp(-1*x0)-1;//一介导函数x1=x0-f/f1;}while(fabs(x1-x0)>=1e-5);printf("方程的值为%lf",x1);}方程2的代码:#include"stdio.h"#include"math.h"double func(double x) //函数{return log10(x)+x-2;}double func1(double x) //导函数{return 1/(x*log(10))+1;}int Newton(double *x,double precision,int maxcyc) //迭代次数{double x1,x0;int k;x0=*x;for(k=0;k<maxcyc;k++){if(func1(x0)==0.0)//若通过初值,函数返回值为0{printf("迭代过程中导数为0!\n");return 0;}x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算if(fabs(x1-x0)<precision || fabs(func(x1))<precision) //达到结束条件{*x=x1; //返回结果return 1;}else //未达到结束条件x0=x1; //准备下一次迭代}printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度return 0;}int main(){double x,precision;int maxcyc;printf("输入初始迭代值x0:");scanf("%lf",&x);printf("输入最大迭代次数:");scanf("%d",&maxcyc);printf("迭代要求的精度:");scanf("%lf",&precision);if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1printf("该值附近的根为:%lf\n",x);else //若函数返回值为0printf("迭代失败!\n");return 0;}【实验结果】该图为二次方程01x =-xe的计算结果即:x=0.567143 迭代初始值为x1=0.5该图为二次方程02lg =-+x x 的计算结果 即x=1.755579 迭代初值为:1,最大迭代次数为56【实验结果分析与说明】对于方程f(x)=0,如果f(x)是线性方程,则求它的根是容易的,牛顿法实质上是一种线性化方法,其基本思想是将非线性方程f(x)=0,逐步归结为某种线性方程来求解。

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

五. 讨论分析
当初始值选取离零点较远时将导致算法无法使用,例如第三题,将初始值改为2就无法计算出结果了,显示如下
例如求020sin 35=-+-x x e x 的根,其中控制精度1010-=eps ,最大迭代次数40=M ,在steffensen 加速迭代方法的程序中,我们只需改动:it_max=40; ep=1e-10, 其余不变 。

利用以上程序,我们只需输入:
phi=inline('exp(5*x)-sin(x)+(x)^3-20');
[x_star,index,it]=steffensen(phi,0.5)可得:
x_star = 0.637246094753909
index = 0
it = 41
观察上述结果,index = 0,it = 41表明迭代失败,所以使用以上方法估计的时候,应该尽量估计出解的范围,偏离不应过大,距离增加迭代次数增加,也有可能迭代失败
六. 改进实验建议
根据上述分析,我认为,应该先对函数作一个简图,方便知道解的大概位置,然后我们才将这个大概值代入Newton 法或者Steffensen 中进行求解。

当然,我们可以用其他数学软件实现Newton 迭代法,我们可以用z-z 超级画
板,其操作流程为:
牛顿迭代法的公式是:x n+1=x n-f(x n)/f'(x n)。

下面我们就用牛顿迭代法设计程序求方程f(x)=ln(x)+2*x-6的近似解。

(一)观察方程f(x)=0的零点位置
(1)显示坐标系的坐标刻度。

(2)作出函数y=ln(x)+2*x-6的图像,如下图所示:
可以观察到方程的根在区间[2,3]上,我们可以设定近似解的初始值为2。

(二)设计求方程近似解的程序
(1)在程序工作区中输入:
f(x){ln(x)+2*x-6;}
执行后,返回结果为:
>> f(x) #
这表示在计算机已经完成了函数f(x)的定义。

(2)定义f(x)的导函数g(x),在程序工作区中输入:
Diff(f(x),x);
执行后,返回结果为:
>> 2+1/x #
得到了f(x)的导函数。

继续输入:
g(x){2+1/x;}
这表示在计算机已经完成了函数g(x)的定义。

(3)在下面输入:
NewtonMethod(x0,h)
{
x=x0-f(x0)/g(x0);
if(abs(x-x0)<=h){return x;}
else{NewtonMethod(x,h);}
}
}
执行后,返回结果为:
>> NewtonMethod(x0,h) #。

相关文档
最新文档