سؤال

أنا مهتم ببناء آلة حاسبة مشتقة. لقد قمت برفع أدمغتي على حل المشكلة ، لكنني لم أجد حلاً صحيحًا على الإطلاق. هل لديك تلميح كيف تبدأ؟ شكرًا

أنا آسف! من الواضح أنني أريد أن أجعل تمايزًا رمزيًا.

لنفترض أن لديك الدالة f (x) = x^3 + 2x^2 + x

أرغب في عرض المشتق ، في هذه الحالة f '(x) = 3x^2 + 4x + 1

أرغب في تنفيذها في Objective-C لجهاز iPhone.

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

المحلول

أفترض أنك تحاول العثور على المشتق الدقيق للوظيفة. (تمايز رمزي)

تحتاج إلى تحليل التعبير الرياضي وتخزين العمليات الفردية في الوظيفة في بنية شجرة.

فمثلا، x + sin²(x) سيتم تخزينها ك + العملية ، تنطبق على التعبير x و ^ (الأسعار) تشغيل sin(x) و 2.

يمكنك بعد ذلك تمييز الشجرة بشكل متكرر عن طريق تطبيق قواعد التمايز على كل عقدة. على سبيل المثال ، أ + سوف تصبح العقدة u' + v', ، و * سوف تصبح العقدة uv' + vu'.

نصائح أخرى

تحتاج إلى تذكر حساب التفاضل والتكامل الخاص بك. تحتاج بشكل أساسي إلى شيئين: جدول المشتقات من الوظائف الأساسية وقواعد كيفية اشتقاق تعبيرات المركبة (مثل d(f + g)/dx = df/dx + dg/dx). ثم خذ تعبيرات محلل وذهب متكرر الشجرة. ((http://www.sosmath.com/tables/derivative/derivative.html)

تحليل سلسلة الخاص بك في S-Expression (على الرغم من أن هذا عادة ما يتم أخذه في سياق LISP ، يمكنك القيام بشيء مكافئ في أي لغة إلى حد كبير) ، أسهل مع LEX/YACC أو ما يعادلها ، ثم اكتب وظيفة "مشتق" عودية. في لهجة Ocaml-ish ، شيء من هذا القبيل:

let rec derive var = function
    | Const(_) -> Const(0)
    | Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var))
    | Add(x, y) -> Add(derive var x, derive var y)
    | Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b))
    ...

(إذا كنت لا تعرف بناء جملة OCAML - derive هي وظيفة متكررة ثنائية المعلمة ، مع المعلمة الأولى الاسم المتغير ، والثاني هو الرياضيات في خطوط متتالية ؛ على سبيل المثال ، إذا كانت هذه المعلمة هي بنية للنموذج Add(x, y), ، إرجاع الهيكل Add بنيت من حقلين ، مع قيم المشتقة x ومستمد y; ؛ وبالمثل لحالات أخرى من ماذا derive قد يستقبل كمعلمة ؛ _ في النمط الأول يعني "مطابقة أي شيء")

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

عند الانتهاء من تحولك في S-Exp ، أعد إعادة النتيجة S-Exp إلى نموذج سلسلة ، مرة أخرى مع وظيفة متكررة

وصفت SLAKs بالفعل الإجراء للتمايز الرمزي. أود فقط إضافة بعض الأشياء:

  • الرياضيات الرمزية هي في الغالب التحليل وتحولات الأشجار. Antlr هي أداة رائعة لكليهما. أقترح البدء بهذا الكتاب الرائع أنماط تنفيذ اللغة
  • هناك برامج مفتوحة المصدر تفعل ما تريد (على سبيل المثال Maxima). قد يكون تشريح مثل هذا البرنامج أمرًا مثيرًا للاهتمام أيضًا (ولكن من الأسهل فهم ما يجري إذا حاولت كتابته بنفسك ، أولاً)
  • ربما ، تريد أيضًا نوعًا من التبسيط للإخراج. على سبيل المثال ، مجرد تطبيق القواعد المشتقة الأساسية على التعبير 2 * x سوف تنتج 2 + 0*x. يمكن أيضًا القيام بذلك عن طريق معالجة الأشجار (على سبيل المثال عن طريق التحول 0 * [...] إلى 0 و [...] + 0 إلى [...] وهلم جرا)

ما هي أنواع العمليات التي تريد حساب مشتق؟ إذا سمحت بوظائف المثلثات مثل الجيب وجيب التمام والظلم ، فمن الأفضل أن يتم تخزينها في طاولة بينما قد يكون آخرون مثل كثير الحدود أسهل بكثير. هل تسمح للوظائف أن تحتوي على مدخلات متعددة ، على سبيل المثال (x ، y) بدلاً من مجرد f (x)؟

كثير الحدود في متغير واحد هو اقتراحي ومن ثم النظر في الإضافة في المثلثات ، لوغاريتمي ، الأسية وغيرها من الوظائف المتقدمة لحساب المشتقات التي قد يكون من الصعب القيام بها.

التمايز الرمزي على الوظائف الشائعة (+، -، *، /، ^، sin ، cos ، وما إلى ذلك) تجاهل المناطق التي تكون فيها الوظيفة أو مشتقها غير محددة. ما يصعب ، ربما على عكس ذلك ، هو تبسيط النتيجة بعد ذلك.

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

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