扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
创新互联主营鼓楼网站建设的网络公司,主营网站建设方案,重庆APP软件开发,鼓楼h5小程序定制开发搭建,鼓楼网站营销推广欢迎鼓楼等地区企业咨询
中文名
牛顿迭代法
外文名
Newton's method
别名
牛顿-拉夫逊(拉弗森)方法
提出时间
17世纪
快速
导航
牛顿迭代公式
其他迭代算法
C语言代码
C++代码
matlab代码
Python代码
Java代码
JavaScript代码
Fortran代码
产生背景
多数方程不存在求根公式,因此求精确根非常困难,甚至不可解,从而寻找方程的近似根就显得特别重要。方法使用函数 的泰勒级数的前面几项来寻找方程 的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程 的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。
牛顿迭代公式
设 是 的根,选取 作为 的初始近似值,过点 做曲线 的切线 , ,则 与 轴交点的横坐标 ,称 为 的一次近似值。过点 做曲线 的切线,并求该切线与x轴交点的横坐标 ,称 为r的二次近似值。重复以上过程,得 的近似值序列,其中, 称为 的 次近似值,上式称为牛顿迭代公式。
用牛顿迭代法解非线性方程,是把非线性方程 线性化的一种近似方法。把 在点 的某邻域内展开成泰勒级数 ,取其线性部分(即泰勒展开的前两项),并令其等于0,即 ,以此作为非线性方程 的近似方程,若 ,则其解为 , 这样,得到牛顿迭代法的一个迭代关系式: 。
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量
在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。
其他迭代算法
欧几里德算法
最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b。假设d是a,b的一个公约数,则有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
查看更多
用牛顿法可以求得函数f(x)=x^4-4x^3-6x^2-16x+4的最小值为-156。
牛顿法的迭代原理是 Xk+1=Xk-f(xk)/f'(xk)
基于matlab的牛顿法求解主要代码
x0=6; %初值
tol = 0.001;%误差
x = newton(x0,tol); %牛顿迭代法函数
y=fun(x);
str=['f(x)=x^4-4x^3-6x^2-16x+4的最小值 ',num2str(y)];
fprintf('%s\n',str);
str=['f(x)=x^4-4x^3-6x^2-16x+4的极值点,x=',num2str(x),';y=',num2str(y)];
fprintf('%s\n',str);
运行结果,极值点,x=4;y=-156,最小值 -156
自定义函数内容如下
public static void main(String[] args) {
Test test = new Test();
test.addNum();
}
private int num = 0;
public void addNum() {
num++;
if(num==10){
System.exit(0);
}else{
System.out.println(num);
addNum();
}
} 一个 很简单的程序 ! 其实迭代很简单 就是 判断一些条件 然后 自己调用自身!就行了
package test;
import java.util.Scanner;
/**
* @author: 郑旭东
* @company:通广电子
* @time:2014年10月14日 下午3:03:35
*/
public class Newton {
static int n;
static int y;
static double res;
public static double func(double x){
double k = 1;
int i;
for(i = 0; i n; i++){
k *= x;
}
return k-y;
}
public static double func1(double x){
double k = 1;
int i;
for(i = 0; in-1; i++){
k *=x;
}
return n*k;
}
public static int Newtonn(double x,double precision,int maxcyc){
double x1,x0;
int k;
x0 = x;
for(k = 0; kmaxcyc; k++){
if(func1(x0)==0.0){
System.out.println("迭代过程中导数为0!");
return 0;
}
x1 = x0 - func(x0)/func1(x0);
if(Math.abs(x1-x0)precision || Math.abs(func(x1))precision){
res = x1;
return 1;
}
else
x0 = x1;
}
System.out.println("迭代次数达到预期值!");
return 0;
}
@SuppressWarnings({ "resource" })
public static void main(String args[]){
double x,precision;
int maxcyc;
System.out.println("请输入被开方数:");
Scanner scanner = new Scanner(System.in);
y = scanner.nextInt();
System.out.println("请输入开方数:");
n = scanner.nextInt();
System.out.println("请输入初始迭代值:");
x = scanner.nextInt();
System.out.println("请输入最大迭代次数:");
maxcyc = scanner.nextInt();
System.out.println("请输入精度值(如0.00001):");
precision = scanner.nextDouble();
if(Newtonn(x,precision,maxcyc)==1){
System.out.println("结果为:"+res);
}
else
System.out.println("迭代失败!");
}
}
手打望采纳...
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流