eqsolver : una biblioteca de solucionador de ecuaciones y optimización para óxidoEsta biblioteca de óxido está dirigida a resolver ecuaciones numéricamente y optimizar las funciones objetivas.
La biblioteca se mantiene pasivamente , lo que significa que no se agregarán otras características. Sin embargo, los problemas en el GitHub serán respondidos y resueltos.
¡Las contribuciones y los comentarios a esta biblioteca son más que bienvenidos!
Los siguientes métodos están disponibles para usar en la biblioteca. Sus descripciones utilizan el dominio y el codomain más grande posible para las funciones, que es RN. Sin embargo, cualquier subconjunto (bienestar) de RN también funciona. Además, los métodos que utilizan entrada o salida multivariada utilizan en gran medida la biblioteca de álgebra lineal para Rust Nalgebra.
Hay dos versiones de este método, uno requiere que se administre la matriz jacobiana y la otra la aproxima utilizando diferencias finitas. La última versión tiene, por lo tanto, un tiempo de pared un poco más largo. Ambos métodos requieren una suposición inicial.
Para ciertos problemas mal plenados, este método fallará. Para un método más lento pero más robusto, consulte el método Levenberg-Marquardt a continuación.
Hay dos versiones de este método, uno requiere que se administre la matriz jacobiana y la otra la aproxima utilizando diferencias finitas. La última versión tiene, por lo tanto, un tiempo de pared un poco más largo. Ambos métodos requieren una suposición inicial.
Para ciertos problemas mal plenados, este método fallará. Para un método más lento pero más robusto, consulte el método Levenberg-Marquardt a continuación.
Hay dos versiones de este método, uno requiere que se administre la matriz jacobiana y la otra la aproxima utilizando diferencias finitas. La última versión tiene, por lo tanto, un tiempo de pared un poco más largo. Ambos métodos requieren una suposición inicial.
Use este método si conoce los límites de los parámetros.
Use este método si no conoce los límites de los parámetros, pero sepa cuán incierto es cada parámetro.
Hay una sola struct para las ecuaciones diferenciales ordinarias (ODE) que se puede modificar (usando el patrón de constructor) para usar uno de los siguientes métodos de paso:
use eqsolver :: single_variable :: FDNewton ;
let f = | x : f64 | x . exp ( ) - 1. /x ; // e^x = 1/x
let solution = FDNewton :: new ( f ) . solve ( 0.5 ) ; // Starting guess is 0.5 use eqsolver :: multivariable :: MultiVarNewtonFD ;
use nalgebra :: { vector , Vector2 } ;
// Want to solve x^2 - y = 1 and xy = 2
let f = | v : Vector2 < f64 > | vector ! [ v [ 0 ] . powi ( 2 ) - v [ 1 ] - 1. , v [ 0 ] * v [ 1 ] - 2. ] ;
let solution = MultiVarNewtonFD :: new ( f ) . solve ( vector ! [ 1. , 1. ] ) ; // Starting guess is (1, 1) use eqsolver :: ODESolver ;
let f = | t : f64 , y : f64 | t * y ; // y' = f(t, y) = ty
let ( x0 , y0 ) = ( 0. , 0.2 ) ;
let x_end = 2. ;
let step_size = 1e-3 ;
let solution = ODESolver :: new ( f , x0 , y0 , step_size ) . solve ( x_end ) ; use eqsolver :: multivariable :: LevenbergMarquardtFD ;
use nalgebra :: { vector , Vector2 } ;
let c0 = [ 3. , 5. , 3. ] ;
let c1 = [ 1. , 0. , 4. ] ;
let c2 = [ 6. , 2. , 2. ] ;
// Function from R2 to R3
let f = | v : Vector2 < f64 > | {
vector ! (
( v [ 0 ] - c0 [ 0 ] ) . powi ( 2 ) + ( v [ 1 ] - c0 [ 1 ] ) . powi ( 2 ) - c0 [ 2 ] * c0 [ 2 ] ,
( v [ 0 ] - c1 [ 0 ] ) . powi ( 2 ) + ( v [ 1 ] - c1 [ 1 ] ) . powi ( 2 ) - c1 [ 2 ] * c1 [ 2 ] ,
( v [ 0 ] - c2 [ 0 ] ) . powi ( 2 ) + ( v [ 1 ] - c2 [ 1 ] ) . powi ( 2 ) - c2 [ 2 ] * c2 [ 2 ] ,
)
} ;
let solution_lm = LevenbergMarquardtFD :: new ( f )
. solve ( vector ! [ 4.5 , 2.5 ] ) // Guess
. unwrap ( ) ; use eqsolver :: global_optimisers :: { CrossEntropy , ParticleSwarm } ;
use nalgebra :: SVector ;
use std :: f64 :: consts :: PI ;
const SIZE : usize = 10 ;
let rastrigin = | v : SVector < f64 , SIZE > | {
v . fold ( 10. * SIZE as f64 , |acc , x| {
acc + x * x - 10. * f64 :: cos ( 2. * PI * x )
} )
} ;
let bounds = SVector :: repeat ( 10. ) ;
let standard_deviations = SVector :: repeat ( 10. ) ;
let guess = SVector :: repeat ( 5. ) ;
let opt_pso = ParticleSwarm :: new ( rastrigin , -bounds , bounds ) . solve ( guess ) ;
let opt_ce = CrossEntropy :: new ( rastrigin )
. with_std_dev ( standard_deviations )
. solve ( guess ) ;Para obtener más ejemplos, consulte el directorio de ejemplos.