سؤال

أود أن أعرف ما إذا كان أي شخص لديه معلومات أو خبرة حول كيفية القيام بشيء يبدو بسيطًا ولكنه لا يبدو كذلك عند محاولة برمجته.الفكرة هي :إعطاء سلسلة تحتوي على معادلة، مثل:"2*x = 10" على سبيل المثال (هذا بسيط، لكنه قد يصبح معقدًا للغاية، مثل sqrt(54)*35=x^2;وهكذا....) وسيعود البرنامج x = 5 وربما يعطي سجلاً لكيفية وصوله إلى هناك.

هل هذا ممكن؟إذا كان الأمر كذلك، هل لدى أي شخص الرصاص؟للمعلومات هناك هذا الموقع (http://www.numberempire.com/equationsolver.php) والذي يفعل نفس الشيء في PHP، ولكنه ليس مفتوح المصدر.

شكرا على اي مساعدة !

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

المحلول

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

ومع ذلك، في لغات مثل Ruby، نظرًا لأن لديك مثل هذا الدعم الشامل لمعالجة السلسلة ولأن لديك قوة هائلة في وقت التشغيل، يمكنك حل مشكلتك باستخدام سطر واحد من التعليمات البرمجية كما يلي:

puts(eval($_)) while gets

نعم سيغطي ذلك أكثر مما تطلبه.

نصائح أخرى

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

إذا أصبحت المعادلات معقدة ، فلن تكون بالتأكيد قليلة من كود C/C ++.

بالنسبة للمعادلات الخطية ، يجب عليك محاكاة إحدى الطرق الموضحة في كتب الجبر الخطية. رمز ذلك صغير بما فيه الكفاية.

يمكنك محاولة الارتباط في Sympy برمز C (أو C ++) واستخدامه لحل المعادلات الخاصة بك.

IIRC ، Sympy لديه هذا النوع من الوظائف. بالإضافة إلى ذلك ، يجب أن يكون من الأسهل معالجة سلسلة الإدخال إلى معادلة قابلة للاستخدام داخل Python ثم تمريرها إلى Sympy لحلها.

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

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

  • أنظمة المعادلات الخطية: أي حلال خطي مباشر. إذا كنت ترغب في إظهار الخطوات بشكل صريح وعدد المعادلات/المجهول ، فإنني أوصي بشيء بسيط مثل القضاء الغاوسي غير المنفذة أو قاعدة Cramer.
  • نظام المعادلات كثير الحدود: ما يعادل ، بعد الاستبدال المتغير ، لإيجاد جذور من الحدود الحية. إذا كانت هذه درجة <= 4 ، فهناك صيغ للحلول الدقيقة. NB: للحصول على الدرجة 3 و 4 هذه الصيغ ليست ممتعة.
  • الحلول العقلانية لنظام المعادلات متعددة الحدود مع معامل عقلاني: هل تبديل متغير على النحو الوارد أعلاه. ثم القوة الغاشمة باستخدام اختبار الصفر العقلاني.
  • أنواع أخرى من المعادلات: حظا سعيدا. بالنسبة للأنظمة الأكثر تعقيدًا للمعادلات غير الخطية ، إذا كنت تستطيع تسوية الحلول العددية (غير التحليلية) ، فابحث في طريقة نيوتن.

تصحيح واحد: هذا ليس الجبر الخطي ، مما يعني عادة مصفوفة معادلات متعددة وغير معروفة.

مثالك بالتأكيد ليس معقدًا.

ما تحتاجه هو قواعد التعبير البسيطة والحلويات. تحليل المعادلة في شجرة بناء الجملة المجردة وامش الشجرة لتقييمها.

إذا كنت تكتب جافا ، فقد يبدو ذلك هذه. مثال آخر هو symja. ربما سيكون مصدر إلهام كافٍ لكي تواجهك لـ C ++.

قد ترغب أيضًا في النظر إلى Alpha Mathematica و Wolfram. ستيفن وولفرام هو واحد من أفضل علماء الرياضيات وعلماء الكمبيوتر في العالم. لديه الكثير من الأشياء التي يمكنك إعادة استخدامها لصالح جيد بدلاً من كتابتها بنفسك.

سيكون عليك تحديد ما تعنيه بـ "حل" وما تتوقع أن تعود.

هناك حلول رمزية وحلول رقمية. أي واحد تقصد؟ كلاهما صالح بنفس القدر ، لكنه مختلف. ستطبق تقنيات مختلفة اعتمادًا على إجابتك.

نقطة أخرى: هناك العديد من التقنيات لـ "حل" المعادلات التي تعتمد كثيرًا على نوع المعادلة. إذا أعطتني شيئًا مثل f(x) = 0 أفكر في خوارزميات العثور على الجذر مثل طريقة نيوتن. إذا أعطتني معادلة تفاضلية عادية ، فقد أجرب طريقة استبدال أو تكامل رقمي باستخدام Runge-Kutta. إذا أعطتني معادلة تفاضلية جزئية ، يمكنني تطبيق اختلاف محدود أو عنصر محدود أو تقنيات العناصر الحدودية. (لا تجعلني أبدأ في PDEs الإهليلجي والمكافئ والزائد.)

النقطة المهمة هي أن سؤالك عام للغاية ، والجواب يعتمد على الكثير على ما تحاول القيام به. قد يساعد المزيد من التفاصيل.

بشكل عام ، سيتعين عليك تحليل التعبير في بعض التمثيل الداخلي. تشير العديد من كتب الجبر الخطي إلى استخدام المصفوفات (أو std::vector) لتمثيل المعاملات. يتم تعريف الأسد من المصطلح من خلال موقفه في المتجه.

على سبيل المثال ، التعبير:

 2 + 3x + 5x^2

يمكن تمثيلها كصفيف أو std::vector:

std::vector<int> expression;
expression[0] = 2; // 2 * x ^ 0
expression[1] = 3;
expression[2] = 5;

تصبح كتابة وظيفة التقييم تافهة ، وتركت كتمرين للقارئ.

يصبح حل معادلات متعددة أكثر تعقيدًا. هناك مكتبات وخوارزميات حالية لهذا. يجب أن يأتي بحث Google بشيء جيد. :-)

أقترح البدء بمصطلحات بسيطة وبناء محلل لذلك. بمجرد أن يعمل ذلك ، يمكنك تغيير المحلل اللغوي لقبول أسماء الوظائف أيضًا.

إذا كنت تحاول تبسيط تعبير له مصطلحات على جانبي =, ، فقط اكتب الخطوات التي تتخذها عادة عند الحل باليد. جرب بعض المعادلات المختلفة للحصول على بعض القواعد. الآن تنفيذ هذه القواعد في C ++.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top