牛顿迭代法(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<stdio.h>
#include<cmath>//调用了fabs、pow函数
using namespace std;
double f(int,int,int,int,double); //函数声明
double f1(int,int,int,int,double);
double get_solution(int,int,int,int,double);
int main()
{
int a,b,c,d;
double solution,solution_value;
cout<<"pls input the parameters of the equation a,b,c,d;and the estimate x"<<endl;
cin>>a>>b>>c>>d>>solution;
solution_value=get_solution(a,b,c,d,solution);
if(solution_value<=1e-5)//当求得的根很小时,直接让它为0
solution_value=0;
cout<<"the solution near "<<solution<<" is "<<solution_value<<endl;
getchar();
return 0;
}
double f(int w_f,int x_f,int y_f,int z_f,double sol_f)//当根为x时,用来求f(x)的值
{
double f_result=w_f*pow(sol_f,3)+x_f*pow(sol_f,2)+y_f*sol_f+z_f;
//cout<<"f_result is "<<f_result<<endl; //调试时用
return f_result;
}
double f1(int w_f1,int x_f1,int y_f1,int z_f1,double sol_f1) //当根为x时,用来求f'(x)的值
{
double f1_result=3*w_f1*pow(sol_f1,2)+2*x_f1*sol_f1+y_f1;
//cout<<"f1_result is "<<f1_result<<endl;//调试时用
return f1_result;
}
double get_solution(int w,int x,int y,int z,double sol) //求根函数,调用了上面两个函数
{
double value,tmp;
value=sol;
do //使用了x1=x0-f(x0)/f'(x0),不断循环逼近
{
tmp=f(w,x,y,z,value);
value=value-tmp/f1(w,x,y,z,value);
//cout<<"funciont_value is "<<tmp<<";value is "<<value<<endl;//调试时用
}while(fabs(tmp)>=1e-5);//当式子的值与0的绝对值小于1e-5时就认为取到了值
return value;
}

测试例子:ax^3 +b x^2+cx+d=0,所以运行时候分别输入a=2,b=1,c=1,d=-14,以及求X在某个值附近的根,比如2.1

pls input the parameters of the equation a,b,c,d;and the estimate x
2 1 1 -22
2.1
the solution near 2.1 is 2

pls input the parameters of the equation a,b,c,d;and the estimate x2 1 1 -222.1the solution near 2.1 is 2

本文转载自http://www.node-net.org/read.php?53

使用牛顿迭代法求根 一元三次方程的根相关推荐

  1. python迭代法求解方程_第一部分:趣味算法入门;第六题牛顿迭代法求一元三次方程的根...

    100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第六题SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键 ...

  2. Python趣味算法入门 - 牛顿迭代法求方程根

    问题描述 编写用牛顿迭代法求方程根的函数.方程为,系数a,b,c,d由主函数输入,求x在1附近的一个实根.求出根后,由主函数输出. 牛顿迭代法的公式:,设迭代到  时结束. 分析 在网上可以找到很多关 ...

  3. C++实现牛顿迭代法求一元二次方程

    牛顿迭代法定义如下(来自百度百科): 用牛顿迭代法小试牛刀用来求解一元二次方程的根(工程下载地址[注:不好意思,下载题目写成了二元一次方程,见谅.],release下的应用程序可以直接运行),代码如下 ...

  4. C语言学习之用牛顿迭代法求下面方程在1.5附近的根: 2x³-4x²+3x-6=0

    用牛顿迭代法求下面方程在1.5附近的根: 2x³-4x²+3x-6=0 在本题中 f(x) = 2x³-4x²+3x-6 可以写成以下形式:f(x) = ((2x-4)x+3)x-6 同样,f´(x) ...

  5. python求一元三次方程的根_关于二次、三次、四次方程求解方法讨论

    高次方程求解的一般方法是将高次方程通过配方求解,然后进行次数降解,高次方程转化为容易求解的低次方程. 一元二次方程 求解高次方程,一元二次方程是最为简单的方程.关于一元二次方程 ,通过配方法可以求解: ...

  6. 用牛顿迭代法求方程的根

    用牛顿迭代法求方程的根(C语言) 题目要求:牛顿迭代法是一种重要的基本的求方程根的方法.现有方程为axˆ3+bxˆ2+cx+d=0,系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附 ...

  7. 牛顿迭代法求方程的根

    牛顿迭代法(牛顿-拉弗森方法) 五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论.没有根式解不意味着方程解不出来,数学家也提供了很多方法,牛顿 ...

  8. 用牛顿迭代法求方程的根matlab,牛顿迭代法求方程根的MATLAB程序

    function [x_reality,n_reality] = Newt( f_name,x_start,tolerance,n_limit) %% %牛顿迭代法(切线法)求解方程f_name = ...

  9. 1087 习题5-14 牛顿迭代法求方程的根

    题目描述 用牛顿迭代法求下面方程在输入初值点附近的根: 2x3-4x2+3x-6=0 要求前后两次求出的x的差的绝对值小于10-6 牛顿迭代法公式如下: 将给定给定方程写成f(x)=0的形式,在给定初 ...

最新文章

  1. hadoop2.2.0 集群安装配置
  2. android sdk版本控制,1. 统一SDK版本管理配置
  3. VS2005--设置Release模式下调试
  4. svm java_SVM入门(十)将SVM用于多类分类
  5. linux下apache+php(fastcgi)web服务器的搭建
  6. 学习响应式BootStrap来写融职教育网站,Bootsrtap第九天手粉琴swiper特效
  7. centos树莓派安装mysql_树莓派3B+安装CentOS7
  8. 算法专题(一)1.1 希尔排序,快速排序
  9. 服务器里的文件链接地址怎么写,服务器里的文件链接地址怎么写
  10. 2021年最新的Java面试题,精选100题,大厂必备
  11. linux screen会话命令
  12. 如果你想成为一名黑客
  13. word中尾注分隔符删除后还有一个回车符怎么删
  14. Ubuntu 20 安装 APR
  15. C语言关于链表的代码看不懂?一篇文章让你拿捏二级指针并深入理解函数参数列表中传参的多种形式
  16. win10系统 你需要权限来执行此操作 System32
  17. Windows 安装Docker碰到 cannot enable hyper-v service
  18. C51/C52单片机printf打印出来的值是原来值的256倍
  19. 新享科技-民营大数据行业领头羊
  20. 模式识别的一些基本概念

热门文章

  1. 画出spi输出bdh数据总线时序图_单片机张毅刚课后习题答案.docx
  2. 【Vue3.0实战逐步深入系列】vue3.0获取问卷调查结果并输出到控制台
  3. 帧动画的多种实现方式与性能对比
  4. C++、Qt 调用 lua 完成简单计算并得到结果( 出现中文 ‘?’问题)
  5. smart 完成安装之前向导中断
  6. Webhooks应用概述
  7. ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3
  8. Wave VR Native SDK学习(一)
  9. 《树莓派实战秘籍》——1.15 技巧15连接GPIO脚到面包板上
  10. SprintBoot:Post请求的参数多一个逗号的解决方法