牛顿下山法解多项式方程 Scala版

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)			
		}
	}
}

运行结果如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值