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 ;-)
Brak komentarzy:
Prześlij komentarz