我正在用Scala
编写程序,我想找到等式的根:2*x^3 + x*(1-2*l + 2*H)-m = 0
,其中l
,H
和m
是早先计算的常数。
在Python
中,我知道有此类情况的brentq
,但在Scala
中找不到相似的内容。是否有类似的东西,或者应该尝试找到其他解决方法?
答案 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)
如果l
,H
和m
是常量,那么这就是
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)
你也可以看看微风,我想它也会有一些套路可以帮助你。