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:
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:
2.0 - 1.0·x + 0.5·x²
[ 2. -1. 0.5]
3.5
[2. 1.5 2. ]Mari kita bedah:
- Baris 4 (
Polynomial([2.0, -1.0, 0.5])): koefisien dibaca2 + (-1)x + 0.5x²— elemen pertama adalah konstanta (pangkat nol). - Baris 5 (
print(p)): repr kelas menampilkan polinomial dalam notasi matematis, lengkap dengan tanda dan pangkat. - Baris 6 (
p.coef): atributcoefmengembalikan array koefisien mentah dalam urutan yang sama dengan input. - Baris 7 (
p(3.0)): evaluasi2 - 3 + 0.5 x 9menghasilkan3.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:
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:
[-6. 2.]
1.0 + 2.0·x + 1.0·x²
[1. 2. 1.]Penjelasan tiap bagian:
- Baris 6 (
q.roots()): akar darix² + 4x - 12adalahx = -6danx = 2; kedua nilai memang membuatqbernilai nol. Jika akarnya kompleks, NumPy mengembalikan arraycomplex. - Baris 8 (
r**2): kuadrat dari1 + xdihitung sebagai polinomial baru,1 + 2x + x², tetap berbentuk objekPolynomial. - Baris 9 (
P.polypow(...)): fungsi level modul menerima array koefisien dan mengembalikan array koefisien hasil —[1. 2. 1.]. Pola fungsi sepertipolymuldanpolyvaldari modulnumpy.polynomial.polynomialbekerja 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:
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:
4.0 + 3.0·(-1.0 + 0.66666667x)
1.0 + 2.0·xBedah baris demi baris:
- Baris 5-6: titik data mengikuti pola
y = 1 + 2x; kita akan melihat apakahfitmenemukan pola itu. - Baris 7 (
Polynomial.fit(x, y, deg=1)):fitmemetakanxke rentang internal[-1, 1]lebih dulu agar perhitungan stabil secara numerik. Karena itu repr hasilnya berbentuk4.0 + 3.0·(-1.0 + 0.66666667x)— koefisien atas variabel hasil pemetaan, bukan atasxasli. - Baris 8 (
f.convert()): methodconvert()menerjemahkan hasil ke koefisien atasxasli:1.0 + 2.0·x. Data titik-titik tersebut memang mengikutiy = 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:
import numpy as np
lp = np.poly1d([0.5, -1.0, 2.0])
print(lp)
print(lp(3.0))Output yang Dihasilkan:
2
0.5 x - 1 x + 2
3.5Penjelasannya:
- Baris 3 (
np.poly1d([0.5, -1.0, 2.0])): elemen pertama0.5menjadi koefisienx²— input yang sama denganpdi bagian awal bab, tetapi dibaca terbalik. - Baris 4 (
print(lp)): repr legacy menampilkan tabel pangkat di atas koefisien. - Baris 5 (
lp(3.0)): hasilnya3.5— kebetulan sama denganp(3.0)karena polinomial ini simetris terhadap penukaran urutannya; untuk kebanyakan kasus nilai itu akan berbeda.
| Aspek | numpy.polynomial.Polynomial | np.poly1d (legacy) |
|---|---|---|
| Urutan koefisien | pangkat terendah dulu | pangkat tertinggi dulu |
| Status | API modern yang disarankan | masih ada, tidak dikembangkan |
| Keluarga kelas | Chebyshev, Legendre, dll. | hanya satu kelas |
| Operasi | method kelas (fit, roots, convert) | fungsi modul terpisah |