eqsolver - Perpustakaan Solver dan Optimalisasi Persamaan untuk RustPerpustakaan karat ini ditujukan untuk menyelesaikan persamaan secara numerik dan mengoptimalkan fungsi objektif.
Perpustakaan diperiksa secara pasif , yang berarti tidak ada fitur lain yang akan ditambahkan. Namun, masalah pada github akan dijawab dan diselesaikan.
Kontribusi dan umpan balik ke perpustakaan ini lebih dari disambut!
Metode berikut tersedia untuk digunakan di perpustakaan. Deskripsi mereka menggunakan domain dan codomain terbesar untuk fungsi, yaitu RN. Namun, setiap subset (perilaku baik) RN juga berfungsi. Selain itu, metode yang menggunakan input multivariat atau output sangat menggunakan pustaka aljabar linier untuk karat nalgebra.
Ada dua versi metode ini, satu membutuhkan matriks Jacobian untuk diberikan dan yang lainnya mendekati itu menggunakan perbedaan yang terbatas. Versi terakhir, oleh karena itu, memiliki waktu dinding yang sedikit lebih lama. Kedua metode membutuhkan tebakan awal.
Untuk masalah buruk tertentu, metode ini akan gagal. Untuk metode yang lebih lambat tetapi lebih kuat, lihat metode Levenberg-Marquardt di bawah ini.
Ada dua versi metode ini, satu membutuhkan matriks Jacobian untuk diberikan dan yang lainnya mendekati itu menggunakan perbedaan yang terbatas. Versi terakhir, oleh karena itu, memiliki waktu dinding yang sedikit lebih lama. Kedua metode membutuhkan tebakan awal.
Untuk masalah buruk tertentu, metode ini akan gagal. Untuk metode yang lebih lambat tetapi lebih kuat, lihat metode Levenberg-Marquardt di bawah ini.
Ada dua versi metode ini, satu membutuhkan matriks Jacobian untuk diberikan dan yang lainnya mendekati itu menggunakan perbedaan yang terbatas. Versi terakhir, oleh karena itu, memiliki waktu dinding yang sedikit lebih lama. Kedua metode membutuhkan tebakan awal.
Gunakan metode ini jika Anda mengetahui batas -batas parameter.
Gunakan metode ini jika Anda tidak tahu batas -batas parameter tetapi tahu seberapa tidak pasti setiap parameter.
Ada satu struct untuk persamaan diferensial biasa (ODE) yang dapat dimodifikasi (menggunakan pola pembangun) untuk menggunakan salah satu dari metode langkah berikut:
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 ) ;Untuk lebih banyak contoh, silakan lihat Direktori Contoh.