最近写作业,遇到计算量很大的一道数学题,感觉还是喜欢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 }
有疑问加站长微信联系(非本文作者)
