علوم وفضاء

polyval2d: هل محور النموذج هو المحور الأول؟

محور النموذج بعد الدرجتين.
تغيرت قيم النموذجين مع بقاء شكل الخرج.

شكل المعاملات وحده لا يحدد أي طبقة تمثل النموذج.

درجة المتغير أم رقم النموذج؟

تخصص polyval2d المحورين الأولين لدرجتي x وy، وما بعدهما لمجموعات المعاملات. [1]

المعامل c[i,j,m] يضرب x**i*y**j في مجموعة المعاملات m. [1]

نختار نموذجين ثنائيّي المتغير: p0=3+2x+5y+xy، وp1=-1+4x-y+2xy. البيانات مؤلفة بلا وحدة، وليست ملاءمة لمشاهدات أو نتائج تدريب.

التنظيم الذي بدأنا به هو M[m,i,j]: نضع مصفوفة معاملات كل نموذج في طبقة. طبقة p0 هي [[3,5],[2,1]]، وطبقة p1 هي [[-1,-1],[4,2]]. علينا تكييف هذا التنظيم قبل تقييم المجموعتين معًا.

الشكل صحيح والمعنى مختلف

على NumPy 2.3.5 وCPython 3.12.14، خزّنا نموذجين في طبقتين من float64 بالشكل (2,2,2). التعويض المباشر أعطى [[-10,29.5],[-2.375,16.875]].

اخترنا نقطتين مقترنتين: (7/4,-5/4) و(11/4,9/4). القائمتان x وy بطول اثنين؛ لا نطلب جميع التركيبات بينهما ولا ننشئ شبكة ديكارتية.

بدون التكييف، تُقرأ الأعداد في طبقات مختلفة عن تقسيمنا الأصلي. في المثال يصبح كثير الحدود الأول 3-x+2y+4xy، والثاني 5-x+y+2xy. عند النقطة الأولى يعطيان -10 و-19/8، بدل -31/16 و23/8 للنموذجين المقصودين.

import numpy as np from numpy.polynomial import polynomial as P M=np.array([[[3,5],[2,1]],[[-1,-1],[4,2]]],dtype=np.float64) x=np.array([1.75,2.75]) y=np.array([-1.25,2.25]) wrong=P.polyval2d(x,y,M)

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

انقل الطبقة ثم افحص التعويض

نقل محور الطبقات إلى النهاية أعطى [[-1.9375,25.9375],[2.875,20.125]]؛ وافقت هذه القيم التعويض المستقل في النموذجين المقصودين، مع بقاء الشكل (2,2).

moveaxis تنقل المحور المحدد إلى موضع جديد، وتحفظ ترتيب المحاور الأخرى. [2]

C=np.moveaxis(M,0,-1) good=P.polyval2d(x,y,C) first=P.polyval2d(x,y,M[0]) second=P.polyval2d(x,y,M[1])

في مثالنا، العلاقة C[i,j,m]=M[m,i,j]. الشكل بقي (2,2,2) لأن أطوال المحاور متساوية، لكن الخانة C[0,0,1] أصبحت -1؛ كانت M[0,0,1] تساوي 5 وتخص معامل y في النموذج الأول.

نحسب p0 عند النقطة الأولى: 3+2(7/4)+5(-5/4)+(7/4)(-5/4)=-31/16=-1.9375. وفي p1: -1+4(7/4)-(-5/4)+2(7/4)(-5/4)=23/8=2.875.

عند النقطة الثانية كانت القيمتان 415/16=25.9375 و161/8=20.125. التعويض المنفصل بكل طبقة أعاد الصفين نفسيهما في التشغيل. هذه مقارنة للقيم ومعاني المعاملات، وليست الاكتفاء بأن عدد العناصر أربعة.

معاملات متساوية تخفي الفرق.
اتفق التخطيطان في التحكم بمعاملات موحدة.

تحكم يخفي الفرق وحدود الفحص

تحكم مستقل بمعاملات كلها 5/4 أعطى [[-0.859375,15.234375],[-0.859375,15.234375]] في التخطيطين؛ أخفى هذا التحكم اختلاف المحاور.

اجتازت 258 حالة مؤلفة المقارنة بمرجع كسري: 1290 نداءً مسمى و5160 قيمة ناتجة. اتفق خرجا التخطيطين في 17 حالة واختلفا في 241؛ أكبر فرق مع المرجع صفر ضمن سماحية 1e-12.

في التحكم، كل معامل يساوي 5/4، فلا يغير تبديل مواضعه قائمة الأعداد. كلا النموذجين المقصودين يصبح (5/4)(1+x)(1+y)؛ عند النقطتين نحصل على -55/64 و975/64، وهما القيمتان المسجلتان.

بنى المرجع مستقلًا مجموع M[m,i,j]*x**i*y**j بكسور Fraction، ومجموع M[i,j,m]*x**i*y**j للقراءة غير المكيّفة. كما بنى C بعلاقة الفهارس مباشرة، دون moveaxis أو مقيّم من NumPy لتوليد المتوقع.

لكل معامل من معاملات التنسور الثمانية اختياران: -1 أو 2. عدد التنسورات 2**8=256؛ أضفنا المثال والتحكم بمعاملاتهما خارج هذه الشبكة، فصار العدد 258. ثبتنا النقطتين والنوع والشكل.

لكل حالة خمسة نداءات مسماة: تقييم غير مكيّف، وmoveaxis، وتقييم مكيّف، وتقييمان منفصلان للطبقتين. القيم الناتجة 4+8+4+2+2=20 للحالة؛ حاصل الضرب يعطي 1290 نداءً و5160 قيمة. لم نعد إنشاء المصفوفات والعمليات المساعدة ضمن هذه النداءات.

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

لم نختبر درجات أعلى أو عددًا آخر للنماذج والنقاط أو محاور إضافية أو معاملات تقريبية وغير منتهية أو نوعًا آخر. ولم نفحص الكتابة ومشاركة التخزين أو الأداء والتكييف العام. الصفر المرصود في فروق هذه الشبكة لا يثبت دقة عامة للمكتبة.

التخطيطالصف الأولالصف الثاني
M: النموذج أولًا-10 ; 29.5-2.375 ; 16.875
C: النموذج أخيرًا-1.9375 ; 25.93752.875 ; 20.125

للتوسع: الحدود والمعاملات.

المراجع

  1. NumPy polyval2d
  2. NumPy moveaxis

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