Komputasi karakter dengan Python. Bagian 1 Dasar-dasarnya

gambar

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') #    ,      >>> f=a**3*x + 3*a**2*x**2/2 + a*x**3 + x**4/4 #  f    >>> type(f) <class 'sympy.core.add.Add'> >>> var('u,v') (u, v) >>> f=sin(u)**2+tan(v) #  f    >>> type(f) <class 'sympy.core.add.Add'> 


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:

Contoh kode
 >>> x=symbols('x:9'); x #    0  9 (x0, x1, x2, x3, x4, x5, x6, x7, x8) >>> x=symbols('x5:10'); x #    5  9 (x5, x6, x7, x8, x9) >>> x=var('x:9'); x #    0  9 (x0, x1, x2, x3, x4, x5, x6, x7, x8) >>> x=var('x5:10'); x #    5  9 (x5, x6, x7, x8, x9) 


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) #   >>> sqrt(x**2) Abs(x) >>> x = symbols('x', positive = True, integer=True) >>> sqrt(x**2) x >>> x = symbols('x') >>> sqrt(x**2) #  x,  xβ‰₯0 sqrt(x**2) >>> x = var('x', integer=True) >>> sqrt(x**2) Abs(x) >>> x = var('x', positive = True, integer=True) >>> sqrt(x**2) x >>> x = var('x') >>> sqrt(x**2) #  x,  xβ‰₯0 sqrt(x**2) 


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 #   z    0.14285714285714285 z1=S(1)/7; z1 1/7 z2=z1.n(30); z2 #   z2    30   0.142857142857142857142857142857 z3=round(z1,30); z3 0.14285714285714285 

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) #   f   a    x**4/4 + x**3 + 3*x**2/2 + x 

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)]) #   a=1, b=2, c=3, d=4 x**3 + 2*y**2 + 3*z + 4 >>> pr= x**3+4*x**2+6*x+10 >>> pr.subs(x,1/x) #     10 + 6/x + 4/x**2 + x**(-3) 

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' #   x   >>> pr 'Helloworld' 

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) #        4.47213595499958 

Untuk objek karakter apa pun, ada metode evalf (...) ( eval uate f loat) yang mengembalikan representasi desimalnya:

 >>> sqrt(20).evalf() #  sqrt()  sympy 4.47213595499958 >>> E.evalf() 2.71828182845905 

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() #  1 1.00000000000000 >>> (one-1).evalf() #    0 -0.e-124 

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() #    0 -0.e-124 >>> (one - 1).evalf(chop=True) 0 

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.

Source: https://habr.com/ru/post/id423731/


All Articles