牛顿迭代法:介绍、原理与运用

牛顿迭代法:介绍、原理与运用

介绍

牛顿迭代法是一个可以求一个任意函数的零点的工具。它比二分法快得多。

公式是:x=a-f(a)/f‘(a)。其中a是猜测值,x是新的猜测值。不断迭代,f(x)就越来越接近0。

原理

我们将f(x)做泰勒一阶展开:f(x)∼f(a)+(x-a)f‘(a)。

令f(x)=0,

∴f(a)+(x-a)f‘(a) = 0

∴f(a)+xf‘(a)-af‘(a) = 0

∴xf‘(a)=af‘(a)-f(a)

∴x=a-f(a)/f‘(a)

实例:牛顿迭代法求√2的近似值

∵ x = √2
x2 = 2
x2 -2 = 0

令f(x)=方程左边,则f(x)∼0↔x∼√2。

f‘(x) = 2x。于是可以得到迭代公式:

x
= a-f(a)/f‘(a)
= a-(a2-2)/(2a)
= a-a/2+1/a
= a/2+1/a

代码如下(要求误差小于1e-6):

#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[])
{
	double a = 2.0;
	double expect_error = 0.000001;
	double expect_answer = 1.4142135623731;
	double x;
	double actual_error;
	unsigned iteration_count = 0;

	do {
		if (a == 0.0) a = 0.1; /* 避免除0 */
		x = a/2 + 1/a;
		actual_error = fabs(expect_answer - x);
		a = x;

		++iteration_count;
		printf("%d\t%.9f\t%.9f\n", iteration_count, a, actual_error);
	} while (actual_error >= expect_error);

	printf("%d\n", iteration_count);

	return 0;
}

输出:

1	1.500000000	0.085786438
2	1.416666667	0.002453104
3	1.414215686	0.000002124
4	1.414213562	0.000000000
4

迭代了4次。用二分法呢?

#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[])
{
	double high = 2.0;
	double low = 1.0;
	double expect_error = 0.000001;
	double expect_answer = 1.4142135623731;
	double x;
	double actual_error;
	unsigned iteration_count = 0;

	do {
		x = (high+low)/2;

		if (x*x-2 > 0)
			high = x;
		else
			low = x;

		actual_error = fabs(expect_answer - x);

		++iteration_count;
		printf("%d\t%.9f\t%.9f\n", iteration_count, x, actual_error);
	} while (actual_error >= expect_error);

	printf("%d\n", iteration_count);

	return 0;
}

输出:

1	1.500000000	0.085786438
2	1.250000000	0.164213562
3	1.375000000	0.039213562
4	1.437500000	0.023286438
5	1.406250000	0.007963562
6	1.421875000	0.007661438
7	1.414062500	0.000151062
8	1.417968750	0.003755188
9	1.416015625	0.001802063
10	1.415039062	0.000825500
11	1.414550781	0.000337219
12	1.414306641	0.000093078
13	1.414184570	0.000028992
14	1.414245605	0.000032043
15	1.414215088	0.000001526
16	1.414199829	0.000013733
17	1.414207458	0.000006104
18	1.414211273	0.000002289
19	1.414213181	0.000000382
19

迭代了19次。

时间: 2024-10-25 07:24:39

牛顿迭代法:介绍、原理与运用的相关文章

【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)

题目链接:传送门 题目描述: 求Sqrt(x),返回整数值即可. [代码]: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e6+10 ; 4 /* 5 int mySqrt ( int x ){ 6 int L = 1 , R = N , mid , ans = 0 ; 7 while ( L <= R ){ 8 mid = ( L + R ) >> 1 ; 9 if( mid <=

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

//牛顿迭代法求平方根 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

牛顿迭代法(Newton&#39;s Method)

牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. 对于形如f(x)=0的方程,首先任意估算一个解x0,再把该估计值代入原方程中.由于一般不会正好选择到正确的解,所以有f(x)=a.这时计算函数在x0处的斜率,和这条斜率与x轴的交点x1. f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的

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

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

利用牛顿迭代法求平方根

求n的平方根,先如果一推測值X0 = 1,然后依据下面公式求出X1,再将X1代入公式右边,继续求出X2…通过有效次迭代后就可以求出n的平方根,Xk+1 先让我们来验证下这个巧妙的方法准确性,来算下2的平方根 (Computed by Mathomatic) 1-> x_new = ( x_old + y/x_old )/2 y (x_old + -----) x_old #1: x_new = --------------- 2 1-> calculate x_old 1 Enter y: 2

牛顿迭代法及最小二乘法

1.牛顿迭代法 牛顿迭代法法是一种计算近似根算法,对于给定的复杂函数f(x),常用来求该函数在给定初始值x0附近的近似根.该算法很简单,就是一个迭代的过程: 迭代终止条件可设为: matlab代码实现: function y=mulNewton(a,n,x0,eps1) x(1)=x0; b=1; i=1; while(norm(b)>eps1) %%迭代终止条件 公式(2) i=i+1; x(i)=x(i-1)-n_f(a,n,x(i-1))/n_df(a,n,x(i-1)); %%公式(1)

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 { /**

牛顿迭代法求解平方根

牛顿迭代法求解平方根 2015-05-16 10:30 2492人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一个实例 迭代简介 牛顿迭代法 牛顿迭代法简介 简单推导 泰勒公式推导 延伸与应用 一个实例 //java实现的sqrt类和方法 public class sqrt { public static double sqrt(double n) { if (n<0) return Double.NaN; double err = 1e

51nod 1166 大数开平方(高精度+牛顿迭代法)

分析:直接用二分还是会T,用更快的牛顿迭代法.把问题转化为求x^2-n=0的根,假设解为x0,当前解为x且x^2-n>0,在(x,x^2-n)处作切线,与x轴交点横坐标为新的x,然后迭代即可,比二分法快,但是貌似只能用在凹函数或凸函数上.. java水高精度真是666... 1 import java.io.*; 2 import java.util.*; 3 import java.math.BigInteger; 4 public class Main { 5 public static v