eqsolver - um solucionador de equações e biblioteca de otimização para ferrugemEsta biblioteca de ferrugem tem como objetivo resolver numericamente equações e otimizar funções objetivas.
A biblioteca é mantida passivamente , o que significa que nenhum outro recurso será adicionado. No entanto, questões no Github serão respondidas e resolvidas.
Contribuições e feedback para esta biblioteca são mais do que bem -vindos!
Os seguintes métodos estão disponíveis para uso na biblioteca. Suas descrições usam o maior domínio e codomínio possíveis para as funções, que é RN. No entanto, qualquer subconjunto (bem-comportado) do RN também funciona. Além disso, os métodos que usam entrada ou saída multivariados utilizam fortemente a biblioteca de álgebra linear para Nalgebra de ferrugem.
Existem duas versões desse método, uma exige que a matriz jacobiana seja dada e a outra se aproxima que ela usando diferenças finitas. A última versão tem, portanto, tempo de parede um pouco mais longo. Ambos os métodos requerem um palpite inicial.
Para certos problemas mal postos, esse método falhará. Para um método mais lento, mas mais robusto, consulte o método Levenberg-Marquardt abaixo.
Existem duas versões desse método, uma exige que a matriz jacobiana seja dada e a outra se aproxima que ela usando diferenças finitas. A última versão tem, portanto, tempo de parede um pouco mais longo. Ambos os métodos requerem um palpite inicial.
Para certos problemas mal postos, esse método falhará. Para um método mais lento, mas mais robusto, consulte o método Levenberg-Marquardt abaixo.
Existem duas versões desse método, uma exige que a matriz jacobiana seja dada e a outra se aproxima que ela usando diferenças finitas. A última versão tem, portanto, tempo de parede um pouco mais longo. Ambos os métodos requerem um palpite inicial.
Use este método se você souber os limites dos parâmetros.
Use esse método se você não conhece os limites dos parâmetros, mas saiba como cada parâmetro é incerto.
Existe uma única struct para equações diferenciais comuns (ODE) que podem ser modificadas (usando o padrão do construtor) para usar um dos seguintes métodos de etapa:
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 mais exemplos, consulte o diretório exemplos.