نمرر معاملات مؤلفة إلى واجهتين تحملان اسم polyval، ثم نقلب ترتيبها في إحداهما. نحسب قيمة كل ترتيب بقوى صحيحة مستقلة، ونحفظ مسار الدالة مع النتيجة.
الاسم الكامل يحدد قراءة القائمة
تقرأ numpy.polyval المعاملات من أعلى درجة إلى الثابت؛ تقرؤها numpy.polynomial.polynomial.polyval من الثابت إلى الأعلى. [1] [2]
في نداءات تجربتنا كتبنا np.polyval(p,x)، واستوردنا from numpy.polynomial import polynomial as P ثم كتبنا P.polyval(x,p). سجلنا ترتيب الوسيطين مع كل قيمة مشاهدة.
قبل نقل قائمة معاملات، نثبت الدالة التي أنشأت القراءة المقصودة. لا نستنتج المعنى من طول القائمة أو من الاسم الأخير polyval وحده.
سنغير ترتيب القائمة في نداء واحد مع تثبيت النقطة. هذه تجربة لمعنى المعاملات، ولا نضيف تحويل إحداثي أو عملية ملاءمة إلى المقارنة.
قائمة واحدة وحسابان مستقلان
شغّلنا NumPy 2.3.5 على CPython 3.12.14. كتبنا p=np.array([3,-1,2],dtype=np.int64) وx=np.int64(2). الأعداد مؤلفة وليست معاملات استخرجناها من مثال وثائقي.
للقراءة التنازلية كتبنا كثير الحدود 3*x**2-x+2. عند x=2 يصبح 3*4-2+2=12. أعاد النداء np.polyval(p,x) العدد 12، بنوع int64 وبالشكل ().
للقراءة التصاعدية كتبنا 3-x+2*x**2. عند النقطة نفسها يصبح 3-2+2*4=9. أعاد P.polyval(x,p) العدد 9.0، بنوع float64 وبالشكل ().
القائمة لم تتغير، لكن 3 انتقل في المعنى من معامل الحد التربيعي إلى الثابت، و2 انتقل من الثابت إلى معامل الحد التربيعي. بقي -1 معامل الحد الخطي في قراءتينا.
الفرق 12-9=3 في المثال لا يمثل خطأ تقريب استنتجناه من نوع العدد. حسبنا معنيين مختلفين للقائمة قبل مقارنة القيمتين. اختلاف float64 وint64 مسجل لهذا التشغيل، وليس وعدًا لكل مدخل.
قلب المعاملات دون تغيير النقطة
طلبنا P.polyval(x,p[::-1]). القائمة المقروءة هنا [2,-1,3]؛ المعنى التصاعدي 2-x+3*x**2. عند x=2 نحسب 2-2+3*4=12.
أعاد هذا النداء 12.0 من float64 وبالشكل (). اتفقت القيمة العددية مع 12 من الواجهة الأولى في مثالنا، مع بقاء النوع المسجل مختلفًا.
لم نعكس النقطة أو نبدل علامة معامل. قلبنا مواقع القائمة لنعيد توزيع الأعداد على القوى. لذلك نكتب النداء كاملًا في البطاقة بدل نسبة 12 إلى كلمة polyval وحدها.
في كل حالة من حالاتنا حفظنا بايتات مصفوفة المعاملات قبل النداءات الثلاثة وبعدها، ومر فحص بقائها كما كانت. استعمال الشريحة المعكوسة في النداء الثالث لا يعني أننا سجلنا تعديل الأصل في التجربة.
ليس اختلاف ترتيب القراءة ضمانًا أن كل قائمة تعطي قيمتين مختلفتين في كل نقطة. حين تتطابق القيم، تبقى معادلة كل قراءة وطريقة توزيع المعاملات هما مرجع تفسير النتيجة.

شبكة القوى وحدود المقارنة
أنشأ مرجع Python للقائمة ذات الطول n مجموع c[i]*x**(n-1-i) للقراءة التنازلية ومجموع c[i]*x**i للتصاعدية. استعملنا أعداد Python الصحيحة وقواها؛ لم نستدع مقيّم كثير حدود من NumPy لإنتاج المتوقع.
استعملنا أطوالًا من واحد إلى أربعة، ولكل معامل أحد الأعداد -2 و0 و3. عدد القوائم 3+9+27+81=120. لكل قائمة خمس نقاط -3 و-1 و0 و2 و4، فصار عدد حالات الشبكة 120*5=600.
أضفنا مثال [3,-1,2] عند 2. يتضمن -1 خارج اختيارات معاملات الشبكة؛ لذلك هو حالة إضافية، والإجمالي 601 حالة.
لكل حالة ثلاث مجموعات: نداء np.polyval أمام المجموع التنازلي؛ نداء P.polyval بالقائمة نفسها أمام المجموع التصاعدي؛ ونداء P.polyval بالقائمة المعكوسة أمام المجموع التنازلي. حفظنا أيضًا الشكل والنوع وفحص بايتات المعاملات في الاختبار.
مرت 601*3=1803 مجموعة. استدعينا دالة NumPy مرة واحدة لكل مجموعة، فكان إجمالي النداءات 1803. لم ندخل عمليات المرجع الصحيحة في عدد نداءات المكتبة.
النطاق معاملات int64 غير فارغة بطول واحد إلى أربعة، ونقطة int64 منفردة، وقيم صغيرة في الشبكة المحددة. المقارنة العددية هنا مع نتائج صحيحة يمكن تمثيلها في التجربة؛ لا نحولها إلى تعميم عن دقة القيم الكبيرة.
لم نفحص Polynomial.fit أو domain أو window أو poly1d، أو tensor أو مصفوفة نقاط أو معاملات مركبة أو غير منتهية، أو قائمة فارغة أو جذور أو مشتقات أو قسمة أو قص معاملات. لم نقس الأداء ولم نشغّل إصدارًا أقدم.
عند نقل الحساب، احفظ المسار الكامل وترتيب الوسيطين وترتيب المعاملات والنقطة. بعدها افصل اتفاق القيمة عن اتفاق النوع العددي؛ بطاقة مثالنا تحفظ الأمرين بدل اختزالهما إلى نتيجة واحدة.
| النداء | القيمة | النوع والشكل |
|---|---|---|
| np.polyval(p,x) | 12 | int64 / () |
| P.polyval(x,p) | 9.0 | float64 / () |
| P.polyval(x,p[::-1]) | 12.0 | float64 / () |
للتوسع: حدود كثير الحدود ومعاملاته.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
