eqsolver - محلل معادلة ومكتبة التحسين للصدأتهدف مكتبة الصدأ هذه إلى حل المعادلات العددية وتحسين الوظائف الموضوعية.
يتم صيانة المكتبة بشكل سلبي ، مما يعني أنه لن تتم إضافة ميزات أخرى. ومع ذلك ، سيتم الرد على القضايا على github وحلها.
المساهمات والتعليقات على هذه المكتبة أكثر من موضع ترحيب!
الطرق التالية متاحة للاستخدام في المكتبة. تستخدم أوصافهم أكبر مجال ممكن و codomain للوظائف ، وهو RN. ومع ذلك ، فإن أي مجموعة فرعية (رفاهية) من RN تعمل أيضًا. بالإضافة إلى ذلك ، فإن الطرق التي تستخدم الإدخال أو الإخراج متعدد المتغيرات تستخدم بشكل كبير مكتبة الجبر الخطي لصالح الصدأ Nalgebra.
هناك نسختان من هذه الطريقة ، يتطلب المرء أن يتم إعطاء مصفوفة يعقوب والآخر يقاربها باستخدام الاختلافات المحدودة. الإصدار الأخير ، لذلك ، وقت جدار أطول قليلا. تتطلب كلتا الطريقتين تخمينًا أوليًا.
لبعض المشكلات السيئة ، ستفشل هذه الطريقة. للحصول على طريقة أبطأ ولكن أكثر قوة ، راجع طريقة Levenberg-Marquardt أدناه.
هناك نسختان من هذه الطريقة ، يتطلب المرء أن يتم إعطاء مصفوفة يعقوب والآخر يقاربها باستخدام الاختلافات المحدودة. الإصدار الأخير ، لذلك ، وقت جدار أطول قليلا. تتطلب كلتا الطريقتين تخمينًا أوليًا.
لبعض المشكلات السيئة ، ستفشل هذه الطريقة. للحصول على طريقة أبطأ ولكن أكثر قوة ، راجع طريقة Levenberg-Marquardt أدناه.
هناك نسختان من هذه الطريقة ، يتطلب المرء أن يتم إعطاء مصفوفة يعقوب والآخر يقاربها باستخدام الاختلافات المحدودة. الإصدار الأخير ، لذلك ، وقت جدار أطول قليلا. تتطلب كلتا الطريقتين تخمينًا أوليًا.
استخدم هذه الطريقة إذا كنت تعرف حدود المعلمات.
استخدم هذه الطريقة إذا كنت لا تعرف حدود المعلمات ولكن تعرف على مدى عدم اليقين في كل معلمة.
هناك 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 ) ;لمزيد من الأمثلة ، يرجى الاطلاع على دليل الأمثلة.