牛顿迭代法求方程的解

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。

利用迭代算法解决问题,需要以下三个步骤:

1.确定迭代变量
  在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
2.建立迭代关系式
  所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以顺推或倒推的方法来完成。
3.对迭代过程进行控制
   在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代 次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情 况,需要进一步分析出用来结束迭代过程的条件。

头文件:

/*****************************************************************************************************
 *Copyright:Yue Workstation
 *
 *FileName:Iterate.h
 *
 *Function:迭代算法数据定义
 *
 *Author:Abel Lee
 *
 *CreateOn:2012-2-19
 *
 *Log:2012-2-19 由Abel Lee创建
 *****************************************************************************************************/ 

#ifndef ITERATE_H
#define ITERATE_H 

#include "global.h" 

#define Epsilon 1.0E-6 

int GetTheEquationRoot(void);
float MySqrt(float x); 

#endif

源文件:

/*****************************************************************************************************
 *Copyright:Yue Workstation
 *
 *FileName:Iterate.c
 *
 *Function: 迭代法的应用实例
 *
 *Author:Abel Lee
 *
 *CreateOn:2012-2-19
 *
 *Log:2011-5-3 由Abel Lee创建
 *****************************************************************************************************/ 

#include "../inc/Iterate.h"
#include <math.h> 

/****************************************************************************************************
 *Function Name: GetTheEquationRoot
 *
 *Function: 用牛顿迭代法求方程2*x*x*x-4*x*x+3*x-6 = 0的根
 *
 *Parameter:     无
 *
 *Return Value:成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2012-2-19
 ***************************************************************************************************/
int GetTheEquationRoot(void)
{
    float x1,x0=1.5;
    x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
    while(fabs(x1-x0>=Epsilon))
    {
        x0=x1;
        x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
    }
    printf("The Root is:%f\n",x1);
    return 0;
} 

/****************************************************************************************************
 *Function Name: MySqrt
 *
 *Function: 迭代法求一个数的平方根
 *
 *Parameter:     x:要求平方根的数
 *
 *Return Value:成功返回根植,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2012-2-19
 ***************************************************************************************************/
float MySqrt(float x)
{
    float a,x0,x1; 

    if(x < 0)
    {
        return -1;
    } 

    a = x;
    x0=a/2;
    x1=(x0+a/x0)/2; 

    while(fabs(x1-x0)>=Epsilon)
    {
        x0 = x1;
        x1=(x0+a/x0)/2;
    } 

    return x1;
}

原文地址:http://blog.51cto.com/14207158/2352655

时间: 2024-08-27 13:36:05

牛顿迭代法求方程的解的相关文章

c语言:用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0.

用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0. 解:牛顿迭代法又叫牛顿切线法.设f =2x^3-4x^2+3x-6,f1为方程的导数,则f1 = 6x^2 - 8x+3,且f1=(f(x0)-0)/(x0-x1),推导得:x1 = x0 - f / f1 程序: #include<stdio.h> #include<math.h> int main() { double x0,x1,f,f1; x1 = 1.5; do { x0 = x1; f = 2*x0

牛顿迭代法 求方程根

牛顿迭代法 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法.多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要. 方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根.牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根.复根,此时线性

C语言之基本算法25—牛顿迭代法求方程近似根

//牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16=0的近似解. ============================================================ */ #include<stdio.h> #include<math.h> #define E 1e-8 double hs(double x) {

牛顿迭代法求方程的根

#include <stdio.h> #include <math.h> int main() {     double a,b,c,d,n,m,x,y;     while(scanf("%lf,%lf,%lf,%lf",&a,&b,&c,&d)!=EOF)     {         x=0;         m=a*x*x*x+b*x*x+c*x+d;         n=3*a*x*x+2*b*x+c;         y

牛顿迭代法求Logistic回归

接着上次的一篇文章:http://blog.csdn.net/acdreamers/article/details/27365941 在上次这篇文章中,对于Logistic回归问题,我们已经写出它的最大似然函数,现在来求最大似然估计.所以对似 然函数求偏导数,得到了个方程,即 由于我们只要根据这个方程解出所有的即可,但是这不是一件容易的事,还有Logistic回归求的是最大似 然估计,我们在多元函数求极值问题中也说过,导数等于零的点可能是极大值,极小值或者非极值.所以还要靠一个 叫Hessian

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

OJ刷题之《牛顿迭代法求根》

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

C语言之基本算法11—牛顿迭代法求平方根

//迭代法 /* ================================================================== 题目:牛顿迭代法求a的平方根!迭代公式:Xn+1=(Xn+a/Xn)/2. ================================================================== */ #include<stdio.h> #include<math.h> main() { float a,x0,x1;

141. Sqrt(x)【牛顿迭代法求平方根 by java】

Description Implement int sqrt(int x). Compute and return the square root of x. Example sqrt(3) = 1 sqrt(4) = 2 sqrt(5) = 2 sqrt(10) = 3 Challenge O(log(x)) 题意:求给定数的平方根,如果用一般的方法,例如二分法之类的,需要考虑一下int型的范围,别溢出.最好的方法时牛顿迭代法.代码如下: public class Solution { /**