牛顿方法是否有更优雅的Go实现?

艾伦·斯珀特斯(Ellen Spertus):

我正在做Go教程,并且想知道是否有一种比牛顿的方法更灵活的方法可以使用牛顿方法在练习:循环和函数上计算平方根

func Sqrt(x float64) float64 {
    count := 0
    var old_z, z float64 = 0, 1
    for ; math.Abs(z-old_z) > .001; count++ {
        old_z, z = z, z - (z*z - x) / 2*z
    }
    fmt.Printf("Ran %v iterations\n", count)
    return z
}

(规范的一部分是提供迭代次数。)这是完整的程序,包括package语句,imports和main。

icza:

首先,您的算法不正确。公式为:

在此处输入图片说明

您使用以下方法对此建模:

z - (z*z - x) / 2*z

但是应该是:

z - (z*z - x)/2/z

要么

z - (z*z - x)/(2*z)

(您的不正确公式必须运行大约一百万次迭代,甚至才能接近0.001!!正确的公式使用4次迭代才能达到的1e-6情况)x = 2

其次,的初始值z=1对于随机数不是最好的(对于像这样的小数,它可能会很好地工作2)。您可以从这开始,z = x / 2这是一个非常简单的初始值,并以更少的步骤使您更接近结果。

主观的其他选择不一定使它更具可读性或雅致性:

您可以将结果命名为,z以便return语句可以是“ bare”。另外,如果将当前的“退出”条件移入循环,则可以创建一个循环变量来计算迭代次数,如果满足该条件,则可以打印迭代次数并可以简单地返回。您也可以将计算移至的初始化部分if

func Sqrt(x float64) (z float64) {
    z = x / 2
    for i, old := 1, 0.0; ; i++ {
        if old, z = z, z-(z*z-x)/2/z; math.Abs(old-z) < 1e-5 {
            fmt.Printf("Ran %v iterations\n", i)
            return
        }
    }
}

您还可以将移到的z = x / 2初始化部分,for但是然后就不能命名结果了(否则z将创建的本地变体,该变体将遮盖命名的返回值):

func Sqrt(x float64) float64 {
    for i, z, old := 1, x/2, 0.0; ; i++ {
        if old, z = z, z-(z*z-x)/2/z; math.Abs(old-z) < 1e-5 {
            fmt.Printf("Ran %v iterations\n", i)
            return z
        }
    }
}

注意:1之所以启动迭代计数器,是因为在我的情况下,“退出”条件位于的内部,for而不是的条件for

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R中的嵌套操作。是否有更优雅的方法?

在 Kotlin 中是否有更优雅的方法来检查 String 是否是有效的 Int?

检查子节点上两个节点是否具有相同状态的更优雅方法

是否有更优雅的方法使用system.text.json从JSON对象获取特定值

列表理解后是否有更优雅的方法从列表中删除无

如何制定更优雅的实现

角形中是否有更优雅的隐藏/显示图案?

这种排列方式是否有更优雅的方式?

UIImage的多个属性是否有更优雅的方式?

有没有更优雅的子串方法?

获得具有不同值的数组的更优雅方法

访问对象属性的更优雅或更有效的方法?

是否有比当前代码更优雅/更简单的方法在多个隐藏的div上使用jquery .slideToggle?

图形实现更优雅的解决方案?

更优雅的方法来避免对集合进行分组的这种单行简化的实现?

使用声明式管道的waitUntil实现依赖并行任务的更优雅方法

一种更优雅的方法来实现基本的Groovy

有没有更优雅的方式?

bash脚本:一种检索最新版本go的更优雅的方法?

在stream.reduce之后,是否有更优雅的方式来斩首字符?

是否有一种更优雅的解决方案来填充地图中的列表?

在运行时是否有更优雅的方式来访问作业编号?

回声* | xargs -n1 echo,是否有更短,更优雅的逐行列出方式?

C#更优雅的方法来检查异常是否在指定异常列表中?

找出是否可以将值转换为特定类型的更优雅的方法

有没有更优雅的方法来折叠 dplyr 中的两行?

有没有更优雅的方法来过滤函数的失败结果?

有没有更优雅的方法来检查表单默认值?

有没有一种方法可以更优雅地编写此“ if”列表?