eqsolver錆の方程式ソルバーと最適化ライブラリこの錆ライブラリは、方程式を数値的に解くことと、目的関数を最適化することを目的としています。
ライブラリは受動的に維持されているため、他の機能は追加されません。ただし、GitHubの問題は回答され、解決されます。
このライブラリへの貢献とフィードバックは大歓迎です!
ライブラリで使用できます。それらの説明は、機能に可能な限り最大のドメインとコドメインを使用しています。これはRNです。ただし、RNの(行儀の良い)サブセットも機能します。さらに、多変量入力または出力を使用する方法は、Rust Nalgebraの線形代数ライブラリを頻繁に利用します。
この方法には2つのバージョンがあります。1つはヤコビのマトリックスを指定する必要があり、もう1つは有限の違いを使用して近似します。したがって、後者のバージョンは、壁の時間がわずかに長くなっています。どちらの方法でも最初の推測が必要です。
特定の不適切な問題については、この方法は失敗します。遅いが堅牢な方法については、以下のLevenberg-Marquardtメソッドを参照してください。
この方法には2つのバージョンがあります。1つはヤコビのマトリックスを指定する必要があり、もう1つは有限の違いを使用して近似します。したがって、後者のバージョンは、壁の時間がわずかに長くなっています。どちらの方法でも最初の推測が必要です。
特定の不適切な問題については、この方法は失敗します。遅いが堅牢な方法については、以下のLevenberg-Marquardtメソッドを参照してください。
この方法には2つのバージョンがあります。1つはヤコビのマトリックスを指定する必要があり、もう1つは有限の違いを使用して近似します。したがって、後者のバージョンは、壁の時間がわずかに長くなっています。どちらの方法でも最初の推測が必要です。
パラメーターの境界を知っている場合は、この方法を使用してください。
パラメーターの境界がわからないが、各パラメーターがどれほど不確かであるかを知っている場合は、この方法を使用します。
次のステップ方法のいずれかを使用するために(ビルダーパターンを使用)変更できる通常の微分方程式(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 ) ;その他の例については、例のディレクトリを参照してください。