eqsolver - un solveur d'équation et une bibliothèque d'optimisation pour la rouilleCette bibliothèque de rouille vise à résoudre numériquement les équations et à optimiser les fonctions objectives.
La bibliothèque est passivement entretenue , ce qui signifie qu'aucune autre fonctionnalité ne sera ajoutée. Cependant, les problèmes sur le github seront répondus et résolus.
Les contributions et les commentaires à cette bibliothèque sont plus que les bienvenus!
Les méthodes suivantes sont disponibles à utiliser dans la bibliothèque. Leurs descriptions utilisent le plus grand domaine et codomaine possible pour les fonctions, qui est RN. Cependant, tout sous-ensemble (bien élevé) de RN fonctionne également. De plus, les méthodes qui utilisent une entrée ou une sortie multivariée utilisent fortement la bibliothèque d'algèbre linéaire pour Rust Nalgebra.
Il existe deux versions de cette méthode, l'une nécessite que la matrice jacobienne soit donnée et l'autre se rapproche en utilisant des différences finies. Cette dernière version a donc un temps de mur légèrement plus long. Les deux méthodes nécessitent une supposition initiale.
Pour certains problèmes mal posés, cette méthode échouera. Pour une méthode plus lente mais plus robuste, consultez la méthode Levenberg-Marquardt ci-dessous.
Il existe deux versions de cette méthode, l'une nécessite que la matrice jacobienne soit donnée et l'autre se rapproche en utilisant des différences finies. Cette dernière version a donc un temps de mur légèrement plus long. Les deux méthodes nécessitent une supposition initiale.
Pour certains problèmes mal posés, cette méthode échouera. Pour une méthode plus lente mais plus robuste, consultez la méthode Levenberg-Marquardt ci-dessous.
Il existe deux versions de cette méthode, l'une nécessite que la matrice jacobienne soit donnée et l'autre se rapproche en utilisant des différences finies. Cette dernière version a donc un temps de mur légèrement plus long. Les deux méthodes nécessitent une supposition initiale.
Utilisez cette méthode si vous connaissez les limites des paramètres.
Utilisez cette méthode si vous ne connaissez pas les limites des paramètres, mais sachez à quel point chaque paramètre est incertain.
Il existe une seule struct pour les équations différentielles ordinaires (ODE) qui peuvent être modifiées (en utilisant le modèle du constructeur) pour utiliser l'une des méthodes d'étape suivantes:
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 ) ;Pour plus d'exemples, veuillez consulter le répertoire des exemples.