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 ) ;有关更多示例,请参见示例目录。