eqsolver 녹을위한 방정식 솔버 및 최적화 라이브러리이 Rust 라이브러리는 방정식을 수치 적으로 해결하고 목표 기능을 최적화하는 것을 목표로합니다.
라이브러리는 수동적으로 관리되어 있어 다른 기능이 추가되지 않습니다. 그러나 Github에 대한 문제는 답변 및 해결됩니다.
이 라이브러리에 대한 기여와 피드백은 환영받는 것 이상입니다!
다음 방법은 라이브러리에서 사용할 수 있습니다. 그들의 설명은 기능에 가장 큰 도메인과 코 도메인, 즉 Rn을 사용합니다. 그러나 RN의 모든 (잘 행동 한) 하위 집합도 작동합니다. 또한, 다변량 입력 또는 출력을 사용하는 방법은 Rust Nalgebra의 선형 대수 라이브러리를 많이 사용합니다.
이 방법에는 두 가지 버전이 있습니다. 하나는 Jacobian 행렬을 제공해야하며 다른 하나는 유한 한 차이를 사용하여 근사합니다. 후자의 버전은 벽 시간이 약간 더 길다. 두 방법 모두 초기 추측이 필요합니다.
특정 잘못된 문제의 경우이 방법이 실패합니다. 느리지 만 더 강력한 방법은 아래의 Levenberg-Marquardt 방법을 참조하십시오.
이 방법에는 두 가지 버전이 있습니다. 하나는 Jacobian 행렬을 제공해야하며 다른 하나는 유한 한 차이를 사용하여 근사합니다. 후자의 버전은 벽 시간이 약간 더 길다. 두 방법 모두 초기 추측이 필요합니다.
특정 잘못된 문제의 경우이 방법이 실패합니다. 느리지 만 더 강력한 방법은 아래의 Levenberg-Marquardt 방법을 참조하십시오.
이 방법에는 두 가지 버전이 있습니다. 하나는 Jacobian 행렬을 제공해야하며 다른 하나는 유한 한 차이를 사용하여 근사합니다. 후자의 버전은 벽 시간이 약간 더 길다. 두 방법 모두 초기 추측이 필요합니다.
매개 변수의 한계를 알고있는 경우이 메소드를 사용하십시오.
매개 변수의 한계를 모르지만 각 매개 변수가 얼마나 불확실한 지 아는 경우이 메소드를 사용하십시오.
다음 단계 방법 중 하나를 사용할 수 있도록 (빌더 패턴 사용) 수정할 수있는 일반 미분 방정식 (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 ) ;더 많은 예는 예제 디렉토리를 참조하십시오.