import scala.io.StdIn.readLine
import scala.math._
object Main {
def main(args: Array[String]): Unit = {
val x1 = newtonDown(0.2, Array(1,-2,3,-4), polynomial, diffPoly, 1E-8)
val y1 = polynomial(x1, Array(1,-2,3,-4))
println(s"x1 = $x1")
println(s"y1 = $y1")
readLine()
}
def polynomial(x: Double, coef: Array[Double]): Double = {
(0 until coef.length).map(i => coef(i)*pow(x, i)).sum
}
def diffPoly(x: Double, coef: Array[Double]): Double = {
(1 until coef.length).map(i => coef(i)*i*pow(x, i-1)).sum
}
def newtonDown(x: Double, coef: Array[Double],
fn: (Double, Array[Double]) => Double,
fp: (Double, Array[Double]) => Double,
err: Double): Double = {
if (abs(fn(x, coef)) < err) return x
else {
var lambda = 1.0
var x1 = 1.0
do {
x1 = x - fn(x, coef) / fp(x, coef) * lambda
lambda = lambda * 0.5
} while (abs(fn(x1, coef)) >= abs(fn(x, coef)))
newtonDown(x1, coef, fn, fp, err)
}
}
}
运行结果如下: