eqsolver - библиотека уравнений и библиотека оптимизации для ржавчиныЭта библиотека ржавчины направлена на численное решение уравнений и оптимизация целевых функций.
Библиотека пассивно поддержана , что означает, что другие функции не будут добавлены. Тем не менее, на вопросы GitHub будут отвечать и решены.
Вклад и отзывы в эту библиотеку более чем приветствуются!
Следующие методы доступны для использования в библиотеке. Их описания используют максимально возможный домен и кодом для функций, которые равен RN. Тем не менее, любая (хорошо поведение) подмножество RN также работает. Кроме того, методы, которые используют многовариантный вход или вывод, в значительной степени используют линейную библиотеку алгебры для ржавчины Nalgebra.
Существует две версии этого метода, одна требует дана якобийской матрицы, а другая приближается к ней, используя конечные различия. Поэтому последняя версия имеет немного более длительное время стены. Оба метода требуют первоначального предположения.
Для определенных плохой задачи этот метод потерпит неудачу. Для более медленного, но более надежного метода, см. Метод Левенберга-Марквардта ниже.
Существует две версии этого метода, одна требует дана якобийской матрицы, а другая приближается к ней, используя конечные различия. Поэтому последняя версия имеет немного более длительное время стены. Оба метода требуют первоначального предположения.
Для определенных плохой задачи этот метод потерпит неудачу. Для более медленного, но более надежного метода, см. Метод Левенберга-Марквардта ниже.
Существует две версии этого метода, одна требует дана якобийской матрицы, а другая приближается к ней, используя конечные различия. Поэтому последняя версия имеет немного более длительное время стены. Оба метода требуют первоначального предположения.
Используйте этот метод, если вы знаете границы параметров.
Используйте этот метод, если вы не знаете границы параметров, но знаете, насколько неопределенна каждый параметр.
Существует одна struct для обычных дифференциальных уравнений (ODE), которая может быть изменена (с использованием шаблона застройщика), чтобы использовать один из следующих методов шага:
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 ) ;Для получения дополнительных примеров, пожалуйста, см. Справочник примеров.