草庐IT

牛顿迭代法

melonyzzZ 2023-06-15 原文

 

目录

一、牛顿迭代公式

二、利用牛顿迭代公式求平方根

C 语言实现

Python 语言实现 

三、利用牛顿迭代公式求立方根

C 语言实现

Python 语言实现


 


一、牛顿迭代公式

多数方程不存在求根公式,因此求精确根非常困难,甚至不可解,从而寻求方程的近似根就显得尤为重要。牛顿就提出了一种用迭代求方程近似根的方法,思路是不断取切线,用线性方程的根逼近非线性方程 f(x) = 0 的根

具体过程

设 x* 是 f(x) = 0 的根,选取 x0 作为 x* 的初始近似值,过点 (x0,f(x0)) 作曲线 y = f(x) 的切线 L,L:y = f(x0) + f'(x0)(x - x0),则 L 与 x 轴交点的横坐标为:,称 x1 为 x* 的一次近似值。过点 (x1, f(x1)) 作曲线 y = f(x) 的切线,切线与 x 轴的交点横坐标为:,称 x2 为 x* 的二次近似值。重复上述过程,得 x* 的近似值序列,其中: 称为 x* 的 n + 1 次近似值,上式称为牛顿迭代公式

概述图

 

 

二、利用牛顿迭代公式求平方根

求数 a 的平方根,即求二次方程 f(x) = x^2 - a = 0(a >= 0)的根,f'(x) = 2x,利用牛顿迭代公式,则有:

C 语言实现

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

double square_root(double a)
{
	if (a < 0)
	{
		return -1;
	}
	double t = a;  // t 为近似值
	while (fabs(t * t - a) > 1e-10)
	{
		t = (t + a / t) / 2.0;
	}
	return t;
}

int main()
{
	double a = 0.0;
	scanf("%lf", &a);
	double ret = square_root(a);
	printf("%lf\n", ret);
	return 0;
}

fabs(t * t - a) > 1e-10:是将方程的近似值 t 代入方程 f(x) = x^2 - a 中,判断绝对误差是否小于等于 1e - 10。  

Python 语言实现 

def square_root(a):
    if a < 0:
        return -1
    t = a
    while abs(t * t - a) > 1e-10:
        t = (t + a / t) / 2.0
    return t


print(square_root(3))  # 1.7320508075688772
print(square_root(5))  # 2.236067977499978
print(square_root(10))  # 3.162277660168379
print(square_root(-10))  # -1

 

 

三、利用牛顿迭代公式求立方根

同理,求数 a 的立方根,即求三次方程 f(x) = x^3 - a = 0 的根,f'(x) = 3x2,利用牛顿迭代公式,则有:

C 语言实现

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

double cube_root(double a)
{
	double t = a;
	while (fabs(t * t * t - a) > 1e-10)
	{
		t = (2 * t + a / (t * t)) / 3.0;
	}
	return t;
}

int main()
{
	double a = 0.0;
	scanf("%lf", &a);
	double ret = cube_root(a);
	printf("%lf\n", ret);
	return 0;
}

Python 语言实现

def cube_root(a):
    t = a
    while abs(t * t * t - a) > 1e-10:
        t = (2 * t + a / (t * t)) / 3.0
    return t


print(cube_root(3))  # 1.4422495703074112
print(cube_root(5))  # 1.7099759466766973
print(cube_root(10))  # 2.154434690031893
print(cube_root(-10))  # -2.154434690031893

 

 

 

 

 

