niedziela, stycznia 23, 2011

Metoda Newtona w Go ;-)

Pobudzony najnowszym wpisem Jamesa Goslinga o metodzie Newtona napisałem sobie jej implementację w Go ;-)

Oto ona:
package main

import ("fmt";"math";"os")

// Zamiast różniczki używamy ilorazu prawie różnicowego ;-)
// tak, tak jako pierwszy parametr przekazujemy funkcję :-)
func diff(f func(float64) float64, x float64) float64 {
return (f(x+0.0000000001)-f(x))/0.0000000001
}

func calcX(f func(float64) float64,oldX float64) float64 {
return oldX-f(oldX)/diff(f,oldX)
}

func searchNewton(f func(float64) float64) (result float64,err os.Error) {
result=10.0
oldX:=0.0
delta:=0.0000000001
for count:=0; count<100; count++ {
fmt.Printf("%d %f\n",count,result)
oldX=result
result=calcX(f,result)
if math.Fabs(result-oldX)<delta {
fmt.Printf("Found: %f\n",result)
return
}
}
err=os.NewError("cannot find real value of X")
return
}

func main() {
f2:=func(x float64) float64 { return 2*x*x+3*x-7 }
f2=func(x float64) float64 { return math.Sin(x)*70-7 }
if x,e:=searchNewton(f2); e==nil {
fmt.Printf("Result %f for %f\n",f2(x),x)
} else {
fmt.Printf(e.String())
}
}


Podoba mi się zwięzłość kodu. Chociaż nadal nadmiarowe wydają się te cosie z obsługą błędów.
Strasznie podoba mi się możliwość przekazywania funkcji, to bardzo umila pisanie.


Podobne postybeta
Język Go dla Windows :-)
Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]
Go dla Java'owca ;-) odcinek 1 "klasy"
Wysyłamy pliki do Google Docs przy pomocy Go :-)
Goto Go ;-)