go-bisection

最近写作业,遇到计算量很大的一道数学题,感觉还是喜欢go的所以第一个想到的是用go实现一下,省的手算了。

题目大概是 用bisection的方法find root of f(x)=x^(1/3)+3,需要几步? 把题目说清楚还有一个目的是,代码里有一句是注释掉的,root那句,需要注意,现在是要推算x(1/3)的,所以得假设你现在是得不到x(1/3)的。
代码如下:
目前代码有个问题,答案是14,通过一个公式得到,但运行代码得到的是15,目前想到的原因是,第一个error是直接就在的,不该count的,但是是强行解释,所以也可能是其他原因,先放这儿,有大牛欢迎来讲讲。
还有一点是代码里也包含了一点regula-Falsi方法的实现,因为并不需要得到迭代次数,所以就只是在main里做了一点计算
(另外,代码调试是在goplayground中进行的,非常方便)

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("Hello, playground")
    times := biSection(-2.0, -1.0)
    fmt.Println(times)

    rfP0 := regulaFalsi(-2.0, -1.0)
    fmt.Println("rfP0", rfP0,f(rfP0))
    rfP1 := regulaFalsi(-2.0,rfP0)
    fmt.Println("rfP1", rfP1,f(rfP1))
    rfP2 := regulaFalsi(-2.0,rfP1)
    fmt.Println("rfP2", rfP2,f(rfP2))
    Q0:=rfP2-(((rfP2-rfP1)*(rfP2-rfP1))/(rfP2-2*rfP1+rfP0))
    fmt.Println("Q0", Q0)
    
    rfP3 := regulaFalsi(-2.0,rfP2)
    fmt.Println("rfP3", rfP3,f(rfP3))
    Q1:=rfP3-(((rfP3-rfP2)*(rfP3-rfP2))/(rfP3-2*rfP2+rfP1))
    fmt.Println("Q1", Q1)

}

func regulaFalsi(u, v float64) float64 {
    var result float64 = ((u)*f(v) - (v)*f(u)) / (f(v) - f(u))
    return result
}

func biSection(i, j float64) int {
    var err float64 = 1.0
    count := 0
    var root float64 = math.Cbrt(-3)
    fmt.Println("rooot", root)
    for err >= 0.00005 {
        //if f(i)*f(j) < 0 {
        //err = math.Abs((midP(i, j) - root)) / math.Abs(root)
        err = math.Abs(j-i)/2
        fmt.Println("err", err)
        count++
        var p float64 = midP(i, j)
        if f(p) == 0 {
            return count
        }
        if f(p)*f(i) < 0 {
            j = p
        }
        if f(p)*f(j) < 0 {
            i = p
        }
        //}
    }
    return count
}

func midP(i, j float64) float64 {
    var midP float64 = (j-i)/2 + i
    return midP
}

func f(x float64) float64 {
    var y float64 = x*x*x + 3
    return y
}

你可能感兴趣的:(go-bisection)