Refactor integrator API.

This commit is contained in:
Alexander Nozik 2021-05-16 14:09:21 +03:00
parent 6f39b38a72
commit d1e76175b7
5 changed files with 19 additions and 10 deletions

View File

@ -5,6 +5,9 @@
package space.kscience.kmath.functions package space.kscience.kmath.functions
import space.kscience.kmath.integration.integrate
import space.kscience.kmath.integration.integrator
import space.kscience.kmath.integration.value
import space.kscience.kmath.operations.DoubleField import space.kscience.kmath.operations.DoubleField
import kotlin.math.pow import kotlin.math.pow
@ -13,8 +16,8 @@ fun main() {
val function: UnivariateFunction<Double> = { x -> 3 * x.pow(2) + 2 * x + 1 } val function: UnivariateFunction<Double> = { x -> 3 * x.pow(2) + 2 * x + 1 }
//get the result of the integration //get the result of the integration
val result = DoubleField.integrate(0.0..10.0, function = function) val result = DoubleField.integrator.integrate(0.0..10.0, function = function)
//the value is nullable because in some cases the integration could not succeed //the value is nullable because in some cases the integration could not succeed
println(result.valueOrNull) println(result.value)
} }

View File

@ -5,6 +5,9 @@
package space.kscience.kmath.functions package space.kscience.kmath.functions
import space.kscience.kmath.integration.integrate
import space.kscience.kmath.integration.integrator
import space.kscience.kmath.integration.value
import space.kscience.kmath.nd.StructureND import space.kscience.kmath.nd.StructureND
import space.kscience.kmath.nd.nd import space.kscience.kmath.nd.nd
import space.kscience.kmath.operations.DoubleField import space.kscience.kmath.operations.DoubleField
@ -22,9 +25,9 @@ fun main(): Unit = DoubleField {
val function: (Double) -> StructureND<Double> = { x: Double -> 3 * number(x).pow(2) + 2 * diagonal(x) + 1 } val function: (Double) -> StructureND<Double> = { x: Double -> 3 * number(x).pow(2) + 2 * diagonal(x) + 1 }
//get the result of the integration //get the result of the integration
val result = integrate(0.0..10.0, function = function) val result = integrator.integrate(0.0..10.0, function = function)
//the value is nullable because in some cases the integration could not succeed //the value is nullable because in some cases the integration could not succeed
println(result.valueOrNull) println(result.value)
} }
} }

View File

@ -7,6 +7,7 @@ package space.kscience.kmath.commons.integration
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import space.kscience.kmath.integration.integrate import space.kscience.kmath.integration.integrate
import space.kscience.kmath.integration.value
import space.kscience.kmath.misc.UnstableKMathAPI import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.operations.DoubleField.sin import space.kscience.kmath.operations.DoubleField.sin
import kotlin.math.PI import kotlin.math.PI
@ -19,7 +20,7 @@ internal class IntegrationTest {
@Test @Test
fun simpson() { fun simpson() {
val res = CMIntegrator.simpson().integrate(0.0..2 * PI, function = function) val res = CMIntegrator.simpson().integrate(0.0..2 * PI, function = function).value
assertTrue { abs(res) < 1e-3 } assertTrue { abs(res) < 1e-3 }
} }
@ -28,7 +29,7 @@ internal class IntegrationTest {
val res = CMIntegrator.simpson().integrate(0.0..PI, { val res = CMIntegrator.simpson().integrate(0.0..PI, {
targetRelativeAccuracy = 1e-4 targetRelativeAccuracy = 1e-4
targetAbsoluteAccuracy = 1e-4 targetAbsoluteAccuracy = 1e-4
}, function) }, function).value
assertTrue { abs(res - 2) < 1e-3 } assertTrue { abs(res - 2) < 1e-3 }
assertTrue { abs(res - 2) > 1e-12 } assertTrue { abs(res - 2) > 1e-12 }
} }

View File

@ -6,7 +6,9 @@ package space.kscience.kmath.integration
import space.kscience.kmath.misc.UnstableKMathAPI import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.operations.Field import space.kscience.kmath.operations.Field
import space.kscience.kmath.structures.* import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.asBuffer
import space.kscience.kmath.structures.indices
/** /**
* Set of univariate integration ranges. First components correspond to ranges themselves, second components to number of * Set of univariate integration ranges. First components correspond to ranges themselves, second components to number of
@ -81,7 +83,7 @@ public val <T:Any> Field<T>.integrator: GaussIntegrator<T> get() = GaussIntegrat
/** /**
* Use [integrate] to integrate the function in the current algebra with given [range] and [numPoints] * Integrate using [intervals] segments with Gauss-Legendre rule of [order] order
*/ */
@UnstableKMathAPI @UnstableKMathAPI
public fun <T : Any> GaussIntegrator<T>.integrate( public fun <T : Any> GaussIntegrator<T>.integrate(

View File

@ -16,7 +16,7 @@ import kotlin.test.assertEquals
class GaussIntegralTest { class GaussIntegralTest {
@Test @Test
fun gaussSin() { fun gaussSin() {
val res = DoubleField.integrate(0.0..2 * PI) { x -> val res = DoubleField.integrator.integrate(0.0..2 * PI) { x ->
sin(x) sin(x)
} }
assertEquals(0.0, res.valueOrNull!!, 1e-2) assertEquals(0.0, res.valueOrNull!!, 1e-2)
@ -24,7 +24,7 @@ class GaussIntegralTest {
@Test @Test
fun gaussUniform() { fun gaussUniform() {
val res = DoubleField.integrate(0.0..100.0) { x -> val res = DoubleField.integrator.integrate(0.0..100.0) { x ->
if(x in 30.0..50.0){ if(x in 30.0..50.0){
1.0 1.0
} else { } else {