%useLatestDescriptors
%use lets-plot
fun linspace(start: Double, stop: Double, num: Int): List<Double> {
return List(num) { i -> start + i * ((stop - start) / (num - 1)) }
}
fun F(x: Double, y: Double, a: Double = 0.0, b: Double = 0.0): Double {
return y.pow(2) - x.pow(3) - a * x - b
}
fun level(z: Double, c: Double = 1.0): Double {
return exp(-c * abs(z))
}
val n = 300
val a = -1.0
val b = 0.0
val xRange = linspace(-3.0, 3.0, n + 1)
val yRange = linspace(-3.0, 3.0, n + 1)
val zippedData = xRange.map { x ->
yRange.map { y -> Triple(x, y, level(F(x, y, a = a, b = b), c = 10.0)) }
}.flatten()
val data = mapOf(
"x" to zippedData.map { it.first },
"y" to zippedData.map { it.second },
"z" to zippedData.map { it.third },
)
letsPlot(data) +
geomRaster(showLegend = false) { x="x"; y="y"; fill="z" } +
scaleFillGradient(low="#253494", high="#ffffcc") +
ggtitle("Elliptic curve with a = $a, b = $b",
"Simple way to draw an algebraic curve - with geomRaster()") +
ggsize(800, 600) +
themeClassic() + theme(axis = "blank")