ما هي المكتبات الجيدة الموجودة لحل نظام المعادلات غير الخطية في C ++؟

StackOverflow https://stackoverflow.com/questions/4233964

سؤال

في تطبيق C ++ أقوم بترميزه ، أحتاج إلى حل نظام من عدمالمعادلات الخطية (المعادلات n ، n غير معروفة).

ستكون الأنظمة التي أحلها صغيرة إلى حد ما (ما يصل إلى 10 معادلات/غير معروفة) ، لذلك لن يكون الأداء مشكلة حقيقية. لقد بحثت على الويب قليلاً عن مكتبة حلال غير خطي ، ولم أتمكن من الوصول إلى شيء يبدو سهلاً للاستخدام (وصلت إلى إيف و C/C ++ minpack, ، ولكن يبدو أن كلاهما كان مبالغة في حاجتي).

أي أفكار وأفكار المكتبات سهلة الاستخدام لهذا الغرض؟

هل كانت مفيدة؟

المحلول

هناك خياران لك ، يمكنك استخدام حزم Sundials التي تتضمن حلًا غير خطي ، مكتوب في CI Think. المشكلة الوحيدة التي وجدتها هي أنك تحتاج إلى تقديم تقديرات أولية جيدة. الخيار الثاني هو استخدام NLEQ أو NLEQ2 الذي أعتقد أنه متفوق (Writtein في Fortran ولكن من السهل الارتباط بـ C مثل Langages. ومع ذلك ، واجهت بعض المشكلات في تحديد موقعها الآن. يوجد موقع ويب جيد مع قائمة بالخيارات الممكنة في: http://plato.asu.edu/sub/zero.html

نصائح أخرى

يجب أن يكون هناك شيء واحد واضح: حل المعادلة غير الخطية ليس بالأمر السهل. إنه ليس هو نفسه حل المعادلات الخطية. أنت لست مضمونًا دائمًا للحصول على حل. ويمكن أن يكون لاختيارك للحالة الأولية واستراتيجية الزيادة تأثير عميق على الحل الذي تحصل عليه.

مع ذلك ، لا يمكنني التوصية بمكتبة معينة ، ولكن يجب أن تكون تبحث عن حزمة الجبر الخطية التي تتضمن تكرار نيوتن رافسون في قائمة الخيارات.

الوصفات العددية لديها روتين من شأنه أن يقوم بالمهمة نيابة عنك.

ذلك يعتمد على مدى عدم خطية المعادلات. إذا كانوا يمتلكون بعض الخصائص "اللطيفة" ... الأكثر وضوحًا كونها مصفوفة إيجابية أو محدبة ، فقد تكون هناك خوارزميات متخصصة. يمكنني استخدام IBM/Ilog Cplex لمعظم احتياجات البرمجة الخطية. يتم توفير المكتبات التي يمكن سحبها إلى تطبيقات C ++. على الرغم من أنني لم أستخدم وحدة البرمجة التربيعية الخاصة بهم ، إلا أنها في الحقيقة حديثة في البرمجة الخطية ذات الطاقة العالية والبرمجة غير الخطية.

هناك دائمًا GSL ، لكن جميع التعليقات التي تم إجراؤها في الإجابات الأخرى تنطبق على هذا أيضًا:

http://www.gnu.org/software/gsl/manual/html_node/multidimensal-root_002dfinding.html#index-nonlinear-systems-of-equations_002c-solution-of-2426

هل نظرت إلى عملة أو؟ قد يساعد ذلك إذا قمت بتقديم سؤالك إلى OR-Exchange.

انها ليست مجانية بأي وسيلة ، ولكن حلال ستعمل هنا.

Microsoft Z3 https://github.com/z3prover/z3/blob/master/xamples/c٪2B٪2B/Example.cpp

ضع في اعتبارك أيضًا Omnn :: Math:https://github.com/ohhmm/openmind/blob/master/omnn/math/test/08_system.cpp

دعنا نقول نظام المعادلات مثل هذا:

(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2

ثم لديك خيارات الزوجين:

Valuable a1, a2, b1, b2; // init with values

System sys;
Variable x,y;
sys << (x-a1)^2 + (y-b1)^2 - c1; // addin an equation as an equality to 0
sys << (x-a2)^2 + (y-b2)^2 - c2;

for(auto& solution : sys.Solve(x))
        std::cout << solution;

الطريقة البديلة هي جعل معادلة واحدة (انظر لماذا):

((X-A1)^2 + (Y-B1)^2-C1)^2 + ((X-A2)^2 + (Y-B2)^2-C2)^2 = 0

Variable x,y;
Valuable a1, a2, b1, b2; // init with values
auto eq = ((x-a1)^2 + (y-b1)^2 - c1)^2 + ((x-a2)^2 + (y-b2)^2 - c2)^2;
eq.SetView(Valuable::View::Equation);  // optional: equation optimizations
// get y function:
auto fn = eq(y);

// show
std::cout << fn << std::endl;

// evaluate
auto evaluate = fn;
evaluate.eval(x, 10);
evaluate.optimize(); // calculate
// show calculated value at x=10:
std::cout << evaluate << std::endl;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top