eqsolver
v0.2.0
eqsolver RUST的方程求解器和優化庫該銹庫旨在求解方程並優化目標函數。
該庫是被動維護的,這意味著不會添加其他功能。但是,GITHUB上的問題將得到回答和解決。
歡迎對該圖書館的貢獻和反饋!
以下方法可在庫中使用。他們的描述使用最大的可能域和代碼域的函數,即RN。但是,RN的任何(舉止良好)子集也可以。此外,使用多元輸入或大量輸出的方法將Rust Nalgebra的線性代數庫利用。
該方法有兩個版本,一種要求給出雅各布矩陣,而其他則需要使用有限的差異來近似。因此,後一個版本的壁時間稍長。兩種方法都需要初始猜測。
對於某些不良問題,此方法將失敗。有關較慢但更健壯的方法,請參見下面的Levenberg-Marquardt方法。
該方法有兩個版本,一種要求給出雅各布矩陣,而其他則需要使用有限的差異來近似。因此,後一個版本的壁時間稍長。兩種方法都需要初始猜測。
對於某些不良問題,此方法將失敗。有關較慢但更健壯的方法,請參見下面的Levenberg-Marquardt方法。
該方法有兩個版本,一種要求給出雅各布矩陣,而其他則需要使用有限的差異來近似。因此,後一個版本的壁時間稍長。兩種方法都需要初始猜測。
如果知道參數的界限,請使用此方法。
如果您不知道參數的界限,請使用此方法,但知道每個參數的不確定程度。
有一個用於普通微分方程(ODE)的單個struct ,可以修改(使用構建器模式)使用以下步驟方法之一:
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 ) ;有關更多示例,請參見示例目錄。