6.16. المنحنيات والتكامل¶
غطّت صفحات الرياضيات العمليات التي تأخذ مصفوفة وتُنتج مصفوفة (أو قيمة عددية) -- العمليات الحسابية وعمليات الاختزال والبث. أما هذه الصفحة فتغطي صنفًا مختلفًا من العمليات: تلك التي تعامل المصفوفة بوصفها دالة مأخوذة عيناتها وتطرح أسئلة حول الدالة نفسها. الاستيفاء بين العينات، وملاءمة منحنى لها، والتكامل تحتها، والالتفاف معها مع مخزن مؤقت آخر.
تقبل جميع هذه العمليات مدخلات ndarray وتُرجع إما قيمة عشرية عددية أو ndarray عشرية.
6.16.1. الاستيفاء¶
تجري interp() استيفاءً خطيًا أحادي البُعد. حيث xp مصفوفة أحادية البُعد متزايدة بشكل رتيب من القيم المستقلة؛ و fp هي القيم التابعة المطابقة؛ و x هو الموضع الذي يُقيَّم عنده المُستوفي:
xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x = np.array([0.5, 1.5, 2.5])
np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])
خارج المدى [xp[0], xp[-1]] تُقصّ النتيجة إلى fp[0] و fp[-1] على التوالي؛ وتتجاوز الكلمتان المفتاحيتان left= و right= تلك النقطتين الطرفيتين.
تُستخدم على الكاميرا لإعادة ربط جدول معايرة بمواضع عينات عشوائية -- جدول من درجة الحرارة إلى الجهد من مقاومة حرارية، أو منحنى استجابة بكسل غير خطي، أو بحث غاما لكل قناة. استدعاء واحد للمكتبة، وتمريرة واحدة على المدخلات، دون حلقة Python.
6.16.2. ملاءمة كثيرات الحدود وتقييمها¶
تلائم polyfit() كثيرة حدود من الدرجة deg لنقاط البيانات (x, y) بطريقة المربعات الصغرى وتُرجع المعاملات (الدرجة الأعلى أولًا):
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])
coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0]) (approximately)
عند حذف x، تُستخدم range(len(y)) -- وهو مفيد لملاءمة كثيرة حدود سريعة لمخزن مؤقت تؤخذ عيناته بانتظام دون محور x مرتبط:
np.polyfit(y, 2)
تُقيّم polyval() كثيرة الحدود التي معاملاتها p عند x. ويمكن أن يكون المدخل x قيمة عددية (يُرجع عددًا عشريًا) أو ndarray (يُرجع ndarray):
p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)
الاقتران الطبيعي هو استدعاء polyfit مرة واحدة وقت المعايرة وتخزين المعاملات، ثم استدعاء polyval لتقييم المنحنى الناتج في كل إطار. وخطوة تقييم كثيرة الحدود هي حفنة من العمليات العشرية لكل عينة، وهي زهيدة حتى على أصغر الكاميرات.
6.16.3. الالتفاف¶
تُرجع convolve() الالتفاف الخطي المنفصل كامل الطول لمصفوفتين أحاديتي البُعد. والوضع full فقط هو المُنفَّذ؛ وطول المخرجات هو len(a) + len(v) - 1. اقتطع النتيجة للحصول على التأثير نفسه للوضعين same و valid اللذين يوفرهما numpy على سطح المكتب:
a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])
np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])
مفيدة لمرشحات FIR القصيرة ونوى التنعيم (الصندوقية والمثلثية والغاوسية) حيث يكون إعداد سلسلة SOS مبالغًا فيه. ويتناسب زمن التشغيل مع حاصل ضرب طولَي المصفوفتين -- وهو جيد للنوى القصيرة ولكنه سرعان ما يصبح أكثر تكلفة من التفاف FFT للنوى الطويلة.
6.16.4. التكامل شبه المنحرف¶
تُكامل trapz() دالة مأخوذة عيناتها بقاعدة شبه المنحرف المركبة:
x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x) # ~ 2.0
مرّر dx= عندما يكون تباعد العينات منتظمًا والخطوة وحدها هي المهمة؛ ومرّر x= عندما لا تكون العينات متباعدة بانتظام. وهو الاستدعاء المناسب لتكامل بيانات مستشعر مُلتقطة مسبقًا حيث لا تتوفر الصيغة التحليلية.
بالنسبة لبيانات العينات التي حُدّ نطاقها الترددي (مخزن صوت مؤقت بعد مرشح مكافحة التعرّج، على سبيل المثال)، تتقارب قاعدة شبه المنحرف بمربع عدد العينات، مما يعني أن مضاعفة طول المخزن المؤقت تقلل الخطأ بمعامل أربعة.
عندما لا يكون المُكامَل مخزنًا مؤقتًا من العينات بل دالة Python يمكن للتطبيق تقييمها عند نقاط عشوائية، فإن عائلة مختلفة من الحلّالات هي الاستدعاء المناسب.