如何在Scala中找到功能的根源?

时间:2018-07-02 11:22:28

标签: scala equation equation-solving

我正在用Scala编写程序,我想找到等式的根:2*x^3 + x*(1-2*l + 2*H)-m = 0,其中lHm是早先计算的常数。

Python中,我知道有此类情况的brentq,但在Scala中找不到相似的内容。是否有类似的东西,或者应该尝试找到其他解决方法?

5 个答案:

答案 0 :(得分:1)

spire,它是Scala的数字库。我不太清楚,但这似乎可以在Spire 0.16.0中使用:

scala> val m = 1
m: Int = 1

scala> val l = 2
l: Int = 2

scala> val H = 3
H: Int = 3

scala> import spire.implicits._
import spire.implicits._

scala> import spire.math.Number
import spire.math.Number

scala> val f = poly"2x^3 + ${1-2*l + 2*H}x - $m"
f: spire.math.Polynomial[spire.math.Rational] = (2x³ + 3x - 1)

scala> f.map(Number(_)).roots
res1: spire.math.poly.Roots[spire.math.Number] = Roots(0.3129084094792333580059444668826417)

答案 1 :(得分:0)

我不知道Scala中有任何全面的数学库。您可以从Scala代码中调用Java中的一种代码。

您可以看看Apache Commons数学,尤其是section 4.3, root finding

答案 2 :(得分:0)

如果lHm是常量,那么这就是

x^3 + ax + b = 0

哪里

a = 1/2 - l + H
b = -m/2

对此有一个非常繁琐的分析解决方案,请参阅Wolfram Alpha:

https://www.wolframalpha.com/input/?i=solve+x%5E3+%2B+ax+%2B+b+%3D+0

在Scala中表达这一点留给读者练习:)

答案 3 :(得分:0)

正如之前的解决方案所评论的,使用 Java 的 Commons Math!您只需导入依赖项,您就可以:

val polynomial: PolynomialFunction = new PolynomialFunction(Array[Double](-m, 1-2*l + 2*H, 2)
val laguerreSolver = new LaguerreSolver()
laguerreSolver.solve(100, polynomial, -100, 100)

这比 spire 快得多。

答案 4 :(得分:0)

你也可以看看微风,我想它也会有一些套路可以帮助你。