Matematika simbolik

Mengerjakan aljabar analitis dengan syms, diff, dan solve dari Symbolic Math Toolbox.

Daftar isi

Topik ini membahas matematika simbolik di MATLAB, yaitu mode perhitungan yang memanipulasi bentuk aljabar secara eksak alih-alih menghasilkan nilai numerik yang terbulatkan. Pembaca akan mendeklarasikan variabel simbolik dengan syms, menurunkan dan mengintegralkan bentuk dengan diff dan int, serta menyelesaikan persamaan dengan solve. Bentuk dirapikan dengan simplify dan expand, lalu hasil simbolik dijembatani kembali ke numerik melalui subs, double, dan matlabFunction. Seluruh kemampuan tersebut berasal dari Symbolic Math Toolbox pada MATLAB, sedangkan GNU Octave menyediakan padanannya melalui paket symbolic yang berbasis pustaka SymPy.

Bentuk simbolik dan bentuk numerik#

Perhitungan numerik menyimpan hasil sebagai bilangan pecahan presisi ganda bertipe double. Representasi tersebut terbatas, sehingga pecahan seperti 1/3 hanya dapat dinyatakan secara hampiran dan kesalahan pembulatan dapat menyebar pada perhitungan yang panjang. Matematika simbolik menghindari pembulatan itu dengan menyimpan bentuk aljabar itu sendiri sebagai objek bertipe sym. Objek sym menampung variabel, pecahan rasional, akar, dan pangkat dalam bentuk eksak. Bentuk tersebut baru dihitung menjadi angka ketika konversi diminta.

Variabel simbolik dibuat dengan perintah syms. Kata kunci real pada deklarasi menandakan variabel bernilai riil, sehingga penyederhanaan dapat memanfaatkan sifat tersebut, misalnya akar kuadrat dari x2x^2 dirapikan menjadi nilai mutlak xx. Contoh berikut mendeklarasikan x sebagai variabel simbolik riil, membentuk sebuah ekspresi linier, lalu membandingkan tipenya dengan variabel numerik biasa.

matlab Contoh: mendeklarasikan variabel simbolik dan memeriksa tipenya
pkg load symbolic;
sympref quiet on;
syms x real
f = 2*x + 3
class(f)
angka = 0.5
class(angka)
text Keluaran
f = (sym) 2⋅x + 3
ans = sym
angka = 0.5000
ans = double

Fungsi class melaporkan f bertipe sym sedangkan angka bertipe double. Penanda (sym) pada gema keluaran menandai nilai simbolik, dan perkalian ditampilkan sebagai ⋅. Perbedaan tipe terasa paling langsung pada pecahan. Bentuk simbolik menjumlahkan x/2+x/3x/2 + x/3 menjadi 5x/65x/6 tanpa pembulatan, sedangkan penjumlahan numerik 1/2+1/31/2 + 1/3 langsung menghasilkan desimal hampiran.

matlab Contoh: pecahan eksak pada bentuk simbolik dan numerik
pkg load symbolic;
sympref quiet on;
syms x real
hasil_simbolik = x/2 + x/3
hasil_numerik = 1/2 + 1/3
text Keluaran
hasil_simbolik = (sym)

  5⋅x
  ───
   6

hasil_numerik = 0.8333

Hasil simbolik tampil sebagai pecahan 5⋅x/6 dalam tata letak unicode milik Octave, sedangkan hasil numerik tampil 0.8333 karena format tampilan bawaan membatasi jumlah angka penting. Nilai yang tersimpan di hasil_simbolik tetap eksak dan siap dipakai pada penurunan rumus, sedangkan nilai di hasil_numerik sudah membawa pembulatan sejak awal.

Turunan dan integral eksak#

Fungsi diff menghitung turunan analitis dari sebuah bentuk simbolik, sedangkan int menghitung integral tentu maupun tak tentu. Keduanya menerapkan aturan kalkulus langsung pada bentuknya, bukan mendekati lewat beda hingga. Integral tentu dikerjakan dengan memberikan batas sebagai dua argumen terakhir, dan hasilnya diberikan dalam bentuk eksak seperti berikut.

∫02(x2+x)dx=143 \int_0^2 \left(x^2 + x\right) dx = \frac{14}{3}
matlab Contoh: turunan dan integral tentu secara eksak
pkg load symbolic;
sympref quiet on;
syms x real
f = x^2 + x;
turunan = diff(f, x)
integral = int(f, x, 0, 2)
text Keluaran
turunan = (sym) 2⋅x + 1
integral = (sym) 14/3

Turunan 2x+12x + 1 dan nilai integral 14/314/3 keluar tanpa desimal. Perhitungan numerik pada tipe double hanya mampu menyimpan hampiran dari 14/314/3, sedangkan bentuk simbolik mempertahankan pecahan rasionalnya sampai konversi ke angka diminta. Sifat eksak inilah alasan utama matematika simbolik dipakai untuk menurunkan rumus: hasil antara bebas kesalahan pembulatan, sehingga rumus akhir benar secara analitis dan tinggal dikonversi sekali di ujung.

