牛顿迭代法是求开n次方近似解的一种方法,本文参考

引言

假如\(x^n = m\),我们需要求x的近似值。

  • 我们设\(f(x) = x^n - m\), 那么也就是求该函数f(x)=0时与x轴的交点的值,也就是f(x)=0时方程的根。

算法介绍

感觉和物理做实验一样,先通过实验观察,再找出对应理论来解释现象。

这个算法不是推导出来的,是首先通过观察发现,再来证明推导,哈哈哈~

以下结论都是建立在f(x)二阶可导的情况下成立。

牛顿发现随便找一个曲线上的A点(为什么随便找,根据切线是切点附近的曲线的近似,应该在根点附近找,但是很显然我们现在还不知道根点在哪里),做一个切线,切线的根(就是和x轴的交点)与曲线的根,还有一定的距离。牛顿、拉弗森们想,没关系,我们从这个切线的根出发,做一根垂线,和曲线相交于B点,继续重复刚才的工作:

之前说过,B点比之前A点更接近曲线的根点,牛顿、拉弗森们很兴奋,继续重复刚才的工作:

经过多次迭代后会越来越接近曲线的根(下图进行了50次迭代,哪怕经过无数次迭代也只会更接近曲线的根,用数学术语来说就是,迭代收敛了):

总结

已知曲线方程\(f(x) = x^n - m\),我们随机取一点\(x_1\):

  • \(x_1\)处切线方程为:\(y - f(x_1) = f^{'}(x_1)(x - x_1)\),此方程与x轴的交点为\(x_2\)为:
  • \(x_2 = x_1 - \frac{f(x_1)}{f^{'}(x_1)} = x_1 - \frac{x_1^n - m}{nx_1^{n-1}}\)
  • 一直到\(x_{N+1} = x_N - \frac{x_N^n - m}{nx_N^{n-1}}\),从而近似求解开n次方。

算法实现(go)

这是go tutorial里的一个练习,求开方。求开n次方同理。只需要改成z = z - (Pow(z,n) - m)/(n*Pow(z,(n-1)))就行了。

注意这里的z = (z + x/z)/2也就是\(z = \frac{z^2+x}{2z}\)也等于我们这里当\(n=2\)时,\(z - \frac{z^2-x}{2z}\),在代码里也就是反复更新迭代z的值,缩小误差。

package main

import (
"fmt"
"math"
) func Sqrt(x float64) float64 {
z := float64(1)
tmp := float64(0)
for math.Abs(tmp - z) > 0.0000000001 {
tmp = z
z = (z + x/z)/2
}
return z
} func main() {
fmt.Println(Sqrt(2))
fmt.Println(math.Sqrt(2))
}

牛顿迭代法--求任意数的开n次方的更多相关文章

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

    Description Implement int sqrt(int x). Compute and return the square root of x. Example sqrt(3) = 1 ...

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

    //迭代法 /* ================================================================== 题目:牛顿迭代法求a的平方根!迭代公式:Xn+1 ...

  3. 数学相关比较 牛顿迭代法求开方 很多个n的平方分之一

    牛顿迭代法求开方 牛顿迭代法 作用: 求f(x) = 0 的解 方法:假设任意一点 x0, 求切线与x轴交点坐标x1, 再求切线与x轴交点坐标x2,一直重复,直到f(xn) 与0的差距在一个极小的范围 ...

  4. 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根

    问题描述 给定三次函数f(x)=ax3+bx2+cx+d的4个系数a,b,c,d,以及一个数z,请用牛顿迭代法求出函数f(x)=0在z附近的根,并给出迭代所需要次数. 牛顿迭代法的原理如下(参考下图) ...

  5. YTU 2405: C语言习题 牛顿迭代法求根

    2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec  内存限制: 128 MB 提交: 562  解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...

  6. 【Java例题】4.4使用牛顿迭代法求方程的解

    4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...

  7. 牛顿迭代法求n方根

    一.简单推导 二.使用 借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可.由上述简单推导知,当f(x)=0时 ...

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

    //牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16 ...

  9. 牛顿迭代法求开根号。 a^1/2_______Xn+1=1/2*(Xn+a/Xn)

    #include <stdio.h>#include <math.h>int main(void){ double a,x1=1.0,x2; printf("plea ...

随机推荐

  1. MySQL 学习(二)总体框架 & redo-log 和 bin-log 的介绍

    文章部分总结来自课程,非原创 MySQL 组织架构     下面这张图就可以解释关于 MySQL 底层的组织架构了.     上面的图可以直观地展示两个重要的东西 : 一条 SQL 的执行流程 MyS ...

  2. 【音乐欣赏】《TIT FOR TAT》 - MYTH & ROID

    曲名:TIT FOR TAT 作者:MYTH & ROID [00:00.000] 作曲 : MYTH & ROID [00:01.000] 作词 : MYTH & ROID ...

  3. python的logging库

    logging库 简介 logging库提供日志打印功能. 值得一提的是,不仅能打印到日志文件,还能打印到控制台. 日志级别 logging一共分为5个级别,从低到高依次为:  DEBUG<IN ...

  4. IEC 60958 && IEC 61937

    IEC 60958 IEC 60958是一种传递数字音频的接口规范,相比I2S,IEC60958通过一根线同时传递时钟信号和数据信号.IEC 60958用来传递两channel,16/20/24bit ...

  5. 小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. Vue - 如何使用npm run build后的dist文件夹

    脚手架vue cli生成项目后,使用 npm run build 生成了一个dist文件夹(应该是distribution的缩写) 只要放在http服务器上就可以运行. 使用一句python命令可以搭 ...

  7. LoadLibrary与LoadLibraryEx

    参考了这个博客:https://blog.csdn.net/cuglifangzheng/article/details/50580279 以及这个博客:https://blog.csdn.net/z ...

  8. mybatis 源码分析--日志分析

    1. MyBatis 没有提供日志实现,需要接入第三方的日志组件,但是第三方的日志组件都各自的Log级别,而不相同 实现方式:适配器模式   Slf4jImpl 2. 自动扫描日志实现,并且第三方日志 ...

  9. Chrome浏览器切页快捷键

    Chrome浏览器切换标签页快捷键 1.Ctrl + Tab 向左切换标签页 2.Ctrl + shift + Tab 向右切换 3.Ctrl + 1 切换到第一个页面 4.Ctrl + 9 切换到最 ...

  10. win10鼠标右击 新建文件夹 反应缓慢、迟钝

    1. 先使用360杀毒,步骤如下: 2.修改注册表 https://jingyan.baidu.com/article/363872ec9e25972e4ba16f82.html 3.  如果仍未解决 ...