牛顿迭代法

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

牛顿迭代公式

    设r是\(f(x)=0\)的根,选取\(x_0\)作为r的初始近似值,过点\((x_0,f(x_0))\)
,做曲线
\(y=f(x)\)的切线L,L的方程为\(y=f(x_0)+f’(x_0)(x-x_0)\)
,求出L与x轴交点的横坐标

\[x_1=x_0-\frac{f(x_0)}{f’(x_0)}\]

    称\(x_1\)为r的一次近似值。过点\((x_1,f(x_1))\)
做曲线
\(y=f(x)\)的切线,并求该切线与x轴交点的横坐标

\[x_2=x_1-\frac{f(x_1)}{f’(x_1)}\]

    称\(x_2\)为r的二次近似值。重复以上过程,得r的近似值序列,其中,

\[x_{n+1}=x_n-\frac{f(x_n)}{f’(x_n)}\]

    称为r的\(n+1\)次近似值,上式称为牛顿迭代公式

    用牛顿迭代法解非线性方程,是把非线性方程\(f(x)=0\)线性化的一种近似方法。把
\(f(x)\)在点
\(x_0\)的某邻域内展开成泰勒级数

\[f(x)=f(x_0)+f’(x_0)(x-x_0)+\frac{f’’(x_0)(x-x_0)^2}{2!}+…+\frac{f^{(n)}(x_0)(x-x_0)^n}{n!}+R_n(x)\]

     取其线性部分(即泰勒展开的前两项),并令其等于0,即
\(f(x_0)+f’(x_0)(x-x_0)=0\),以此作为非线性方程
\(f(x)=0\)的近似方程,若\(f’(x_0)\neq0\),则其解为

\[x_1=x_0-\frac{f(x_0)}{f’(x_0)}\]

     这样,得到牛顿迭代法的一个迭代关系式:

\[x_{n+1}=x_n-\frac{f(x_n)}{f’(x_n)}\]

    从下面的图中,我们可以看到牛顿迭代的几何意义,每次迭代,都会更加逼近\(f(x)=0\)的解。

     下面用牛顿迭代法在matlib解出方程\(x^2+2xe^x+e^{2x}=0\)的根,首先画出函数的图像,猜测根的大致位置。

函数图像如下图所示:

近似结果:

x=-1:0.01:1;
y= x.^2+2*x.*exp(x)+exp(2*x)
plot(x,y);
grid on;
clc;clear;
%syms x;
%diff(x^2+2*x*exp(x)+exp(2*x),x,1)
%clear;
x=0.0
for i=1:100
    x1=x-(x^2+2*x*exp(x)+exp(2*x))/(2*x + 2*exp(2*x) + 2*exp(x) + 2*x*exp(x))
    if(abs(x1-x)>0.0001)
        x=x1;
    else
        break;
    end
end
i

View Code

时间: 2024-09-26 07:47:10

牛顿迭代法的相关文章

c语言-C语言牛顿迭代法,正常运行输出错误结果,求助

问题描述 C语言牛顿迭代法,正常运行输出错误结果,求助 求方程ax^3+bx^2+c^x+d=0的解,其中xn+1=xn-f(xn)/f'(xn) 我的代码这样写的: #include #include int main(void) { int a,b,c,d; printf("Please input four integers:"); scanf("%d %d %d %d",&a,&b,&c,&d); double x,y; x=

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 三.对迭代过程进行控制 在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地执行下去.迭代过程的控制通常可分为两种情况

如何用c语言解决牛顿迭代法

问题描述 如何用c语言解决牛顿迭代法 用c语言解决牛顿迭代法,要求显示表达式,求大神帮助,期末作业,完不成要挂科,谢谢了 解决方案 一元任意阶次方程求解,注意初始值不正确也有可能得不到解.http://blog.csdn.net/qq_27183003/article/details/49808191 解决方案二: #include <stdio.h> #include <math.h> //y=x^3-5x^2+16x-80 float f(float x) { return (

C语言OJ项目参考(2405)牛顿迭代法求根

2405: 牛顿迭代法求根 Description 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附近的一个实根.求出根后由主函数输出.结果保留两位小数. Input 系数a,b,c,d的值 Output x在1附近的一个实根 Sample Input 1 2 3 4 Sample Output -1.65 HINT 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { double

算法之【牛顿迭代法】

众所周知,计算机的基本数值算法是加减乘除,甚至只是加减法.而次方和开根算法都是由四则运算混合表示而成的,因而根号计算比四则运算要慢很多.无理数如√2的浮点数计算就是由牛顿迭代法得出的.牛顿迭代法是一种用于计算曲线方程根的精确算法(尤其是幂函数方程),比二分法更加高效,因为它基于微分. As we all know, basic numerical calculation in the computer is: addition, subtraction, multiplication and d

Hession矩阵与牛顿迭代法

1.求解方程. 并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难.利用牛顿法,可以迭代求解. 原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f'(x0) 求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0-f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比

matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到0.00001 ---------------------------------------------------------分--割--线--------------------------------------------------------- 首先建立函数fun 储存方

牛顿迭代法求多项式在1.5附近的值2*x的3次幂--4x平方+3*x-6=0的实现代码_C 语言

代码如下所示: 复制代码 代码如下: #include <stdio.h>#include <math.h> int main(){   float x,x0,f,f0;   x=1.5;   do   {    x0=x;      f0=((2*x-4)*x+3)*x-6;  //求得在x0处解    f=(6*x0-8)*x0+3;     // 在(x0 ,f0)处导数    x=x0-f0/f;        }while(fabs(x-x0)>=1e-6);   

《编写高质量代码:改善c程序代码的125个建议》—— 导读

前 言 为什么写作本书 众所周知,C语言是一门既具有高级语言特点,又有汇编语言特点的通用计算机编程语言,无论是操作系统(如Microsoft Windows.Mac OS X.Linux和UNIX等).嵌入式系统与普通应用软件,还是目前流行的移动智能设备开发,随处都可以看见它依然矫健的身影.它能够轻松地应用于各类层次的开发中,从设备驱动程序和操作系统组件到大规模应用程序,它都能够很好地胜任.毋庸置疑,它是二十几年来使用最为广泛.生命力最强的编程语言,它的设计思想也影响了众多后来的编程语言,例如C