Menyelesaikan persamaan dengan solve#

Fungsi solve mencari akar persamaan secara analitis. Persamaan ditulis sebagai bentuk simbolik, dan operator == dipakai untuk menyatakan kesamaan karena satu tanda = berarti penugasan. Untuk polinomial, solve mengembalikan seluruh akarnya sebagai vektor kolom bertipe sym, bukan sebagai daftar angka numerik.

Sistem persamaan diselesaikan dengan memberikan daftar persamaan dan daftar variabel. Keluarannya berupa struct yang memuat satu medan untuk tiap variabel, sehingga nilainya diakses lewat medan bersangkutan. Contoh berikut menyelesaikan satu persamaan kuadrat dan satu sistem dua variabel.

matlab Contoh: akar persamaan dan sistem persamaan linear
pkg load symbolic;
sympref quiet on;
syms x real
akar = solve(x^2 - 5*x + 6, x)
syms a b real
sistem = solve([2*a + b == 8, a - b == 1], [a b]);
nilai_a = sistem.a
nilai_b = sistem.b
text Keluaran
akar = (sym 2×1 matrix)

  ⎡2⎤
  ⎢ ⎥
  ⎣3⎦

nilai_a = (sym) 3
nilai_b = (sym) 2

Akar dari x2−5x+6x^2 - 5x + 6 keluar sebagai matriks kolom berukuran 2×1 yang memuat 2 dan 3, sesuai faktorisasi (x−2)(x−3)(x-2)(x-3). Sistem 2a+b=82a + b = 8 dan a−b=1a - b = 1 memberikan a=3a = 3 serta b=2b = 2 lewat medan struct. Bentuk tanpa == seperti x^2 - 5*x + 6 juga diterima oleh solve karena ditafsirkan sebagai persamaan yang sama dengan nol. Kebiasaan menulis == tetap menjaga makna konsisten ketika ruas kanan bukan nol.

Menyederhanakan bentuk dan mengatur presisi#

Fungsi simplify merapikan bentuk simbolik dengan menerapkan aturan aljabar dan identitas sampai diperoleh bentuk paling sederhana yang dapat ditemukannya. Fungsi expand bekerja ke arah sebaliknya, yaitu mengalikan tanda kurung dan menjumlahkan suku sejenis sehingga polinomial tampil dalam bentuk terbuka. Keduanya berguna untuk membandingkan dua bentuk yang tampak berbeda tetapi sebenarnya sama.

matlab Contoh: menyederhanakan dan mengembangkan bentuk
pkg load symbolic;
sympref quiet on;
syms x real
identitas = simplify(sin(x)^2 + cos(x)^2)
bentang = expand((x + 1)*(x + 2))
text Keluaran
identitas = (sym) 1
bentang = (sym)

   2
  x  + 3⋅x + 2

Identitas trigonometri sin⁡2x+cos⁡2x\sin^2 x + \cos^2 x runtuh menjadi 1. Hasil kali (x+1)(x+2)(x + 1)(x + 2) terbuka menjadi x2+3x+2x^2 + 3x + 2. Penyederhanaan semacam ini menjadi pemeriksa silang yang murah bagi hasil turunan panjang dari diff: bentuk dirapikan lebih dahulu dengan simplify, baru disubstitusi atau dibandingkan dengan hasil numerik.

Aritmetika presisi variabel menyediakan lebih banyak angka penting daripada muatan tipe double. Fungsi vpa menghitung nilai hampiran dengan jumlah digit yang diminta, misalnya vpa(pi, 30) menghasilkan tiga puluh digit konstanta pi. Hasilnya tetap bertipe sym, bukan double, sehingga konversi eksplisit tetap diperlukan sebelum dipakai pada perhitungan numerik.

matlab Contoh: presisi arbitrer dengan vpa
pkg load symbolic;
sympref quiet on;
hampiran = vpa(pi, 30)
kembali = double(hampiran)
text Keluaran
hampiran = (sym) 3.14159265358979323846264338328
kembali = 3.1416

Keluaran memperlihatkan tiga puluh digit pi, lalu double mengubahnya kembali menjadi nilai presisi ganda yang tampil lima angka penting pada format bawaan. Presisi tinggi hanya berguna selama perhitungan masih berlangsung di ranah simbolik, karena angka yang keluar dari ranah itu selalu terpotong oleh muatan double.

Jembatan dari simbolik ke numerik#

