Tren harga yang naik, kurva pembelajaran mesin, atau interpolasi titik pengukuran sering dimodelkan sebagai polinomial — fungsi berupa penjumlahan suku berpangkat, misalnya 2 - x + 0.5x². NumPy modern menyediakan kelas numpy.polynomial.Polynomial untuk menyimpan koefisien, mengevaluasi fungsi pada banyak titik sekaligus, mencari akar, dan menyesuaikan (fit) kurva terhadap data.

Modul numpy.polynomial juga berisi kelas turunan lain (Chebyshev, Legendre, dan seterusnya) yang antarmukanya seragam. Bab ini berfokus pada Polynomial karena paling sering dipakai, dengan satu catatan penting soal urutan koefisien yang berbeda dari API lama.

Kelas Polynomial dan Urutan Koefisien #

Objek Polynomial dibuat dari array koefisien yang diurutkan dari pangkat terendah ke tertinggi. Objek tersebut kemudian bisa dipanggil seperti fungsi, baik pada satu angka maupun pada array titik:

python
import numpy as np
from numpy.polynomial import Polynomial

p = Polynomial([2.0, -1.0, 0.5])
print(p)
print(p.coef)
print(p(3.0))
print(p(np.array([0.0, 1.0, 2.0])))

Output yang Dihasilkan:

text
2.0 - 1.0·x + 0.5·x²
[ 2.  -1.   0.5]
3.5
[2.  1.5 2. ]

Mari kita bedah:

  1. Baris 4 (Polynomial([2.0, -1.0, 0.5])): koefisien dibaca 2 + (-1)x + 0.5x² — elemen pertama adalah konstanta (pangkat nol).
  2. Baris 5 (print(p)): repr kelas menampilkan polinomial dalam notasi matematis, lengkap dengan tanda dan pangkat.
  3. Baris 6 (p.coef): atribut coef mengembalikan array koefisien mentah dalam urutan yang sama dengan input.
  4. Baris 7 (p(3.0)): evaluasi 2 - 3 + 0.5 x 9 menghasilkan 3.5.
  5. Baris 8: memanggil dengan array mengevaluasi seluruh titik sekaligus — p(0) = 2, p(1) = 1.5, p(2) = 2.

Akar dan Pangkat #

Method roots() menghitung semua nilai x yang membuat polinomial bernilai nol, dan operator ** memangkatkan polinomial. Fungsi pendamping polypow menerima array koefisien mentah:

python
import numpy as np
from numpy.polynomial import Polynomial
from numpy.polynomial import polynomial as P

q = Polynomial([-12.0, 4.0, 1.0])
print(q.roots())
r = Polynomial([1.0, 1.0])
print(r**2)
print(P.polypow([1.0, 1.0], 2))

Output yang Dihasilkan:

text
[-6.  2.]
1.0 + 2.0·x + 1.0·x²
[1. 2. 1.]

Penjelasan tiap bagian:

  1. Baris 6 (q.roots()): akar dari x² + 4x - 12 adalah x = -6 dan x = 2; kedua nilai memang membuat q bernilai nol. Jika akarnya kompleks, NumPy mengembalikan array complex.
  2. Baris 8 (r**2): kuadrat dari 1 + x dihitung sebagai polinomial baru, 1 + 2x + x², tetap berbentuk objek Polynomial.
  3. Baris 9 (P.polypow(...)): fungsi level modul menerima array koefisien dan mengembalikan array koefisien hasil — [1. 2. 1.]. Pola fungsi seperti polymul dan polyval dari modul numpy.polynomial.polynomial bekerja dengan cara yang sama.

Menyesuaikan Kurva dengan fit #

Method fit(x, y, deg) mencari koefisien polinomial berderajat deg yang paling mendekati pasangan titik data. Contoh berikut menyesuaikan garis lurus terhadap empat titik pengukuran harga:

python
import numpy as np
from numpy.polynomial import Polynomial

x = np.array([0.0, 1.0, 2.0, 3.0])
y = np.array([1.0, 3.0, 5.0, 7.0])
f = Polynomial.fit(x, y, deg=1)
print(f)
print(f.convert())

Output yang Dihasilkan:

text
4.0 + 3.0·(-1.0 + 0.66666667x)
1.0 + 2.0·x

Bedah baris demi baris:

  1. Baris 5-6: titik data mengikuti pola y = 1 + 2x; kita akan melihat apakah fit menemukan pola itu.
  2. Baris 7 (Polynomial.fit(x, y, deg=1)): fit memetakan x ke rentang internal [-1, 1] lebih dulu agar perhitungan stabil secara numerik. Karena itu repr hasilnya berbentuk 4.0 + 3.0·(-1.0 + 0.66666667x) — koefisien atas variabel hasil pemetaan, bukan atas x asli.
  3. Baris 8 (f.convert()): method convert() menerjemahkan hasil ke koefisien atas x asli: 1.0 + 2.0·x. Data titik-titik tersebut memang mengikuti y = 1 + 2x.

Peringatan tentang np.poly1d (Legacy) #

Sebelum numpy.polynomial, NumPy menyediakan np.poly1d yang masih ada di NumPy 2.x tetapi tergolong API legacy. Perbedaan paling berbahaya ada di urutan koefisien — np.poly1d membaca koefisien dari pangkat tertinggi ke terendah, kebalikan dari Polynomial:

python
import numpy as np

lp = np.poly1d([0.5, -1.0, 2.0])
print(lp)
print(lp(3.0))

Output yang Dihasilkan:

text
     2
0.5 x - 1 x + 2
3.5

Penjelasannya:

  1. Baris 3 (np.poly1d([0.5, -1.0, 2.0])): elemen pertama 0.5 menjadi koefisien x² — input yang sama dengan p di bagian awal bab, tetapi dibaca terbalik.
  2. Baris 4 (print(lp)): repr legacy menampilkan tabel pangkat di atas koefisien.
  3. Baris 5 (lp(3.0)): hasilnya 3.5 — kebetulan sama dengan p(3.0) karena polinomial ini simetris terhadap penukaran urutannya; untuk kebanyakan kasus nilai itu akan berbeda.
Aspeknumpy.polynomial.Polynomialnp.poly1d (legacy)
Urutan koefisienpangkat terendah dulupangkat tertinggi dulu
StatusAPI modern yang disarankanmasih ada, tidak dikembangkan
Keluarga kelasChebyshev, Legendre, dll.hanya satu kelas
Operasimethod kelas (fit, roots, convert)fungsi modul terpisah