Page 1 of 42 A wxMaxima Guide for Calculus Students Diterjemahkan oleh Prof. Syamsul Rizal ([email protected]) dari: http://www.sze.hu/~molnarka/MAXIMA/CalcTutorial.pdf Based on: A Maxima Guide for Calculus Students c January 2, 2007 by Moses Glasner e-mail: glasner AT math DOT psu DOT edu Address:Department of Mathematics Pennsylvania State University University Park, PA 16802 Sebuah Panduan wxMaxima untuk Belajar Kalkulus untuk Mahasiswa 1. Kalkulator ilmiah 2. Mencari batas dengan Maxima 2.1 Merencanakan Meskipun asymptotes 2.2 Batas dari Perbedaan Hasil bagi 3. Aturan Perbedaan 3.1 Menyuling dan Memanipulasi Hasil 3.2 Derivatif Fungsi trigonometri 3.3 Aturan Rantai 3.4 Diferensiasi Implisit; Derivatif yang lebih tinggi 3.5 Terkait Tarif 3.6 Perkiraan garis lurus dan batas 3.8 Optimisasi: Mencari Maksimum atau Minimum nilai fungsi tergantung pada pembatas 3.9 Optimasi dengan Lebih dari Satu Variabel 4. Integrasi 4.1 Teorema Fundamental Kalkulus 4.2 Perintah desolve dan ode2 4.3 Persimpangan dan Daerah Antara Curves 4.4 Volume oleh Mengiris: Menggunakan Trig Simp 5. Beberapa Metode Numerik di Maxima 5.1 Persamaan Solving 5.2 Fungsi Rekursif 5.3 Integrasi Numerik 5.4 Solusi Numerik Odes Panduan ini merupakan panduan pengunaan Maxima bagi mahasiswa yang sedang belajar Kalkulus. Rincian terdapat pada akhir dokumen ini. Saya berterima kepada Professsor Glasner yang telah mengizinkan saya untuk menggunakan materi yang telah dikembangkannya. Saya Page 2 of 42 bertanggung jawab atas kesalahan atau kekurangan jika bahan di bawah ini menyimpang dari panduan Profesor Glasner. Silahkan hubungi saya (wmixon at berry dot edu) kalau ada koreksi atau saran untuk perbaikan. 1. Kalkulator Ilmiah (Scientific Calculator) Secara default Maxima hadir dengan interface pengguna grafisnya sendiri, yaitu XMaxima. Orang yang terbiasa dengan Emacs akan lebih nyaman menggunakan Maxima di bawah perintah pada Maxima-mode Emacs, yang menyediakan untuk lingkungan yang baik untuk menggabungkan perhitungan dengan dokumen LaTeX. Untuk penggunaan yang sangat singkat tidak memerlukan interaksi yang luas, Maxima dapat dijalankan dari konsol, seperti Xterm pada Linux, atau prompt DOS di bawah Windows. Maxima dapat dijalankan dalam dua lingkungan yang lebih rumit lainnya: TeXmacs dan wxMaxima. TeXmacs memberikan perintah untuk mengeset output Maxima dan menyediakan pembangkit otomatis dari sumber LaTeX sedangkan wxMaxima menyediakan menu untuk penggunaan Maxima. Tutorial ini menggunakan wxMaxima, yang dapat digunakan untuk mengekspor baik file html dan LaTeX (meskipun file yang diekspor kemungkinan masih membutuhkan editing sebelum siap untuk dipublikasi). Kita berasumsi bahwa kita telah menginstal Maxima ke komputer dan dapat menjalankannya dari wxMaxima. Pastikan bahwa tombol F1 atau menu Help dapat digunakan untuk membuka manual Maxima. Maxima juga menyediakan bantuan dari baris perintah dalam menanggapi perintah untuk menjelaskan (sesuatu) atau contoh (sesuatu). Maxima akan mengajukan pertanyaan tambahan sebelum menanggapi permintaan bantuan tersebut dan respon harus diakhiri dengan titik koma; dan kemudian menekan tombol ENTER. Jika Kita tidak nyaman dengan wxMaxima, kita dapat melihat pilihan Bantuan (Help option) pada website wxMaxima.sourceforge.net/. Secara khusus, bekerja selama "10 Minute (wx)Maxima tutorial" (kita akan menghabiskan lebih dari 10 menit). Ketika Maxima siap untuk memproses instruksi ini, akan menampilkan %i diikuti oleh bilangan bulat pada layar: misalnya, (%i1). Instruksi yang diberikan kepada Maxima diketik di sini. Ini harus diakhiri dengan titik koma ; atau tanda dolar $ dan diikuti oleh penekanan pada tombol SHIFT+ENTER. Maxima adalah kasus sensitif. Kotak bawah ini berisi tiga perintah Maxima, masing-masing berakhir dengan tanda titik koma. Perintah pertama menghasilkan hasil yang diharapkan. Dalam dua lainnya kapitalisasi yang tidak tepat menghasilkan perhitungan yang salah. Perintah kedua berisi perintah Sin yang tidak dikenali. Perintah ketiga berisi perintah untuk menghasilkan sinus dari kuantitas yang tidak diketahui (%Pi/2). Ketika Maxima tidak bisa menafsirkan perintah, maka ia hanya mengulangi perintah sebagai outputnya. Page 3 of 42 Perhatikan bahwa %pi adalah cara Maxima untuk menuliskan π. Masukkan %pi di wxMaxima menghasilkan huruf Yunani dari nama itu. Masukkan perintah sin(pi/2); dan pastikan bahwa Maxima tidak mengevaluasinya. (%i1) sin(%pi/2); Sin(%pi/2); sin(%Pi/2); Mengakhiri perintah dengan tanda dolar, memberikan perintah yang dilakukan tanpa mencetak hasil. Dalam kotak di bawah, nilai-nilai 1 dan 2 terikat pada nama a dan b. Kedua perintah diakhiri dengan tanda dolar sehingga hasilnya tidak dicetak. Perintah ketiga, yang tersebar di dua baris, berakhir dengan titik koma, sehingga hasilnya dicetak. Maxima mengabaikan spasi dan pergantian baris. (%i4) a:1$ b:2$ a+ b; Kita mungkin menafsirkan dua ekspresi di atas setara dengan a = 1 dan b = 2. Namun Maxima tidak. Tanda sama disediakan untuk ekspresi yang sementara benar, tetapi pernyataan kesamaan tidak bertahan tanpa batas waktu. Perhatikan dua ekspresi di bawah ini. (%i7) c = 5; c; Kesamaan di bawah dinyatakan dengan tanda sama dengan. Perintah solve diterapkan pada persamaan, dengan menggunakan simbol % untuk merujuk pada output yang paling baru dihasilkan. Maxima tidak lagi mengingat setiap ekspresi 2*x + 1 = 7. (%i9) 2*x + 1 = 7; solve(%, x); Page 4 of 42 Kita dapat menyimpan ekspresi untuk nama, seperti expr1, dan kemudian kita gunakan expr1 di tempat ekspresi itu sendiri. Perintah di bawah ini mengikat ungkapan ini ke salah satu nama, kemudian mengikat solusi ekspresi untuk nama lain, dan akhirnya mengevaluasi ekspresi solusi yang dihasilkannya. (%i11) expr1: 2*x + 1 = 7$ solnx: solve(expr1, x); ev(expr1, solnx); Sebuah penggunaan yang sangat sederhana dari Maxima adalah sebagai kalkulator ilmiah yang presisi dan tak terbatas. Untuk menggambarkan penggunaan ini, perhatikan berikut ini, di mana Pilihan bfloat diartikan Maxima sebagai bigfloat, dan fpprintprec:60 menghasilkan floating presisi titik cetak. (%i14) fpprec:60$ q : sqrt(2); 1 + q; bfloat(q); bfloat(1+q); Cobalah program berikut (%i17) fpprec:4$ q : sqrt(2); 1 + q; bfloat(q); bfloat(1+q); Terlihat bahwa fpprec:4$ berarti menghasilkan presisi 3 desimal sebelum b0. Ketika Maxima menyelesaikan perhitungan, semua label tetap berguna sampai Maxima diinstruksikan untuk menyudahi mereka atau pengguna keluar dari Maxima. Jika pengguna tidak menyadari hal ini ketika memulai penghitungan baru, hasil yang tidak diharapkan dapat terjadi. Page 5 of 42 Instruksi kill(all) menghilangkan semua informasi, termasuk paket diload. Membebaskan label dengan instruksi ini mungkin boros jika beberapa objek terpasang atau beberapa paket yang dimuat, masih dibutuhkan dalam perhitungan selanjutnya. Nilai-nilai dan fungsi instruksi meminta Maxima untuk menampilkan semua label yang saat ini melekat pada ekspresi2 atau fungsi2. Dialog berikut menunjukkan prosedur untuk membebaskan label tertentu saja sambil menjaga sisanya agar tetap utuh dan masih dapat digunakan. Perhatikan penggunaan f (x): = sebagai cara ketiga untuk menghubungkan ekspresi terhadap sebuah nama. Dalam hal ini hubungan fungsional ditetapkan. (%i19) kill(all); values; functions; Pada tabel berikut dua hasil dan dua fungsi didefinisikan. Satu hasil dan satu fungsii dihilangkan dengan kill(a,f); yang tinggal adalah hasil dari fungsi. (%i3) a:1$ b:2$ f(x) := x^2$ g(x):=x^3 $ kill(a,f); values; functions; g(b); 2 Menentukan Limit dengan Maxima (Finding Limits with Maxima) Maxima dapat sangat membantu dalam memeriksa limit dari fungsi. Sebelum kita menentukan limit, terlebih dahulu, kita perhatikan lebih teliti mengenai notasi fungsi. Ditentukan fungsi f(x) = sin(x)/(1-x) dan kemudian dievaluasi untuk empat nilai dari . Perhatikan penggunaan daftar perintah dan kesesuaian daftar nilai-nilai output. Page 6 of 42 (%i11) kill(all)$ f(x) := sin(x)/(1-x); [f(0), f(%pi/2), f(1 + h), f(x + h)]; Pemeriksaan f(x) menunjukkan bahwa f(0) tidak didefinisikan. Kita mungkin ingin, namun, untuk menentukan nilai ke arah mana f(x) cenderung ketika x mendekati nol. Kotak di bawah menegaskan bahwa f(0) tidak didefinisikan, dan melaporkan bahwa batas f(x) ketika x mendekati 0 adalah "tak terhingga". Ini adalah jawaban tidak memuaskan dan ini adalah cara Maxima untuk menunjukkan tak terhingga yang kompleks (complex infinity). Maxima menunjukkan infinity positif dengan inf dan tak terhingga negatif dengan minf. wxMaxima mengubah ini ke simbol standar seperti yang kita lihat di bawah ini. (%i3) f(1); (%i4) limit(f(x), x, 1); Kesulitan yang menghasilkan respon tak tepat "infinity" di atas dihapus ketika kita katakan Maxima apakah x mendekati 0 dari atas ("plus") atau dari bawah ("minus"). (%i5) limit(f(x), x, 1, plus); limit(f(x), x, 1, minus); 2.1 Penggambaran Grafik Asimtot (Plotting Despite Asymptotes) Grafik fungsi ini menyajikan sebuah tantangan, karena f(x) tumbuh tanpa limit ketika x mendekati 1. Penggunaan skenario draw menarik dan fitur grafik di bawah ini menunjukkan bagaimana untuk menghindari kesulitan ini. Grafik pertama tidak ada limit pada kisaran f(x), sehingga nilai-nilai yang digambarkan pada kisaran yang relevan tidak dapat dilihat. Pemaksaan untuk mempertimbangkan f(x) hanya bernilai antara -1 dan 1 memungkinkan untuk menggambar grafik yang kita butuhkan. Perintah axes x dan y bersifat opsional. Page 7 of 42 (%i7) graph1: gr2d( explicit(f(x), x, -4*%pi, 4*%pi) )$ graph2: gr2d( xaxis=true, yaxis = true, yrange= [-1, 1], explicit(f(x), x, -4*%pi, 4*%pi) )$ wxdraw( graph1, graph2 ); Maxima dapat menangani fungsi yang melibatkan ekspresi logis. Perintah transpose(matrix([ ])) ini digunakan untuk membuat sebuah tabel dan tidak berhubungan dengan analisis tersebut. (%i10) g(x) := if x < 2 then x^2 else sqrt(x); transpose( matrix([g(0), g(2.5), g(4.999), g(5), g(5.0)]) ); Maxima juga dapat digunakan sebagai kalkulator grafik, dan dapat menghitung lebih dari satu fungsi. Perhatikan bahwa kedua grafik tidak diplot pada kisaran yang sama. Perhatikan penggunaan String untuk membuat ekspresi fungsional kunci entri. %i12) wxdraw2d( yrange = [-2, 5], key = string(f(x)), explicit( f(x), x, -5, 10),color = black, key = string(g(x)) , explicit(g(x), x, -2, 10))$ Page 8 of 42 2.2 Limit dari Perbedaan Pembagian (The Limit of the Difference Quotient) Mampu menentukan limit dari pengurangan bisa sangat membantu. Ekspresi yang mencirikan perubahan f(x) per unit perubahan x didefinisikan di bawah ini (h adalah ukuran perubahan x). Limit dari ekspresi ini ditentukan. Ini adalah ekspresi yang cukup panjang, tapi masih dapat disederhanakan, seperti yang ditunjukkan. Hasil perintah ratsimp menyederhanakan ekspresi pembagian. (%i13) diffratio: (f(x+h) - f(x) )/h; dr_limit: limit(diffratio, h, 0); ratsimp(%); Limit dari difference quotient adalah turunan dari fungsi. Kesetaraan ini dikonfirmasi oleh contoh di bawah ini. Bagian berikutnya membahas notasi untuk perintah diff(derivative). (%i16) diff(f(x), x); ratsimp(%); Page 9 of 42 Grafik di bawah ini menunjukkan fungsi f(x) dan turunannya untuk x dari -10 sampai 10. Secara umum, perhatian harus diberikan pada grafik f(x) dan turunannya, karena seringkali unit y berbeda untuk keduanya. (%i18) wxdraw2d( yrange=[-1,10], key = "f(x)", explicit( f(x), x, -10, 10), line_width = 2, key = "diff", explicit( diff(f(x), x), x, -10, 10 ) )$ 3 Aturan2 Diferensiasi (Differentiation Rules) Contoh di bawah ini menunjukkan bahwa Maxima dapat menghasilkan suatu ekspresi bagi turunan dari suatu fungsi tertentu. Bahkan, Maxima dapat melakukan lebih dari itu: Maxima dapat menunjukkan aturan2 untuk diferensiasi, tak tergantung dari ekspresi tertentu. Kita memastikan bahwa Maxima memahami ketergantungan2 di f(x) dan g(x), tetapi tidak menentukan bentuk2 fungsional. (%i19) kill(all) $ depends(f, x, g, x)$ diff(f + g, x); diff(f*g, x); diff(f/g, x); ratsimp(%); Page 10 of 42 Maxima mengetahui aturan2 untuk penjumlahan, perkalian, dan pembagian (dan banyak lagi lainnya). Aturan pembagian (quotient rule) disimpan dalam bentuk yang agak berbeda. Perintah depends(f,x) diperlukan, untuk memberitahu Maxima bahwa f adalah fungsi dari x. Kemudian dapat menangani turunannya secara simbolis. Jika kita tidak menentukan dependensi ini, maka instruksi diff(f,x) akan membangkitkan respon 0 dari Maxima, karena Maxima akan berpikir bahwa f dan x hanyalah dua variabel2 independen. Sel di bawah ini berisi perintah yang sama seperti di atas, tetapi perintah depends telah dipakai tanda komentar (/* */), sehingga tidak dieksekusi. Karena tidak tahu tentang tentang dependensi2 ini, Maxima menjawab atau merespons dengan 0. (%i6) kill(all) $ /* depends(f, x, g, x)$ */ diff(f + g, x); diff(f*g, x); diff(f/g, x); 3.1 Mengekstrak dan Memanipulasi Hasil (Exracting and Manipulating Results) Berbagai instruksi mengontrol bentuk akhir dari jawaban yang diberikan Maxima. Jika kita ingin jawaban menjadi sama penyebutnya sehingga lebih sederhana, misalnya, maka instruksinya adalah factor. (%i4) kill(all)$ f(x) := x^(1/2); g(x) := 1 + x^2; answer: diff(f(x)/g(x), x); factor(answer); Untuk mengakses hanya bagian dari jawaban yang diberikan oleh Maxima, meminta Maxima memberikan label yang dapat mengakses bagian-bagian individu. Instruksi untuk ini adalah Page 11 of 42 pickapart. Sebagai contoh, jika kita ingin menemukan di mana turunan dalam contoh di atas adalah sama dengan 0, maka Kita perlu label yang dapat digunakan untuk mengakses pembilang. Hal ini dicapai dengan berikut ini. Perhatikan bahwa variabel tambahan 2 mengatakan Maxima pada kedalaman berapa ekspresi harus dipecah menjadi beberapa bagian. Gunakan nilai terkecil yang mendapat label yang diinginkan. (%i5) pickapart( factor(answer),2); Maxima telah terpasang label (%t5) and (%t6) untuk pembilang dan penyebut dari bentuk faktor dari jawabannya. (Angka-angka ini bervariasi, tergantung pada apakah Maxima telah menghasilkan label seperti sebelum perintah pickapart ini). Untuk melihat apa yang terjadi jika tingkat 2 yang digantikan oleh 1, 3, dan sebagainya. pickapart( factor(answer),1);pickapart( factor(answer),3); Untuk menemukan nol pada pembilang, lakukan sebagai berikut: (%i7) soln: solve(%t5,x); Output yang dihasilkan, bernama soln, adalah daftar dengan dua elemen. (Sebenarnya segala sesuatu di Maxima adalah daftar karena ditulis dalam bahasa komputer LISP yang didasarkan pada list processing). Kita dapat mengakses elemen-elemen yang dalam bentuk persamaan x = sesuatu dengan instruksi pertama kali dan kemudian nilai dari solusi ini dapat diambil dengan instruksi rhs, atau dengan subscript yang tepat, ditandai dengan tanda kurung siku. Page 12 of 42 (%i8) the_first_soln: soln[1]; /* or */ first(soln); Setiap item dalam soln adalah ekspresi. Kita dapat menggunakan perintah rhs (right-hand side atau sisi kanan) untuk mengekstrak nilai. Hal ini dapat terikat ke salah satu nama. (%i10) the_first_soln_value : rhs(soln[1]); 3.2 Turunan Fungsi Trigonometri (Derivatives of Trigonometric Functions) Maxima bisa sangat membantu dalam diferensiasi fungsi trigonometri. Namun, beberapa perintah khusus untuk fungsi trigonometri diperlukan untuk menginstruksikan Maxima menerapkan identitas trigonometri dalam penyederhanaan. Misalnya, perhatikan dialog berikut: (%i11) kill(all)$ diff( sin(x)/(1 + cos(x)),x); factor(%); trigsimp(%); Instruksi trigsimp menginstruksikan Maxima untuk membuat penyederhanaan menggunakan identitas Pythagoras. Instruksi Maxima lainnya adalah trigreduce yang memungkinkan menggunakan beberapa rumus sudut untuk mengurangi pemangkatan, misalnya: (%i4) factor(cos(x)^2 + 2*sin(x)^2);trigsimp(cos(x)^2 + 2*sin(x)^2); trigreduce(cos(x)^2 + 2*sin(x)^2); Page 13 of 42 Ekspresi yang terakhir mungkin tidak tampak sederhana daripada saat kita mulai. Namun demikian ini sangat berharga (invaluable), untuk integrasi, proses invers dari diferensiasi (inverse process of differentiation). 3.3 Aturan Rantai (The Chain Rule) Sebelum Maxima dapat menerapkan aturan rantai, kita harus tahu bahwa dependencis yang relevan ada. Pada contoh di bawah ini, f (x): = mendefinisikan hubungan eksplisit antara x dan f(x). Adanya hubungan antara x dan u menegaskan, tetapi hubungannya tidak terdefinisikan (%i7) f(x):= x^3; depends(x,u)$ diff(f(x),u); Dialog di atas menggunakan notasi fungsional untuk mendefinisikan f dan menggunakan instruksi tergantung pada informasi Maxima bahwa x adalah fungsi dari u. Bagaimanapun, ini tidak memberikan formula khusus untuk ketergantungan ini. Kita bisa, menentukan ketergantungan x pada u sebagai berikut: (%i10) remove([x,u],dependency)$ x: sin(u); diff(f(x),u); Cara lainnya, kita dapat menggunakan notasi fungsional untuk kedua fungsi dan mendapatkan Maxima untuk membedakan komposisi mereka. Perhatikan bahwa dalam kasus ini g(u) dan tidak x harus dimasukkan sebagai ekspresi untuk didifferensiasi. Perhatikan bahwa diff(f(x), u) menghasilkan 0, karena Maxima tidak lagi mengingat ketergantungan x pada u Page 14 of 42 (%i13) kill(x)$ g(x):= sin(x); diff(f(g(u)),u); diff(f(x), u); Instruksi kill diperlukan untuk menghapus hubungan2 yang telah ditetapkan. Jika variabel memiliki beberapa dependensi dan hanya satu dari mereka yang akan dihapus, maka instruksi remove([u,x],dependency) dapat digunakan. 3.4 Diferensiasi Implisit; Turunan yang lebih tinggi (Implicit Differentiation; Higher Derivatives) Maxima dapat dengan mudah menghitung turunan fungsi2 implisit. Perhatikan dialog berikut yang menginstruksikan Maxima untuk menemukan dy/dx jika diketahui persamaan x2 + y2 = 25. (%i17) eqn: x^2 + y^2 = 25; depends(y,x)$ deriv_of_eqn : diff(eqn,x); solve(deriv_of_eqn,'diff(y,x)); Perhatikan simbol baru yang muncul dalam instruksi solve di atas. Biasanya argumen pertama solve adalah persamaan atau daftar persamaan2 dan yang kedua adalah variabel dan daftar variabel2. Disini dy/dx adalah argumen kedua. Perhatikan juga kutipan tunggal di depan diff(y,x). Kutipan tunggal di depan simbol memberitahu Maxima untuk tidak mengevaluasi simbol tetapi untuk memperlakukannya sebagai kuantitas yang tidak diketahui. Sebagai contoh, (%i21) [a, b] : [4, 3]$ [a + b, 'a + b, a + 'b, 'a + 'b, '(a + b) ]; Demikian juga, instruksinya solve(deriv_of_eqn, 'diff(y,x)) memberi tahu Maxima untuk tidak mencoba mengevaluasi turunan dari y terhadap x secara langsung (yang pada kenyataannya tidak bisa dilakukan) tetapi Maxima menganggap diff(y,x) sebagai kuantitas yang tidak diketahui dan memecahkannya sebagai ekspresi yang berbeda, bernama deriv_of_eqn. Turunan yang lebih tinggi (Higher Derivatives). Instruksi Maxima untuk menemukan turunan Page 15 of 42 yang lebih tinggi sama dengan untuk menemukan turunan pertama kecuali untuk argumen ketiga menunjukkan orde. Perintah pertama di bawah ini setara dengan diff(x^n, x, 1). (Konfirmasi ini.) Yang kedua dalam daftar perintah memanggil untuk turunan keempat. Perintah ketiga panggilan untuk turunan ke-n. Sampai n ditentukan, ekspresi ini tidak dapat dievaluasi. Latihan: Konfirmasi bahwa untuk x8, turunan ke-8 samadengan 8!. Apakah ini dapat digeneralisasikan untuk setiap nilai n? Jelaskan. (%i23) kill(n)$ [diff(x^n, x), diff(x^n, x, 4), diff(x^n, x, n)]; n:8$ [diff(x^n, x), diff(x^n, x, 4), diff(x^n, x, n)]; 3.5 Laju (Perubahan) Terkait (Related Rates) Maxima dapat membantu dalam memecahkan masalah laju terkait. Misalnya dalam masalah menemukan laju perubahan luas lingkaran mengingat bahwa laju perubahan radius lingkaran adalah dr/dt = 60 ketika t = 2 dan r = 120: (%i27) kill(a, r)$ area: a = %pi*r^2; depends([a,r],t)$ deriv_of_area: diff(area,t); subst([diff(r,t)=60, r=120],deriv_of_area); float(rhs(%)); Perhatikan bahwa Maxima harus diberitahu variabel yang dengan instruksinya tergantung waktu depends([a list of variables], t). Instruksi subst menginstruksikan Maxima untuk mengganti daftar persamaan muncul sebagai argumen pertama dari subst, diapit oleh kurung siku, ke ekspresi muncul pada argumen kedua. Default Maxima adalah untuk menghasilkan perhitungan yang tepat, bukan pendekatan numerik. Dengan demikian, da/dt = 14400π. Perintah float(%) memerintahkan Maxima untuk Page 16 of 42 menyediakan pendekatan floating-point ke nilai yang tepat. Kita mungkin ingin melihat berapa banyak digit %pi (cara Maxima tentang menunjukkan nomor yang bertentangan dengan huruf Latin), Maxima dapat menemukan dengan memberikan petunjuk fpprec= 1000$ fpprintprec:5$ bfloat(%pi);. Perintah fpprec dan fpprintprec mengatur presisi floating-point dan presisi cetak floating-point. Ini tidak perlu memiliki nilai yang sama. (%i19) fpprec= 1000$ fpprintprec:5$ bfloat(%pi); 3.6 Aproksimasi Linear dan Diferensial (Linear Approximations and Differentials) Kita bisa menggunakan operasi diff untuk mengekspresikan diferensial dari persamaan sebagai fungsi linear dari argumen2nya. Sel berikut mendefinisikan f(x) dan persamaan diferensial didasarkan pada fungsi tersebut. Perintah diff tidak menentukan variabel yang dapat digunakan untuk dturunkan, jadi Maxima kembali pada dy = (dy/dx) dx, di mana dx dilambangkan del (x). Ekspresi pickapart untuk digunakan seperti di bawah ini. (%i33) kill(all)$ f(x) := sin(x); diff(f(x) ); pickapart(%, 1)$ Untuk membuat persamaan yang menghasilkan garis tangent terhadap f(x) pada nilai x = π/3, kita mengevaluasi suku dy/dx pada nilai tersebut. Kemudian kita membuat fungsi linier dengan slope yang melalui titik (π/3, f(π/3)). (%i5) ev(%t3, x = %pi/3); f(%pi/3) + %*(x - %pi/3); float(%); expand(%); Maxima memiliki alat yang sangat ampuh untuk menemukan pendekatan2 linier pada fungsi ekspansi Taylor order 1. Page 17 of 42 (%i9) L: taylor(f(x), x, %pi/3, 1); Elipsis atau tiga buah titik (...) setelah output menandakan sisa, dan /T/ sebelum output menunjukkan bahwa suku2 dilaporkan merupakan berupa representasi yang dipotong (truncated representation) dari polinomial derajat yang lebih tinggi. Kami menggunakan taytorat untuk mengkonversi ekspansi Taylor untuk ekspresi rasional. Perintah kedua dan ketiga di bawah ini digunakan untuk mengekspresikan hasil dengan cara yang membuatnya sebanding dengan hasil di atas. Keduanya sama. (%i10) L: taytorat(L); expand(L); float(%); Grafik di bawah ini menunjukkan pendekatan linier terhadap fungsi, bersama dengan fungsi itu sendiri. Grafik yang dibuat jelas salah satu aspek penting dari pendekatan linear: itu terbaik dekat di mana ekspansi Taylor dihitung. (%i13) wxdraw2d( explicit(f(x), x, 0, %pi), explicit(L, x, 0, %pi))$ Page 18 of 42 Polinomial Taylor datang dalam semua derajat. Kita akan bekerja dengan polinom2 ini secara sistematis. Argumen terakhir dalam instruksi Maxima Taylor menentukan derajat. 3.7 3.7 Menemukan Maxima dan Minima(Locating Maxima and Minima) Maxima dapat sangat membantu dalam memeriksa proses menemukan titik kritis fungsi, seperti dialog yang ditunjukkan berikut: (%i14) kill(all)$ f(x):=x^(3/5)*(4-x); deriv_of_f: diff(f(x),x); soln: solve(deriv_of_f, x); x_crit: rhs(soln[1]); f(x_crit) ; float(%); Pemeriksaan output %o2, fungsi turunan, menunjukkan bahwa df/dx tidak didefinisikan ketika x = 0. Grafik di bawah ini menunjukkan perilaku f dan df/dx. Derivatif tumbuh tanpa terikat ketika x mendekati 0 (gunakan perintah limit untuk mengkonfirmasi ini), tetapi f kontinu. (%i7) fgraph: gr2d( xaxis = true, explicit(f(x), x, -0.25 , 1.5*x_crit), line_type = dots, points_joined=true, points( [ [x_crit, 0], [x_crit, f(x_crit) ] ]) )$ diffgraph: gr2d(xaxis = true, yrange=[-5, 10], explicit(deriv_of_f, x, -.25, 1.5*x_crit), point_size = 2, points_joined = true, line_type=dots, points( [[x_crit,-5],[x_crit, 10] ]) )$ wxdraw(fgraph, diffgraph)$ Page 19 of 42 Apakah kita telah menemukan maksimum atau minimum? Kondisi df/dx = 0 adalah syarat atau kondisi yang diperlukan (necessary condition) untuk nilai f(x) menjadi (lokal) maksimum. Ini juga merupakan syarat yang diperlukan (necessary conditon) untuk nilai f(x) menjadi (lokal) minimum. Untuk menentukan yang mana dari yang dua itu, telah ditemukan kita harus meneliti turunan kedua f terhadap x. Jika derivatif atau turunan kedua ini negatif, maka nilai kritis x menghasilkan nilai (lokal) maksimum f(x); jika turunan kedua positif, (lokal) minimumlah yang ditemukan. Dalam kasus kita, hasilnya adalah lokal (dan global, grafik menunjukkan) nilai maksimum dari f(x). (%i10) second_deriv: diff(f(x), x, 2); Pemeriksaan ekspresi di atas menunjukkan bahwa turunan kedua negatif. Kita dapat menentukan nilai yang tepat dengan menggunakan subst atau ev. Perhatikan cara-cara alternatif mengubah jawaban yang tepat untuk nilai floating point. (%i11) ev(second_deriv, x=x_crit)$ float(%); float( subst(x_crit, x, second_deriv) ); 3.8. Optimasi: Mencari Nilai Maksimum atau Minimum dari Fungsi yang Tergantung Sebuah Kendala (Optimization: Finding Maximum or Minimum Values of Functions Subject to a Constraint) Kita menggunakan Maxima untuk memecahkan hal berikut. Sebuah jendela persegi panjang dibatasi oleh setengah lingkaran (surmounted by a semicircle). Persegi panjang adalah kaca Page 20 of 42 bening sementara setengah lingkaran adalah kaca berwarna yang mentransmisikan hanya setengah banyak cahaya per satuan luas dibandingkan kaca bening. Total perimeter (keliling) adalah tetap. Cari proporsi jendela yang akan menerima kebanyakan cahaya (that will admit the most light). Abaikan ketebalan frame. Diketahui r adalah radius setengah lingkaran. Maka 2r adalah dasar persegi panjang. Ketinggian persegi panjang adalah h. Misalkan P total lingkaranjendela. Jadi P adalah konstanta tetap. Kita memiliki persamaan2 berikut yang menghubungkan r dan h dan mengekspresikan jumlah cahaya L dalam hal r dan h, dengan asumsi bahwa L adalah satu untuk setiap unit luas di bagian persegi panjang dan L adalah 1/2 untuk setiap unit luas di bagian setengah lingkaran dari jendela. Kami menunjukkan nilai tetap P sebagai P0. (%i14) kill(all)$ P : 2*r +2*h + %pi*r$ L : 2*r*h + %pi*r^2/4$ print("Perimeter = ", P, ", and Light = ", L)$ soln_h : solve(P = P0,h); Kita mengambil sisi sebelah kanan dari solusi dan menamakannya h_is. Ekspresi ini disubstitusikan menjadi ekspresi L, menghasilkan L sebagai fungsi r (ingat bahwa P memiliki nilai konstan P0). (%i5) h_is : rhs(first(soln_h)); L_fcn_r : ratsubst(h_is,h,L); Lakukan turunan dari L_fcn_r dan atur turunan sama dengan nol, menghasilkan ekspresi untuk r. Ekspresi r ini sebanding dengan P0. (%i7) deriv_L :diff(L_fcn_r,r); soln_r:solve(deriv_L = 0,r); Page 21 of 42 Kita menetapkan sisi kanan dari solusi bernama r_is dan kami mengganti r_is menjadi ekspresi h_is, menghasilkan ekspresi h_is_now, yang menunjukkan bahwa h, seperti r, sebanding dengan P. Bahwa nilai-nilai kritisdari h dan r sebanding dengan P0 menyiratkan bahwa mereka sebanding satu sama lain. (%i9) r_is: rhs(soln_r[1]); h_is_now: subst(r_is, r, h_is), ratsimp; h_is_now / r_is, ratsimp; Akhirnya, kita dapat menentukan cahaya maximum, yang dihasilkan di keliling jendela. (%i12) max_L : subst([r=r_is, h=h_is_now], L)$ ratsimp(%); Pendekatan alternatif untuk memecahkan masalah seperti ini adalah to differentiate the constraint equation. Hal ini secara signifikan lebih sederhana daripada memecahkan persamaan kendala untuk salah satu variabel dalam kasus di mana persamaan kendala rumit atau mungkin bahkan tidak dapat diselesaikan untuk salah satu variabel. Dalam masalah di atas kita mendifferensiasi persamaan untuk perimeter terhadap r. Ini menghasilkan persamaan linear dalam derivatif dh/dr yang tidak diketahui, yang dapat dengan mudah dipecahkan. Kemudian kita mendifferensiasi rumus untuk L terhadap r dan ini juga akan melibatkan derivatif dh/dr yang tidak diketahui, yang sekarang dapat dihilangkan. Dan kemudian Page 22 of 42 kita bisa menentukan hubungan antara r dan h yang menghasilkan titik kritis. Dialog berikut menunjukkan bagaimana Maxima dapat diinstruksikan untuk melaksanakan perhitungan ini. (%i14) kill(all)$ depends(h,r)$ P : 2*r +2*h + %pi*r$ L : 2*r*h + %pi*r^2/4$ deriv_P : diff(P-P0,r); (%i5) solve(deriv_P, diff(h, r)); deriv_h : rhs(%[1]); (%i7) deriv_L : diff(L,r); (%i9) deriv_L_is: ratsubst(deriv_h, 'diff(h,r), deriv_L); (%i10) solve(deriv_L_is = 0, r); 3.9 Optimasi dengan Lebih dari Satu Variabel (Optimization with More than One Variable) Misalkan kita ingin membangun sebuah kotak yang memiliki luas permukaan yang diketahui dalam konfigurasi yang menghasilkan volume maksimal. Pendekatan Lagrangian untuk memecahkan masalah seperti ini, untuk menciptakan ekspresi tambahan (augmented expression) dan menggabungkannya dengan kendala. Ekspresi A dalam sel di bawah ini ditambahkan pengali mu dikali kendala menjadi ekspresi untuk volume. Kendala tersebut dinyatakan dengan nilai mu (μ) dikalikan nol. (%i11) kill(all)$ V: L*W*H; S: 2*(L*W + L*H + W*H); A: V + mu*(S0 - S); Page 23 of 42 Kita sekarang mengambil semua kemungkinan turunan dari ekspresi yang ditambahkan, termasuk turunan terhadap μ, yang merupakan kendala. Baris terakhir ditambahkan hanya untuk membuat output lebih mudah untuk dibaca. Kita memecahkan sistem persamaan2 untuk derivatif terhadap L, W, dan H. Nilai μ akan tersirat, seperti yang kita lihat di bawah. (%i4) A_L : diff(A, L); A_W : diff(A, W); A_H : diff(A, H); A_mu : diff(A, mu); soln: solve([A_L, A_W, A_H], [L, W, H]); transpose( matrix(soln) ); Maxima menghasilkan dua solusi. Yang pertama, L = W = H = 0, menghasilkan minimum. Dalam hal ini, μ harus sama dengan nol agar S0 - S = 0 agar memenuhi (S0> 0 dan S = 0). Interpretasinya adalah jika menambah S, tidak lagi menurunkan V; minimum telah tercapai. Solusi kedua menyediakan kondisi untuk sebuah V yang maksimum. Disini, L = W = H = 4 * μ. Contoh di bawah ini menggambarkan hasil ini. Misalkan S = 60 meter2. Kemudian 2*(3*L2) = 60, sehingga L = √(10) meter. (%i10) solnL0: solve(60 - 6*L^2, L); Page 24 of 42 Volume yang dihasilkan adalah 10 (3/2) meters3, sekitar 31,6228 meters3 (%i11) L0: rhs(solnL0[2]); V0: ev(V, L = L0, W = L0, H = L0); float(%); Nilai μ adalah sqrt(10)/4, sekitar 0,7906. Oleh karena itu perubahan S dari 60 menjadi 61 meters2, akan meningkatkan V sekitar 0,7906 meters3. Hasil di bawah ini menunjukkan bahwa peningkatan yang sebenarnya adalah sekitar 0,7939 meters3. Konfirmasi bahwa perbedaan antara L0/4 = μ dan nilai aktual menurun ketika h berkurang dengan menggunakan nilai-nilai h0 yang lebih kecil. Kita dapat mengkonfirmasi bahwa μ memiliki satuan yang sama dengan L, W, dan H: μ adalah rasio perubahan volume (meters3) terhadap perubahan permukaan (meters2). Dengan demikian, satuan untuk μ adalah meter, sama dengan L, W, dan H. (%i14) h0: 1$ S1: 60 + h0$ solnL1 : solve(S1 - 6*L^2, L)$ L1: rhs(solnL1[2])$ V1: ev( V, L = L1, W = L1, H = L1)$ float(%); float( [(V1 - V0)/h0, L0/4]); Teknik Lagrangian dapat diterapkan dalam beberapa kendala. Misalkan tinggi kotak diperlukan samadengan satu-setengah panjang. Kita mendefinisikan fungsi yang baru ditambahkan (new augmented function) yang menambahkan kendala ini ke fungsi augmented A. Kita kemudian menghasilkan himpunan derivatif dan memecahkan L, W, H, dan kappa (κ), pengali atau multiplier baru. Page 25 of 42 (%i21) A2 : A + kappa*(.50 - H/L); A2_L : diff(A2, L); A2_W : diff(A2, W); A2_H : diff(A2, H); A2_mu : diff(A2, mu); A2_kappa: diff(A2, kappa); soln2: solve([A2_L, A2_W, A2_H, A2_kappa], [L, W, H, kappa])$ transpose( matrix(soln2) ); Sekali lagi, Maxima menghasilkan dua solusi. Yang pertama menunjukkan kondisi untuk meminimalkan volume, dan yang kedua untuk memaksimalkannya. Sekarang nilai-nilai L, W, dan H semua berbeda satu sama lain. Kondisi untuk κ = 24μ2 perlu perhatian. Nilai κ sebanding dengan volume kotak itu (ingat bahwa μ adalah dalam satuan yang sama dengan L, W, dan H). (%i29) [L2 : rhs(soln2[2][1]), W2 : rhs(soln2[2][2]), H2 : rhs(soln2[2][3]), kappa2 : rhs(soln2[2][4])]; soln_mu2 : solve(2*(L2*W2 + L2*H2 + W2*H2)- 60, mu)$ float(%); Page 26 of 42 Nilai mu dari sekitar 0,7906 menjadi sekitar 0,7454, sehingga volume yang sedikit ditambahkan untuk setiap unit merubah luas permukaan. Kita evaluasi kembali L2, W2, H2, dan κ2 diberi nilai positif dari μ - soln_mu2 [2] - dan kemudian menghitung volume baru. Nilai κ memperkirakan bahwa kenaikan 0,01 unit dalam rasio (dari 0,5 menjadi 0,51) akan menyebabkan volume naik mendekati 0,0994 meter3. Ganti 0,5 dengan 0,51 di atas dan pastikan bahwa kenaikan yang sebenarnya adalah sekitar 0,0973. (%i32) [L2, W2, H2, kappa2] : ev([L2, W2, H2, kappa2], soln_mu2[2])$ float(%); V2 : L2 * W2 * H2$ float(%); (%o33) [4.4721,2.9814,2.2361,9.9381] (%o35) 29.814 Untuk S = 60, luas maksimum sekarang sekitar 29,8142 meters3, turun dari sekitar 32,4166 meters3 ketika hubungan antara L, W, dan H tidak dibatasi. 4 4 Integrasi (Integration) Sintaks integrasi terbatas menyerupai diferensiasi, dengan mengintegrasikan mengganti diff, kecuali bahwa beberapa integrasi (multiple integration) membutuhkan beberapa panggilan untuk mengintegrasikan. Ekspresi umum di bawah ini menunjukkan bahwa Maxima tidak memberikan konstanta integrasi. Terserah analis untuk melacak. (%i36) kill(all)$ /* Indefinite integrals */ ["Single integral: ", integrate(f(x), x), " Double integral: ", integrate(integrate(f(x,y), y), x ) ]; /* A definite integral */ ["Single definite integral: ", integrate(f(x), x, a, b) ]; Dengan fungsi yang sama f(x, y) = x4/y, kita menemukan integral tak tentu dan tentu (the indefinite and definite integrals) dari ekspresi terhadap x. Integral tertentu adalah dalam rentang x = 0 sampai x = 5. Kemudian dilakukan integral terhadap y, dengan integral tertentu dalam rentang y = 1 dan y = 2. Page 27 of 42 (%i3) f(x, y) := x^4 / y; integrate(f(x, y),x ); integrate(%, y); integrate(f(x, y), x, 0, 5); integrate(%, y, 1, 2); float(%); Output juga dapat dibangkitkan dalam perintah tunggal. Menetapkan limits sebagai titik float, yang membuat pernyataan untuk menentukan sebuah substitusi yang dapat membuat Maxima melakukan operasi. Menambahkan perintah ratprint: false pada baris pertama, akan menghasilkan output yang diinginkan. (%i10) ratprint: false$ integrate(integrate(f(x, y), x, 0, 5), y, 1.0, 2.0 ); (%o11) 433.22 Limit dari jumlah Riemann, jika ada, mendefinisikan integral tertentu fungsi pada [a, b]. Evaluasi sebenarnya dari limit dari jumlah2 Riemann terkait dengan fungsi pada interval membosankan (on an interval is tedious). Maxima dapat membantu. Instruksi Maxima untuk menjumlahkan seri adalah sum. Perintah sum mengambil empat argumen: ekspresi, indeks, nilai awal indeks, dan nilai akhir dari indeks. Seperti sebelumnya, perintah print tidak diperlukan, tapi itu membuat hasilnya lebih mudah dibaca. (%i10) kill(R_sum)$ wxdraw2d( explicit(x^4, x, 2, 5) )$ Page 28 of 42 (%i15) print( R_sum: (3/n)*sum((2+3*i/n)^4,i,1,n), " = ", ratsimp(R_sum) )$ Default Maxima adalah tidak melakukan evaluasi dari sum of a series. Instruksi untuk mengubah ini adalah simpsum : true. (%i19) simpsum:true$ print( "The Riemann sum of x^4 is ", R_sum: ratsimp( (3/n)*sum((2+3*i/n)^4,i,1,n) ), ", whose limit is ", float( limit(R_sum, n, infinity) ) )$ Hasil dari integral tertentu yang sesuai menegaskan bahwa integral sama dengan limit penjumlahan Riemann (limit of the Riemann sum). (%i21) float( integrate(x^4, x, 2, 5) ); (%o21) 618.6 4.1 Teorema Fundamental Kalkulus (The Fundamental Theorem of Calculus) Bahwa Maxima tahu Teorema Fundamental Kalkulus, dapat diilustrasikan di bawah ini. Ekstensi, berlabel "Chain rule illustrations", menunjukkan fleksibilitas fungsi lambda. Perhatikan penggunaan operator kutipan tunggal untuk menghilangkan (suppress) evaluasi. (%i16) kill(all)$ Page 29 of 42 assume(x>0)$ S : lambda( [x], integrate(a*log(t),t,0,x)); answr:diff(S(x),x); ["Chain rule illustrations: ", 'diff(S(x^3),x), " = ", diff(S(x^3),x) ] ; [ 'diff(S((1/x)),x) , " = ", diff(S((1/x)),x)]; Tanpa perintah assume(x > 0) Maxima akan meminta user untuk mendeklarasi tanda dari x. Nama variabel dummy t dalam definisi S tidak dapat dipilih untuk menjadi x meskipun itu dapat diterima secara sempurna dalam komunikasi matematika. 4.2 Perintah desolve dan ode2 (The Commands desolve and ode2) Instruksi Maxima integrate menyajikan salah satu dari dua tujuan, tergantung pada jumlah argumen yang dilewatkan ke sana. Hal ini digunakan untuk memberitahu Maxima untuk menemukan baik integral tak tentu atau tentu (indefinite or definite integral). Jika dua argumen dipakai maka Maxima menemukan integral tak tentu dari fungsi dalam argumen pertama yang mempertimbangkan variabel di kedua. Jika empat argumen yang dipakai, maka Maxima menemukan integral tertentu dalam interval dimulai bagian ketiga dan berakhir di bagian keempat. Instruksi lain yang dapat digunakan untuk mencapai tujuan yang sama adalah ode2. Hal ini dapat digunakan untuk menginstruksikan Maxima untuk memecahkan persamaan dy/dx = f (x), atau dy = f(x) dx untuk y. Ini adalah instruksi yang sangat ampuh. Berikut ini menunjukkan bagaimana hal ini dapat dilakukan. Perintah ode2 mengikuti perintah akrab integrate (%i6) eqn: 'diff(y,x) = sqrt(1/x^2-1/x^3); integrate(rhs(eqn), x); ode2(eqn,y,x); Page 30 of 42 Setiap kali Maxima diserahkan ekspresi secara otomatis mencoba untuk mengevaluasinya. Oleh karena itu kutipan sebelum diff memberitahu Maxima tidak membuang-buang waktu mencoba untuk mengevaluasi dy/dx. Maxima diberitahu apa derivatif ini dan instruksi berikutnya meminta untuk memecahkan y. Perhatikan bahwa ketika kita menggunakan ode2 Maxima termasuk konstanta sembarang yaitu %c dalam tanggapannya. Berikut ode singkatan ordinary differential equation atau persamaan diferensial biasa. Dari Maxima Manual: "Fungsi ode2 memecahkan persamaan diferensial biasa (ODE) dari ordepertama atau kedua". Perintah Maxima lain, desolve, dapat digunakan untuk memecahkan sistem satu atau lebih dari persamaan2 diferensial biasa. 4.3 Perpotongan dan Luas Daerah antara Kurva (Intersections and Areas Between Curves) Maxima dapat sangat membantu dalam menemukan titik perpotongan dari kurva. Sel bawah menunjukkan bagaimana menjalankannya. Maxima tidak mengintegrasikan nilai absolut. Jadi untuk mendapatkan Maxima untuk melakukan masalah di mana tidak ada grafik tetap di atas yang lain pada seluruh selang, pertama-tama kita menemukan titik perpotongan dan kemudian menginstruksikan Maxima untuk menjumlahkan integral dari fungsi atas minus fungsi yang lebih rendah pada interval yang relevan. Perintah draw2d bawah ini memiliki lebih detail dari yang dibutuhkan untuk memecahkan masalah ini, tapi detail tersebut dapat berguna. Maxima Manual (Bab 48) berisi informasi lebih lanjut mengenai pilihan untuk perintah draw. Page 31 of 42 (%i9) kill(all)$ [f1, f2] : [x^2 + 10, -2*x^2 + 25*x]$ wxdraw2d(title = "Region bounded by two functions", fill_color = gray, filled_func = f2, explicit(f1,x,0,10), filled_func = false, line_width = 2, key = concat("f1: ", string(f1) ), color = red, explicit(f1,x,0,10), key = concat("f2: ", string(f2) ), color = blue, explicit(f2,x,0,10) ); Gunakan solve untuk menentukan kisaran yang f2> f1. (%i3) soln : solve(f1=f2, x)$ float(%); Luas yang akan ditentukan adalah integral dari f2 - f1 pada interval ini. (%i5) x1 : rhs(soln[1])$ x2: rhs(soln[2])$ float( integrate(f2 - f1, x, x1, x2) ); 4.4 Volume oleh Irisan: Menggunakan Trigsimp (Volumes by Slicing: Using Trigsimp) Maxima tidak bisa membantu dengan mencari formula untuk daerah penampang potong khas A(x) tapi itu sangat membantu dalam memeriksa integrasi berikutnya. Page 32 of 42 Sebagai contoh, carilah volume yang dihasilkan oleh daerah berputar di bawah y = sec (x), di atas y = 1 dan x = 1 antara dan x = -1. Ini membutuhkan mengevaluasi integral dari ekspresi V = sec2 (x) - 1 pada rentang yang ditunjukkan. Perintah trigsimp (singkatan dari trigonometric simplification) digunakan untuk ekspresi trigonometri seperti ratsimp yang digunakan untuk ekspresi rasional. (%i8) A : (sec(x))^2 - 1; B : trigsimp(A); integrate(A, x, -1, 1); integrate(B, x, -1, 1); float(%); Output menunjukkan, Maxima bisa menemukan integral tanpa instruksi trigsimp, tetapi kita harus menyadari bahwa itu tersedia. Instruksi ini menyebabkan Maxima untuk menggunakan identitas Pythagoras untuk menyederhanakan ekspresi. Instruksi seperti ratsimp akan tidak berpengaruh di sini. Unit pada Maxima adalah radian, sehingga tan (1) bersinggungan ketika x = 1 radian, atau π/180 derajat. Perhatikan "Nilai Utama" ("Principal Value") menunjukkan bagaimana Maxima mendekati masalah ini. "Nilai Utama" mengacu pada nilai utama Cauchy, yang merupakan integral terbatas dari fungsi sekitar titik c, dalam rentang integrasi. Ini adalah limit dari fungsi yang ditampilkan di bawah ini sebagai epsilon yang mendekati nol dari atas. (%i1) kill(f)$ limit('integrate(f(x), x, a, c - %epsilon)) + 'integrate(f(x), x, c + %epsilon, b); Page 33 of 42 4.5 4.5 Volume dengan Shells Silinder; Menggunakan Trigreduce dan Trigexpand (Volumes by Cylindrical Shells; Using Trigreduce and Trigexpand) Sekarang kita menentukan volume padat yang dihasilkan oleh daerah berputar antara y = cos x, y = 0 dan garis x = 0, x = π / 2 pada sumbu x. Dengan menggunakan metode shell, integral dapat dihitung sebagai berikut: (%i13) A : x*cos(x)^-1; B: trigreduce(z); integrate(z, x, 0, %pi/2); integrate(x*cos(x)^-1, x, 0, %pi/2); Ini adalah integral yang sulit yang membutuhkan integrasi secara parsial. Metode disk menghasilkan integral yang dapat dievaluasi: (%i7) [%pi*'integrate(cos(x)^2, x, 0, %pi/2), " = ", %pi*integrate(cos(x)^2, x, 0, %pi/2)] ; Jika Kita bekerja masalah seperti ini sebagai latihan, Kita akan perlu untuk mengingat formula sudut ganda/setengah. Maxima dapat membantu. Page 34 of 42 (%i8) halfangles: true$ A: cos(x)^2; B: trigreduce(A); C: trigexpand(B); D: trigsimp(C); Dialog ini menunjukkan bahwa trigreduce memberitahu Maxima menggunakan rumus2 setengah sudut untuk menyederhanakan ekspresi dan trigexpand memberitahu Maxima menggunakan rumus ganda sudut. 5 Beberapa Metode Numerik di Maxima (Some Numerical Methods in Maxima) Dalam banyak kasus kita tidak dapat menemukan solusi analitis untuk sebuah masalah. Maxima menawarkan berbagai metode numerik untuk menemukan nilai-nilai perkiraan dalam kasus tersebut. 5.1 5.1 Menyelesaikan Persamaan (Solving Equations) Mencari solusi untuk persamaan atau sistem persamaan adalah aplikasi penting dari analisis numerik. Perhatikan persamaan di bawah ini, yang menggunakan solve tidak mempunyai solusi analitis. (%i13) f(x, a, b) := x^a - b*log(x); [a0, b0] : [0.8, 5]$ solve(f(x, a0, b0), x); Page 35 of 42 Bila menggunakan metode numerik untuk menemukan akar2, kita harus menggambar grafik dari ekspresi(s) yang diselesaikan. Grafik dapat menunjukkan apakah beberapa akar diharapkan pada rentang yang relevan. Hal ini juga dapat membantu pemilihan tebakan untuk menduga nilai-nilai sebagai awal untuk metode pencarian berulang (iterative search methods). Grafik di bawah menunjukkan bahwa akar terjadi di sekitar x = 0 dan untuk sekitar x = 40. Fungsi tidak didefinisikan untuk x = 0. Mengapa? (%i16) wxdraw2d( xaxis = true, yaxis = true, explicit(f(x, a0, b0), x, -10, 50))$ Perintah find_root digunakan pertama. Perintah ini membutuhkan ekspresi yang akan dievaluasi, argumen ekspresi, dan titik akhir interval. Jika tanda f(x) adalah sama pada kedua titik akhir, hasilnya meriupakan pesan kesalahan. (%i17) find_root(f(x, a0, b0), x, 1, 50); Page 36 of 42 Mempersingkat interval menjadi [.0001, 10]. (Mengapa tidak [0, 10]?). Akar pertama sekitar x = 1,2750. f(x, a0, b0), hasilnya hampir nol. Perbedaan ini mencerminkan kesalahan dalam proses pencarian (error in the search process).. (%i18) find_root(f(x, a0, b0), x, 0.001, 10); f(%, a0, b0); Akar kedua sekitar x = 1,2749, ditemukan dengan cara yang sama. Sekali lagi, f(x, a0, b0) yang dihasilkan adalah sekitar 0; 0.0 adalah pendekatan floating-point dari 0. (%i20) find_root(f(x, a0, b0), x, 30, 50); f(%, a0, b0); Pendekatan alternatif adalah dengan menggunakan proses pencarian Newton (Newton search process). Melakukan hal memerlukan loading modul newton. Ini adalah modul untuk menerapkan proses Newton terhadap satu persamaan. Perintah newton sedikit berbeda dari find_root. Hal ini membutuhkan ekspresi, argumen ekspresi, dugaan nilai awal, dan tingkat toleransi (It requires the expression, the expression's argument, an initial guess of the value, and a tolerance level). Proses ini bekerja lebih baik jika menebak dekat dengan akar, dan grafik dapat memberikan panduan. (%i22) load(newton1)$ newton(f(x, a0, b0), x, 1, .0000000001); newton(f(x, a0, b0), x, 40, .0000000001); Metode Newton dapat diperluas untuk beberapa persamaan. Selama jumlah persamaan (dan tidak diketahui) kurang dari 4, grafik masih dapat digunakan untuk memandu proses pencarian. Tinjaulah dua persamaan di bawah ini. Untuk menghindari grafik tiga dimensi, kita menggunakan perintah implicit dalam draw2d. Grafik menunjukkan x, y pasangan x, y untuk f(x, y) = 0 dan g(x, y) = 0. Karena f (0, y) tidak didefinisikan, fungsi implisit terputus atau discontinuous di x = 0. Page 37 of 42 Grafik menunjukkan bahwa f(x, y) = g(x, y) = 0 pada dua nilai2 x: lebih dari -1.0, dan lebih dari 1,0. (%i1) kill(all)$ f(x,y) := 2*(3^x) - y/x - 5; g(x,y) := x + 2^y - 4; wxdraw2d( key = "f(x, y)", implicit(f(x,y), x, -2, 5, y, -2, 5), color = green, key = "g(x, y)", implicit(g(x,y), x, -2, 5, y, -2, 5) )$ Untuk menentukan akar untuk multiple expressions, kita akan memuat modul mnewton dan masukkan perintah mnewton. Argumen perintah yang ini terdiri dari tiga daftar: daftar ekspresi, daftar variabel, dan daftar tebakan. Tingkat toleransi harus diatur secara eksplisit jika seseorang ingin menggunakan nilai selain default. Karena grafik mengidentifikasi dua pasangan x, y yang merupakan akar2 untuk kedua persamaan2, kita menjalankan mnewton dua kali. (%i4) load(mnewton)$ soln1: mnewton( [f(x, y), g(x, y)], [x, y], [-1, 2] ); soln2: mnewton( [f(x, y), g(x, y)], [x, y], [1, 1.5] ); Page 38 of 42 Kita mengekstrak nilai kritis atas dan memeriksa nilai2 fungsi. Solusi2 dinyatakan sebagai daftar, sehingga dengan mengekstrak nilai-nilai ini membutuhkan indeks ganda (meskipun daftar top-level hanya satu item). (%i7) [x1, y1] : [rhs(soln1[1][1]), rhs( soln1[1][2]) ]; [x2, y2]: [rhs(soln2[1][1]), rhs( soln2[1][2]) ]; [ f(x1, y1), g(x1, y1) ]; [f(x2, y2), g(x2, y2)] ; 5.2 Fungsi Rekursif (Recursive Functions) Ini menjadi latihan yang baik untuk mendefinisikan fungsi Maxima sendiri yang mengimplementasikan metode Newton. Melakukan hal ini menunjukkan cara untuk berurusan dengan fungsi rekursif di Maxima. (%i11) kill(all)$ my_newt(f,guess,prec):= block([f_x,der_x,x_new], f_x : f(guess), der_x : subst(guess,x, diff(f(x),x)), x_new : guess - f_x/der_x, if abs(x_new - guess) < prec then return(guess) else my_newt(f,x_new,prec))$ g: lambda([x],x^2 -2); my_newt(g,1.5,.0001); Page 39 of 42 Definisi my_newt bersifat rekursif. Artinya, definisi fungsi memanggil fungsi itu sendiri sampai presisi yang diinginkan tercapai. Dari sudut pandang kejelasan program ini adalah metode pilihan. Saat memanggil my_newt, definisi lambda fungsi harus digunakan karena nama fungsi f dipakai my_newt. 5.3 Integrasi Numerik (Numerical Integration) Maxima menyediakan satu set opsi2 untuk melakukan integrasi numerik. Untuk menggambarkan dua dari opsi2 ini, kita menggunakan fungsi di bawah ini. Hal ini dapat diintegrasikan, sehingga pendekatan numerik tidak perlu diambil, tapi kita menggunakannya sebagai dasar untuk perbandingan. (%i1) kill(all)$ f(x) := x^(1/2)*log(1/x)$ wxdraw2d( explicit(f(x), x, 0, 1) )$ integrate(f(x), x, 0, 1); float(%); (%o3) 4/9 (%i4) (%o4) 0.44444444444444 Sebuah metode yang relatif sederhana untuk menerapkannya adalah metode Romberg. Perintah Maxima romberg memiliki sintaks yang sama dengan perintah integrate. Untuk fungsi di atas, romberg tidak dapat mengevaluasi integral pada seluruh rentang karena tidak dapat menangani Page 40 of 42 f(0). Kita menggunakan f(1e-100) sebagai gantinya. Perintah romberg dapat menangani nilainilai sekecil f(1e-320). Untuk fungsi ini perintah romberg menghasilkan solusi dengan kesalahan setelah desimal keempat. Konfirmasi perpindahan nilai awal mendekati nol dengan menggunakan 1e-300 tidak mengubah hasilnya secara signifikan. %i5) romberg(f(x), x, 1e-100 , 1 );romberg(f(x), x, 1e-300 , 1 ); Sebuah metode yang lebih canggih (set metode, sebenarnya) tersedia di QUADPACK. Kita tinjau salah satu contoh, menggunakan perintah quad_qag. Perintah ini mengandung setidaknya lima argumen. (Manual Maxima mendiskusikan argumen opsional.) Empat pertama adalah sama dengan integrate dan romberg. Argumen kelima adalah kunci yang menentukan rincian metode pencarian dan tergantung pada pengetahuan user dari karakteristik fungsi itu. Dalam contoh ini quad_qag menyediakan pendekatan lebih dekat dengan nilai yang benar daripada romberg. Tiga bagian lain dari output ini: kesalahan estimasi metode (cukup kecil di sini), jumlah iterasi yang dilakukan, dan kode kesalahan (0 berarti tidak ada kesalahan). (%i7) quad_qag (f(x), x, 0, 1, 3); Teknik Romberg dapat diterapkan untuk integrasi multidimensi, seperti dalam contoh ini. Perintah assume(x > 0) dimasukkan untuk menghindari berurusan dengan dialog. Hapus baris ini dan tentukan nilai sekali lagi. (%i7) g(x, y) := x*y / (x + y); estimate : romberg (romberg (g(x, y), y, 0, x/2), x, 1, 3); assume(x > 0)$ integrate (integrate (g(x, y), y, 0, x/2), x, 1, 3); float(%); Page 41 of 42 5.4 Solusi Numerik Odes (Numerical Solution of ODEs) Beberapa persamaan diferensial biasa atau ordinary differential equations (ODEs), atau sistem ODEs, tidak dapat diselesaikan secara analitis. Solusi numerik dari sistem ini dapat memberikan wawasan yang sebaliknya, sehingga bisa diselesaikan. Sebuah contoh klasik adalah persamaan Lorenz yang digunakan untuk mewakili gerakan konvektif dari sel fluida yang dihangatkan dari bawah dan didinginkan dari atas. Set yang sama dari persamaan ini dapat diterapkan pada analisis dinamo dan sinar laser. Banyak buku menganalisis sifat sistem ini, yang paling terkenal adalah James Gleck's Chaos. Persamaan yang terdiri dari sistem ini diberi nama dxdt (for dx/dt), dydt, and dzdt.Variabel t adalah waktu. Parameter a, b, dan c semuanya positif: a disebut bilangan Prandtl, b disebut bilangan Rayleigh, dan c adalah faktor proporsionalitas. Nilai-nilai x, y, dan z bukanlah koordinat2 dalam ruang fisik. Sebaliknya nilai x sebanding dengan intensitas gerak konvektif, dan y sebanding dengan perbedaan suhu antara naik dan turunnya arus. Akhirnya, z adalah propotional dengan distorsi profil temperatur vertikal dari linearitas. Tentu saja, x, y, dan z memiliki interpretasi berbeda dalam aplikasi lain dari himpunan persamaan2 ini. (%i13) kill(all)$ a: 10$ b: 28$ c: 2.667$ dxdt : a*(y - x); dydt: x*(b - z) - y; dzdt : x*y - c*z; Sel di bawah ini menunjukkan bagaimana Maxima menggunakan metode Runge-Kutte (rk) untuk memberikan solusi numerik untuk nilai-nilai x, y, dan z pada titik-titik dalam waktu. Hasil dari 1000 solusi rk ditempatkan ke dalam daftar nama. Perintah rk memiliki argumen ini: nama (s) dari ekspresi (s), nama (s) atau variabel (s), nilai awal (s) atau variabel (s), dan domain tempat solusinya terjadi. Domain itu sendiri memiliki empat unsur: nama variabel independen (waktu, di sini), nilai awal variabel itu, nilai akhir, dan penambahan atau increment. Dalam contoh di bawah waktu berkisar dari t = 0 sampai t = 100, dengan penambahan sebesar 0,01, sehingga Maxima menghasilkan daftar 10.000 set nilai-nilai. Pertama, kedua, ke-9999, dan daftar ke-10000 nilai muncul sebagai output. Masing-masing dari keempat item menunjukkan waktu, nilai x, nilai y, dan nilai z. Page 42 of 42 (%i7) fpprintprec:5$ data: rk([dxdt, dydt, dzdt],[x,y,z],[-15,20,-5],[t,0,100,0.01])$ matrix( ["time", "x", "y", "z"], data[1], data[2], ["...", "...","...","..."], data[length(data) - 1], data[length(data)] ); Di bawah ini, kita membuat daftar dari 10.000 nilai-nilai variabel x, y, dan z dan menunjukkan interaksi mereka. Grafik menunjukkan bahwa sistem tidak cenderung ke arah satu titik, melainkan berosilasi sekitar dua titik. Titik2 ini disebut atraktor2 aneh (strange attractors). Sumbu y diberi label; posisi label x dan z dapat dideduksi. Grafik dibuat dengan titik2 opsi. Latihan yang disarankan: mengubah salah satu nilai awal dalam perintah rk dan melacak dampak2 perubahan itu. Membuat perubahan kecil. Sebagai contoh, jika nilai awal baru x menjadi 15,1 atau 14,9 dan bukan 15. Sangat instruktif untuk menghapus wx dari perintah draw dan menjalankan perintah lagi. Ini menghasilkan jendela gnuplot yang memungkinkan kita memutar grafik. Jendela ini harus ditutup sebelum wxMaxima dapat melanjutkan ke perintah selanjutnya. (%i10) uL: makelist([data[i][2],data[i][3],data[i][4]],i,1,length(data))$ wxdraw3d(view = [36, 336], ylabel = "y", xaxis=true, yaxis=true, points(uL))$