Hasil simbolik akhirnya perlu diubah menjadi angka ketika laporan, plot, atau perhitungan lanjutan menuntut nilai numerik. Fungsi subs mengganti variabel simbolik dengan nilai atau bentuk lain, double mengonversi nilai konstan menjadi numerik, dan matlabFunction membungkus bentuk menjadi fungsi anonim yang dapat dipanggil seperti fungsi biasa. Ketiganya membentuk jembatan dari ranah simbolik menuju ranah numerik.

matlab Contoh: substitusi nilai dan konversi ke numerik
pkg load symbolic;
sympref quiet on;
syms x real
f = x^2 + x;
nilai = subs(f, x, 7)
double(nilai)
text Keluaran
nilai = (sym) 56
ans = 56

Substitusi x=7x = 7 pada x2+xx^2 + x memberikan nilai 56 yang masih bertipe sym. Fungsi double kemudian mengubah nilai tersebut menjadi numerik. Nilai substitusi yang berupa angka dihitung secara eksak lebih dahulu, sehingga pecahan tidak sempat kehilangan ketelitian sebelum konversi dilakukan.

matlab Contoh: fungsi anonim dari bentuk simbolik
pkg load symbolic;
sympref quiet on;
syms x real
f = x^2 + x;
fungsi_f = matlabFunction(f);
fungsi_f(7)
class(fungsi_f)
text Keluaran
ans = 56
ans = function_handle

Fungsi matlabFunction menghasilkan fungsi anonim bertipe function_handle dari bentuk simbolik. Evaluasi berulang pada fungsi tersebut berlangsung murni numerik, tanpa menyentuh mesin aljabar. Pola ini cocok untuk kurva hasil derivasi simbolik yang perlu dievaluasi pada banyak titik, misalnya saat menggambar plot.

Rangkaian lengkapnya dirangkum pada berkas berikut, yang menganalisis polinomial p(x)=x2−5x+6p(x) = x^2 - 5x + 6 mulai dari deklarasi variabel sampai nilai numerik di satu titik.

matlab analisis-polinomial.m
pkg load symbolic;
sympref quiet on;
% analisis simbolik polinomial p(x) = x^2 - 5*x + 6
syms x real
p = x^2 - 5*x + 6;
turunan = diff(p, x)
akar = solve(p, x)
nilai_di_4 = double(subs(p, x, 4))
text Keluaran
turunan = (sym) 2⋅x - 5
akar = (sym 2×1 matrix)

  ⎡2⎤
  ⎢ ⎥
  ⎣3⎦

nilai_di_4 = 2

Berkas itu menghitung turunan 2x−52x - 5, akar 2 dan 3, serta nilai numerik p(4)=2p(4) = 2 dalam satu alur. Dua baris pertamanya spesifik Octave, sedangkan seluruh isi analisisnya identik dengan kode yang berjalan pada MATLAB.

Kesalahan umum#

  • Mengindeks ekspresi simbolik seperti fungsi. Penyebabnya adalah kebiasaan menulis f(7) untuk menghitung nilai, padahal f adalah objek sym berukuran 1×1 sehingga angka 7 ditafsirkan sebagai indeks dan eksekusi berakhir dengan error keluar batas. Perbaikannya adalah memakai subs(f, x, 7) atau membungkus bentuk dengan matlabFunction terlebih dahulu.
  • Mencampur hasil simbolik ke perhitungan numerik tanpa konversi. Penyebabnya adalah nilai simbolik yang tampak seperti angka biasa di layar. Kenyataannya, operasi aritmetika campuran otomatis menghasilkan bentuk simbolik, misalnya x + 0.5 menjadi x + 1/2, sehingga tipe sym menjalar diam-diam dan fungsi yang menuntut masukan numerik murni akhirnya gagal. Perbaikannya adalah menutup tiap tahap dengan subs atau double sebelum nilai dipakai di ranah numerik.
  • Lupa memuat paket symbolic pada Octave. Penyebabnya adalah sesi baru yang belum memuat paket, sehingga syms dilaporkan sebagai fungsi yang tidak dikenal. Perbaikannya adalah menjalankan pkg load symbolic; pada awal sesi atau awal skrip, dan memastikan Symbolic Math Toolbox terpasang bila bekerja di MATLAB.

Ringkasan#

  • Objek bertipe sym menyimpan bentuk aljabar eksak, sehingga pecahan, akar, dan hasil diff, int, serta solve bebas pembulatan sampai konversi diminta.
  • Fungsi solve mengembalikan akar polinomial sebagai vektor kolom dan solusi sistem sebagai struct bermedan variabel.
  • Fungsi vpa menyediakan presisi digit arbitrer yang tetap bertipe sym, sedangkan double, subs, dan matlabFunction menjadi jembatan menuju ranah numerik.
  • Jalur simbolik paling tepat dipakai untuk menurunkan rumus, lalu hasilnya dikonversi sekali menjadi fungsi numerik untuk evaluasi berulang.

Referensi#