سؤال

باستخدام سيمبي ، لنفترض أن لدينا تعبيرا و ، وهو متعدد الحدود للرمز " س " (وربما رموز أخرى).

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

كحالة خاصة لدي وظيفة معقدة للغاية ولكن أريد أن تبقي فقط شروط تصل إلى 2 النظام في س.ما هي الطريقة الفعالة للقيام بذلك?

الطريقة الواضحة وغير الفعالة للغاية للقيام بذلك ستكون لكل م أقل من ن ، خذ م المشتقات وتعيين س إلى 0 للحصول على معامل س^م.نحصل على كل معامل بهذه الطريقة ثم نعيد بناء كثير الحدود.لكن أخذ المشتقات ليس هو الشيء الأكثر كفاءة.

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

المحلول

طريقة سهلة للقيام بذلك هي إضافة O(x**n) إلى التعبير ، مثل

In [23]: x + x**2 + x**4 + x**10 + O(x**3)
Out[23]:
     2    ⎛ 3⎞
x + x  + O⎝x ⎠

إذا كنت تريد إزالته لاحقا ، فاستخدم ملف removeO الطريقة

In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO()
Out[24]:
 2
x  + x

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

In [25]: x + sin(x) + O(x**3)
Out[25]:
              ⎛ 3⎞
sin(x) + x + O⎝x ⎠

In [26]: (x + sin(x)).series(x, 0, 3)
Out[26]:
       ⎛ 3⎞
2⋅x + O⎝x ⎠

نصائح أخرى

إذا ألقيت نظرة على مستندات الوحدة متعددة الحدود:

http://docs.sympy.org/latest/modules/polys/reference.html

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

باستخدام .coeffs():

>>> f = 3 * x**3 + 2 * x**2 + x * y + y**3 + 1
>>> order = 2

>>> coeffs = Poly(f, x).coeffs()
>>> f_new = sum(x**n * coeffs[-(n+1)] for n in range(order+1)) # the +1 is to get 0th order
>>> f_new
2*x**2 + x*y + y**3 + 1

بدلا من ذلك ، يمكنك التكرار على العناصر الموجودة في .all_terms():

>>> all_terms = Poly(f, x).all_terms()
>>> sum(x**n * term for (n,), term in all_terms() if n <= order)

هناك الكثير من وظائف التلاعب في الوحدة النمطية التي يجب أن تكون قادرة على العمل مع التعبير مباشرة بدلا من القيام الحسابات/أخذ المشتقات/الخ.

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