有关牛顿迭代法的更多相关文章

  1. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  2. ruby - 迭代在 Ruby 中是如何工作的? - 2

    我最近开始编写Ruby代码,但我对block参数有误解。以下面的代码为例:h={#Ahashthatmapsnumbernamestodigits:one=>1,#The"arrows"showmappings:key=>value:two=>2#ThecolonsindicateSymbolliterals}h[:one]#=>1.Accessavaluebykeyh[:three]=3#Addanewkey/valuepairtothehashh.eachdo|key,value|#Iteratethroughthekey/valuepairsprint"#{value}:#{ke

  3. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

  4. ruby - 如何使用每个迭代器获取数组索引或迭代次数? - 2

    我正在用ruby​​遍历一个数组。有没有一种简单的方法可以在不返回for循环的情况下获取迭代次数或数组索引? 最佳答案 啊,知道了。each_with_index哇!编辑:糟糕! 关于ruby-如何使用每个迭代器获取数组索引或迭代次数?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/706115/

  5. ruby - Ruby中的高阶迭代器? - 2

    我在阅读有关.each迭代器的Ruby问题,有人说如果更高阶的迭代器更适合该任务,则使用.each可能会产生代码味道。Ruby中的高阶迭代器是什么?编辑:我提到的StackOverflow答案的作者JörgWMittag提到他是要编写更高级别的迭代器,但他还解释了下面的内容。 最佳答案 哎呀。我的意思是更高级别的迭代器,而不是更高阶的迭代器。当然,每个迭代器都是高阶的。基本上,迭代是一个非常低级的概念。编程的目的是与团队中的其他利益相关者交流意图。“初始化一个空数组,然后遍历另一个数组,并将该数组的当前元素添加到第一个数组中(如果该

  6. ruby - 一些简单的 Ruby 问题——迭代器、 block 和符号 - 2

    我的背景是PHP和C#,但我真的很想学习RoR。为此,我开始阅读官方文档。我对一些代码示例有一些疑问。第一个是迭代器:classArraydefinject(n)each{|value|n=yield(n,value)}nenddefsuminject(0){|n,value|n+value}enddefproductinject(1){|n,value|n*value}endend我理解yield的意思是“在这里执行关联的block”。令我震惊的是|value|n=each的一部分。其他block对我来说更有意义,因为它们似乎模仿C#风格的lambda:publicintsum(in

  7. ruby - 迭代液体模板中的数组 - 2

    我知道我可以用这段代码迭代liquid模板中的数组:{%foriteminmyarray%}{{item.label}}但是我怎样才能得到我的项目在数组中的索引呢? 最佳答案 根据"LiquidforDesigners"liquid的github部分...forloop.length#=>lengthoftheentireforloopforloop.index#=>indexofthecurrentiterationforloop.index0#=>indexofthecurrentiteration(zerobased)forl

  8. arrays - Ruby:操纵迭代器? - 2

    我在使用Ruby时遇到了初期问题,涉及创建单向、惰性求值、可能无限的迭代器。基本上,我尝试像使用Haskell列表一样使用Ruby,并在较小程度上使用Python生成器。并不是我不理解它们本身;而是我不理解它们。我只是不知道如何像其他语言一样随意使用它们,而且我也不确定Ruby中的哪些方法会在我背后将它们变成数组,从而不必要地将整个序列卸载到内存中。是的,我一直在研究Ruby引用手册。实际上,专心地进行了半个小时。或许显然不是。例如,如果我要实现一个卡片组,它在Python中看起来像这样(未经测试):#Python3fromitertoolsimportchain,countface_

  9. ruby-on-rails - 在 Ruby on Rails 的每个循环中,如果没有任何迭代,是否有做某事的好方法? - 2

    有没有一种简单的说法:否则,如果没有任何循环,则显示“无对象”。似乎应该有一个很好的语法方法来执行此操作而不是计算@user.find_object("param")的长度 最佳答案 你可以这样做:if@collection.blank?#@collectionwasemptyelse@collection.eachdo|object|#Youriterationlogicendend 关于ruby-on-rails-在RubyonRails的每个循环中,如果没有任何迭代,是否有做某事的

  10. ruby-on-rails - 如何迭代 ActiveRecord 属性,包括 attr_accessor 方法 - 2

    我到处寻找优雅的解决方案。本质问题似乎是映射到数据库列的ActiveRecord属性在ActiveRecord::Base中的处理方式与attr_accessor方法完全不同。我想做这样的事情:model.attribute_names.eachdo|name|#dostuffend在某种程度上也包括attr_accessor字段,但不包括任何其他实例方法。我知道这不是内置的,但最优雅的方法是什么? 最佳答案 你无法真正解决这个问题。您可以近似破解,但它永远不会很好地工作。model.attribute_names应该给你所有的Ac

随机推荐