سؤال

أنا أكتب برنامجًا في Python وأحتاج إلى العثور على مشتق وظيفة (وظيفة معبر عنها كسلسلة).

  • علي سبيل المثال: x^2+3*x
  • مشتقها هو: 2*x+3

هل هناك أي نصوص متوفرة ، أم أن هناك شيئًا مفيدًا يمكنك إخباري؟

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

المحلول

sympy هل هذا جيد.

نصائح أخرى

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

  1. تحليل سلسلة الإدخال في قائمة المعاملات إلى x^n
  2. خذ هذه القائمة من المعاملات وحولها إلى قائمة جديدة من المعاملات وفقًا لقواعد استخلاص متعدد الحدود.
  3. خذ قائمة معاملات المشتق وإنشاء سلسلة لطيفة تصف وظيفة متعدد الحدود المشتق.

إذا كنت بحاجة إلى التعامل مع كثير الحدود مثل a*x^15125 + x^2 + c, ، باستخدام dict بالنسبة لقائمة المعاملات قد يكون منطقيًا ، ولكنه يتطلب المزيد من الاهتمام عند القيام بالتكرار من خلال هذه القائمة.

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

يعتمد العمل على زيادة الحمل وسلسلة القاعدة للمشتقات. على سبيل المثال ، مشتق v^n هو n*v^(n-1)dv/dx, ، حق؟ لذا ، إذا كان لديك v=3*x و n=3, ، ماذا سيكون المشتق؟ الجواب: إذا f(x)=(3*x)^3, ، ثم المشتق هو:

f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2

تتيح لك قاعدة السلسلة "سلسلة" العملية: كل مشتق على حدة بسيط ، وأنت مجرد "سلسلة" التعقيد. مثال آخر ، مشتق u*v هو v*du/dx+u*dv/dx, ، حق؟ إذا حصلت على وظيفة معقدة ، فأنت مجرد سلسلة ، على سبيل المثال:

d/dx(x^3*sin(x))
u=x^3; v=sin(x)
du/dx=3*x^2; dv/dx=cos(x)
d/dx=v*du+u*dv

كما ترون ، التمايز هو مجرد سلسلة من العمليات البسيطة.

الآن ، الزائد المشغل.

إذا تمكنت من كتابة محلل (جرب pyparsing) ، فيمكنك طلبه لتقييم كل من الوظيفة والمشتق! لقد فعلت هذا (باستخدام Flex/Bison) للمتعة فقط ، وهو قوي جدًا. لكي تحصل على هذه الفكرة ، يتم حساب المشتق بشكل متكرر عن طريق الزائد للمشغل المقابل ، وتطبيق قاعدة السلسلة بشكل متكرر ، وبالتالي فإن تقييم "*" سوف تتوافق مع u*v لقيمة الوظيفة و u*der(v)+v*der(u) بالنسبة للقيمة المشتقة (جربها في C ++ ، إنها أيضًا ممتعة).

إذن هناك ، أعلم أنك لا تعني كتابة المحلل الخاص بك - بكل الوسائل ، استخدم التعليمات البرمجية الحالية (تفضل بزيارة www.autodiff.org للحصول على تمايز تلقائي لرمز Fortran و C/C ++). لكن من المثير للاهتمام دائمًا معرفة كيفية عمل هذه الأشياء.

هتافات،

خوان

التمايز الرمزي هي مقدمة مثيرة للإعجاب للموضوع-على الأقل بالنسبة لغير المخصص مثلي :) يتم كتابة الكود في C ++ راجع للشغل.

ابحث عن التمايز التلقائي. هناك أدوات Python. ايضا، هذه.

أن تأتي متأخرا أفضل من ألا تأتي أبدا؟

لقد قمت دائمًا بتمايز رمزي في أي لغة من خلال العمل مع شجرة تحليل. لكنني أيضًا أدركت مؤخرًا طريقة أخرى باستخدامها ارقام مركبة.

يتكون نهج Parse Tree من ترجمة رمز LISP الصغير التالي إلى أي لغة تريدها:

(defun diff (s x)(cond
  ((eq s x) 1)
  ((atom s) 0)
  ((or (eq (car s) '+)(eq (car s) '-))(list (car s)
    (diff (cadr s) x)
    (diff (caddr s) x)
    ))
  ; ... and so on for multiplication, division, and basic functions
  ))

ومتابعته بتبسيط مناسب ، حتى تتخلص من الإضافات من 0 ، وضرب 1 ، إلخ.

لكن الطريقة المعقدة ، رغم أنها رقمية تمامًا ، لها جودة سحرية معينة. بدلاً من برمجة الحساب الخاص بك في الدقة المزدوجة ، قم بذلك في مجمع دقة مزدوجة. ثم ، إذا كنت بحاجة إلى مشتق الحساب فيما يتعلق بالمتغير x ، فقم بتعيين الجزء الخيالي من x على عدد صغير جدًا h ، مثل 1e-100. ثم قم بالحساب والحصول على النتيجة R. الآن (R) هي النتيجة التي ستحصل عليها عادةً ، وتصور (R)/H = DF/DX إلى دقة عالية جدًا!

كيف يعمل؟ خذ حالة ضرب الأرقام المعقدة:

(a+bi)(c+di) = ac + i(ad+bc) - bd

لنفترض الآن أن الأجزاء الخيالية كلها صفرية ، إلا أننا نريد المشتق فيما يتعلق بـ a. وضعنا b إلى عدد صغير جدا h. الآن ماذا نحصل؟

(a+hi)(c) = ac + hci

لذلك الجزء الحقيقي من هذا هو ac, ، كما تتوقع ، والجزء الخيالي ، مقسومًا h, ، هو c, وهو مشتق ac بالنسبة إلى a.

يبدو أن نفس النوع من التفكير ينطبق على جميع قواعد التمايز.

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

يمكنك محاولة إنشاء فئة تمثل حد بدقة ثم تقييمه لـ (F (x) -f (a))/(xa) مع اقتراب x. يجب أن تعطي قيمة دقيقة للغاية للحد.

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

استنباط من تلقاء نفسها مهمة سهلة ، لأنها ميكانيكية ويمكن القيام بها خوارزمية ولكن تحتاج إلى بنية أساسية لتخزين وظيفة.

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