
Ketika memecahkan masalah pemodelan matematika dari proses dan objek, seringkali sangat praktis untuk menggunakan algoritma Python menggunakan perhitungan simbolik. Berdasarkan perpustakaan SymPy, Python berhasil mengatasi penyelesaian persamaan dan sistem, mengintegrasikan dan membedakan, menghitung batas, memperluas seri dan menjumlahkan seri, menyederhanakan ekspresi, dan mencari solusi untuk persamaan dan sistem diferensial.
Saat menggunakan perhitungan simbolis, pengguna diberi kesempatan untuk mengontrol program selama eksekusi dengan memasukkan fungsi yang valid dengan sejumlah variabel tertentu.
Sebagai guru disiplin "Teknik Komputer dan Pemrograman", dalam modul pemrograman Python, saya memperkenalkan siswa tentang kemungkinan bahasa ini untuk penelitian ilmiah. Perhatian Anda adalah serangkaian artikel di mana Anda dapat membiasakan diri dengan komputasi simbolik dengan Python. Saya ingin segera memperingatkan bahwa artikel-artikel ini tidak mengklaim keunikan absolut, karena mereka dikumpulkan berdasarkan bahan dari berbagai sumber, tujuannya adalah untuk mengajarkan siswa dasar-dasar komputasi simbolik.
Langkah pertama menuju komputasi simbolik adalah mengimpor fungsi modul SymPy menggunakan pip, sistem manajemen paket Python. Jika Anda bisa menangani ini, mari kita lanjutkan untuk mendeklarasikan variabel.
Catatan Untuk mempersingkat catatan, baris berikut ini tidak ditampilkan dalam semua contoh berikut: dari sympy import *Deklarasi eksplisit variabel karakter
Untuk perhitungan simbolik menggunakan modul
SymPy, variabel dan fungsi simbol harus dinyatakan seperti itu. Dalam program komputasi matematis seperti Mathematica atau Maple, variabel segera dianggap simbolis. Dengan Python, mereka harus dinyatakan secara simbolis, dan ini dapat dilakukan dengan beberapa cara. Cara termudah adalah dengan menggunakan fungsi
simbol () atau
var () . Fungsi pertama mengembalikan referensi ke objek karakter sebagai variabel. Yang kedua, tanpa tugas, membuat variabel karakter.
Contoh kode>>> x,y,a,b = symbols('xya b')
Perbedaan utama antara fungsi
simbol () dan
var () adalah bahwa fungsi pertama mengembalikan referensi ke objek simbol. Untuk penggunaan di masa mendatang, itu harus ditugaskan ke variabel apa pun. Yang kedua, tanpa tugas, membuat variabel karakter.
Dalam fungsi simbol () dan var (), Anda dapat mendeklarasikan variabel simbol dengan indeks:
Anda juga dapat menetapkan jenis dan memaksakan pembatasan pada variabel simbol langsung di fungsi simbol () dan var (). Terkadang tanpa batasan seperti itu transformasi yang jelas tidak berfungsi, misalnya, bandingkan:
Contoh kode >>> x = symbols('x', integer=True)
Untuk membuat wadah untuk satu karakter, gunakan argumen
seq = True: >>> symbols('x',seq=True) (x,)
Menentukan Nilai Valid untuk Variabel Karakter:
>>> x, y, z = symbols('x,y,z', real=True) >>> x.is_real and y.is_real and z.is_real True
Fungsi s ()
Terkadang ekspresi karakter dapat diartikan sebagai konstanta numerik Python daripada SymPy. Oleh karena itu, untuk mendeklarasikan variabel simbolik, serta untuk mengubah konstanta numerik menjadi simbolik, gunakan fungsi S (), misalnya, bandingkan:
>>> expr = x**2 + sin(y) + S(10)/2; expr x**2 + sin(y) + 5 >>> type(10) <class 'int'> >>> type(S(10)) # <class 'sympy.core.numbers.Integer'>
Perbedaan antara konstanta Python dan konstanta karakter adalah konstanta karakter dapat dihitung dengan tingkat akurasi tertentu, seperti yang ditunjukkan dalam contoh berikut, dibandingkan dengan fungsi
round () standar:
z=1/7; z
Nama karakter
Jika Anda perlu menggunakan matematika simbolik secara konstan di sesi saat ini, maka Anda dapat mengimpor nama simbolik umum dari modul
sympy.abc :
Contoh kode >>> import sympy.abc >>> dir(sympy.abc) ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_clash', '_clash1', '_clash2', 'a', 'alpha', 'b', 'beta', 'c', 'chi', 'd', 'delta', 'division', 'e', 'epsilon', 'eta', 'exec_', 'f', 'g', 'gamma', 'greeks', 'h', 'i', 'iota', 'j', 'k', 'kappa', 'l', 'lamda', 'm', 'mu', 'n', 'nu', 'o', 'omega', 'omicron', 'p', 'phi', 'pi', 'print_function', 'psi', 'q', 'r', 'rho', 's', 'sigma', 'string', 'symbols', 't', 'tau', 'theta', 'u', 'upsilon', 'v', 'w', 'x', 'xi', 'y', 'z', 'zeta']
Nama variabel dapat dihapus dari namespace dengan perintah
del name1, name2, .. :
>>> type(x) <class 'sympy.core.symbol.Symbol'> >>> del x,y >>> x NameError: name 'x' is not defined
Untuk mengembalikan nilai konstanta standar, serta nama beberapa fungsi, Anda perlu memuat kembali modul sympy.
>>> from sympy import *
Metode subs (...)
Harus diingat bahwa ketika menulis ekspresi simbolis, penyederhanaannya dapat dilakukan secara otomatis, misalnya:
>>> a,b,c,d,x,y,z,u,v,w = symbols('abcdxyzuv w') >>> x - z + 20 -z- 15 + 3*sin(pi/2)+2*z x + 8
Metode
subs (...) digunakan untuk menghitung ekspresi karakter untuk nilai variabel yang diberikan, misalnya:
>>> a, x = symbols('a x') >>> f= a**3*x + 3*a**2*x**2/2 + a*x**3 + x**4/4 >>> f.subs(a,1)
Jika dua argumen digunakan dalam metode subs, mereka ditafsirkan sebagai subs (lama, baru), yaitu pengenal lama diganti dengan yang baru. Argumen ke metode subs () dapat berupa urutan yang harus berisi pasangan (lama, baru), atau bisa juga berupa ekspresi simbolik, misalnya:
>>> a,b,c,d,x,y,z = symbols('abcdxy z') >>> f=a*x**3 +b*y**2 + c*z+d >>> f.subs([(a,1),(b,2),(c,3),(d,4)])
Biarkan kami menarik perhatian Anda pada kekhasan bekerja dengan variabel berikut (variabel simbolis dan biasa dari Python). Jalankan kode berikut:
>>> x='Hello' >>> pr=x+'world' >>> pr 'Helloworld' >>> x='AAA'
Aturan berlaku di sini: jika variabel telah berubah, maka ekspresi yang dibuat sebelumnya yang mengandung variabel ini tidak secara otomatis dihitung ulang. Aturan ini juga berfungsi untuk variabel Python biasa.
Operasi Fraksi
Modul SymPy dapat melakukan perhitungan dengan pecahan dan membawanya ke penyebut umum, misalnya, bandingkan:
>>> S(1)/3+S(2)/5 11/15 >>> 1/3+2/5 0.7333333333333334
Fungsi
Rasional (pembilang, penyebut) dan
Integer (...) digunakan untuk membuat pecahan rasional tanpa pembulatan desimal:
>>> z=Rational(1, 7)+Rational(2, 5); z 19/35 >>> Integer(1)/Integer(5) 1/5 >>> 1/5 0.2 >>> z=Integer(1)/Integer(5)+Rational(2, 7); z 17/35
Pembulatan Komputasi
Dalam komputasi simbolik, aturannya berfungsi - jika tidak ada yang dikatakan, jangan dibulatkan. Lihat bagaimana dalam kasus pertama, Python mengubah ekspresi, tetapi meninggalkan akar kuadrat dalam catatan respons dan tidak melakukan pembulatan apa pun, dan dalam kasus kedua, karena salah satu angka ditentukan dengan titik desimal, hasilnya akan menjadi perkiraan:
>>> sqrt(20) 2*sqrt(5) >>> sqrt(20.0)
Untuk objek karakter apa pun, ada metode
evalf (...) (
eval uate
f loat) yang mengembalikan representasi desimalnya:
>>> sqrt(20).evalf()
Metode
evalf ([n, ...]) dapat menggunakan argumen yang menentukan akurasi hasil (n = jumlah digit signifikan)
>>> sqrt(20).evalf(30) 4.47213595499957939281834733746 >>> pi.evalf(20) 3.1415926535897932385
Anda juga selalu perlu mengingat bahwa aritmatika nyata tidak menghasilkan hasil yang tepat, bandingkan:
>>> from sympy import * >>> one=S('one') >>> one = cos(1)**2 + sin(1)**2 >>> one.evalf()
Jika diketahui bahwa hasilnya berisi kesalahan perhitungan, maka Anda dapat menghapusnya dengan opsi
chop = True dari metode
evalf () . Nilai yang sangat kecil dari bagian nyata atau imajiner dari hasil dalam kasus ini diganti dengan nol. Ambil contoh sebelumnya:
>>> (one-1).evalf()
Infinity
Setelah mengeksekusi baris pertama
dari impor sympy * , simbol infinity
oo (dua huruf 'o') menjadi tersedia, yang dengannya Anda juga dapat melakukan operasi tertentu:
>>> oo+1 oo >>> 1000000<oo True >>> 1/oo 0
Simbol infinity sebagian besar digunakan oleh fungsi
limit () dan
integrasi () ketika menetapkan batas integrasi, yang akan kita bahas di salah satu artikel berikut.
Kesimpulan
Perhitungan simbolis yang dipertimbangkan dalam artikel berbeda dari metode numerik karena hasilnya dapat diselidiki lebih lanjut, misalnya, untuk menentukan ekstrema fungsi, menyelesaikan persamaan dengan variabel tertanam, dan sebagainya.
Saya harap artikel saya akan bermanfaat bagi semua orang yang tertarik dengan pemrograman Python, para siswa dan mereka yang terlibat dalam penelitian ilmiah.