Daftar Isi:
- Langkah 1: Memahami Algoritma Bagian 1: Integral Pasti dan Penggunaannya
- Langkah 2: Memahami Algoritma Bagian 2: Pendekatan Numerik
- Langkah 3: Memahami Algoritma Bagian 3: Aturan Titik Tengah
- Langkah 4: Membuat Program Bagian 1: Mengunduh Kompilator/Editor Python
- Langkah 5: Membuat Program Bagian 2: Mengimpor Fungsi & Mendefinisikan Variabel
- Langkah 6: Membuat Program Bagian 3: Membuat Fungsi untuk Integrasi
- Langkah 7: Membuat Program Bagian 4: Menampilkan Jawabannya
- Langkah 8: Menjalankan Program Bagian 1: Menjalankan Program Seperti Apa Adanya
- Langkah 9: Menjalankan Program Bagian 2: Mengintegrasikan Fungsi Matematika Lainnya
- Langkah 10: Menjalankan Program Bagian 3: Memperluas Program
Video: Cara Membuat Program Integrasi Numerik dengan Python: 10 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
Ini adalah tutorial tentang cara membuat dan menjalankan program yang akan mengevaluasi integral tertentu menggunakan algoritma integrasi numerik. Saya telah membagi langkah-langkahnya menjadi 3 bagian: memahami algoritma yang akan digunakan untuk membuat program, mengkodekan program menggunakan bahasa pemrograman Python, dan menjalankan program. Tutorial ini ditujukan untuk seseorang yang mungkin perlu dengan cepat membuat kalkulator untuk mengevaluasi integral tertentu, atau mungkin membutuhkan algoritma untuk digunakan dalam program skala yang lebih besar. Pengetahuan kalkulus dasar diharapkan, tetapi informasi matematika yang relevan ditinjau. Pengetahuan tentang pemrograman tidak diharapkan, tetapi berguna karena saya hanya menjelaskan secara singkat bagaimana sebenarnya pemrograman itu bekerja.
Apa yang Anda perlukan:
Komputer pribadi dengan akses ke internet
Langkah 1: Memahami Algoritma Bagian 1: Integral Pasti dan Penggunaannya
Saya akan menganggap Anda tahu sedikit tentang apa itu integral dalam konteks kalkulus dasar. Integral penting karena memungkinkan Anda menjumlahkan array nilai dikalikan dengan panjang yang sangat kecil; ini berguna di banyak bidang keuangan, teori bilangan, fisika, kimia, serta banyak bidang lainnya. Program ini, bagaimanapun, hanya akan memungkinkan Anda untuk menghitung area di bawah kurva untuk interval yang terbatas, atau dengan kata lain, tidak mengevaluasi anti-turunan--algoritma yang jauh lebih kuat diperlukan untuk itu. Algoritme ini berguna jika Anda perlu mengevaluasi integral tertentu dalam program yang lebih besar yang ditentukan untuk sesuatu yang lain, atau jika Anda ingin memeriksa jawaban Anda untuk integral tertentu yang dikerjakan dengan tangan.
Integral definit dasar menyatakan luas daerah di bawah kurva yang didefinisikan oleh suatu fungsi, mis. f(x). Untuk integral tertentu, kita mencari luas antara dua titik (masing-masing diberi label a dan b). Dalam gambar, daerah pirus adalah daerah yang saya maksud, dan persamaan untuk menentukan ini juga ditunjukkan di daerah itu. Fungsi yang ditunjukkan pada gambar adalah arbitrer.
Langkah 2: Memahami Algoritma Bagian 2: Pendekatan Numerik
Komputer memerlukan serangkaian instruksi yang luas untuk menghitung area di bawah fungsi arbitrer yang akan bekerja untuk fungsi apa pun, jadi metode analitik yang mungkin Anda kenal tidak berguna karena terlalu khusus. Salah satu metode untuk menghitung integral kira-kira, yang benar-benar dapat ditangani oleh komputer, dilakukan dengan mengisi area yang diinginkan dengan jumlah persegi panjang yang ditentukan pengguna dengan lebar yang sama dan tinggi variabel kemudian menjumlahkan semua area persegi panjang. Sifat kaku dari persegi panjang akan membuat sebagian dari luas total tidak tersentuh, oleh karena itu mengapa ini dianggap sebagai pendekatan; namun, semakin banyak persegi panjang yang dapat Anda masukkan di antara batas (a dan b), semakin akurat aproksimasinya karena daerah yang tidak tersentuh menjadi lebih jarang. Karena komputer akan melakukan tugas tersebut, Anda dapat mengatur jumlah persegi panjang di wilayah yang diinginkan menjadi jumlah yang sangat besar, membuat perkiraan menjadi sangat akurat. Pada gambar pendukung, bayangkan bahwa setiap persegi panjang di area yang ditentukan memiliki lebar yang sama. Saya melakukan yang terbaik untuk membuatnya sama lebarnya di Microsoft Paint, tetapi tidak melakukan pekerjaan terbaik.
Langkah 3: Memahami Algoritma Bagian 3: Aturan Titik Tengah
Aturan ini menunjukkan bagaimana persegi panjang dibuat dan digunakan dalam pendekatan. Setiap persegi panjang dari persegi panjang "N" harus memiliki lebar yang sama, x, tetapi setiap persegi panjang ke-n tidak boleh sama persis: faktor yang bervariasi adalah tinggi yang bervariasi sebagai fungsi yang dievaluasi pada titik tertentu. Aturan titik tengah mendapatkan namanya dari fakta bahwa Anda mengevaluasi tinggi setiap persegi panjang sebagai f(x_n), di mana "x_n" adalah titik tengah masing-masing persegi panjang, seperti yang berlawanan dengan kiri atau kanan persegi panjang. Menggunakan titik tengah seperti menerapkan rata-rata yang akan membuat perkiraan lebih akurat daripada jika Anda menggunakan kanan atau kiri. Gambar pendukung untuk langkah ini merangkum bagaimana aturan titik tengah didefinisikan secara matematis.
Langkah 4: Membuat Program Bagian 1: Mengunduh Kompilator/Editor Python
Sekarang setelah Anda memahami algoritme yang perlu diterapkan, ini adalah masalah mendapatkan komputer untuk melakukan perhitungan untuk Anda. Langkah pertama untuk memberitahu komputer apa yang harus dilakukan adalah mendapatkan alat untuk melakukannya. Algoritma ini dapat dikodekan dalam bahasa apapun; untuk kesederhanaan, program ini akan dikodekan dalam bahasa Python. Untuk memerintahkan komputer Anda melakukan operasi dengan Python, Anda memerlukan editor yang mengambil instruksi yang ditulis dalam bahasa tersebut yang kemudian akan dikompilasi ke dalam bahasa mesin yang dapat dipahami komputer Anda sehingga dapat melakukan tugas yang Anda perintahkan. Di zaman sekarang ini, editor dan kompiler biasanya terintegrasi, namun tidak selalu demikian. Anda dapat menggunakan editor/kompiler apa pun yang Anda sukai, tetapi saya akan menunjukkan cara mendapatkan favorit pribadi saya untuk Python: Canopy. Jika Anda sudah memiliki editor/kompiler, Anda dapat melewati langkah-langkah ini.
- Buka
- Klik Unduh Kanopi
- Klik tombol unduh yang sesuai dengan sistem operasi Anda
Pengunduhan akan dimulai secara otomatis
- Ikuti instruksi berangsur-angsur setelah memulai file eksekusi
- Jalankan Programnya
- Klik "Editor" dari menu utama program
- Klik "buat file baru" di tengah layar
Dari titik ini Anda akan melihat jendela putih kosong dengan kursor yang menyerupai dokumen pengolah kata dasar. Anda sekarang siap untuk mulai mengkodekan algoritma integrasi numerik untuk menyelesaikan integral tertentu. Langkah selanjutnya akan memiliki potongan kode yang akan Anda salin dan penjelasan tentang apa yang dilakukan potongan tersebut untuk program secara keseluruhan.
Langkah 5: Membuat Program Bagian 2: Mengimpor Fungsi & Mendefinisikan Variabel
Salin kode pada gambar.
Untuk program apa pun yang mungkin Anda coding, akan ada variabel. Variabel adalah nama yang diberikan untuk nilai yang akan dioperasikan dan dapat berubah. Di sebagian besar bahasa pemrograman (jika tidak semua), Anda harus menginisialisasi variabel sebelum program dapat membuat perubahan padanya. Dalam kasus program ini saya telah menamai variabel "N," "a," dan "b." Nilai-nilai ini mewakili jumlah iterasi (jumlah AKA persegi panjang), batas bawah, dan batas atas masing-masing. Anda dapat menamai ini apa pun yang Anda inginkan, tetapi untuk mencocokkan rumus yang diberikan dalam "Memahami Algoritma Bagian 3: Aturan Titik Tengah," sebaiknya tetap sama. Perhatikan bahwa mereka tidak hanya disetel ke nilai tertentu. Ini karena mereka dibuat sebagai input sehingga ketika program dijalankan, pengguna program dapat menentukan apa nilainya. Teks dalam tanda kutip, setelah perintah input, muncul saat Anda menjalankan program yang memberi tahu Anda jenis nilai apa yang harus diketik. Anda juga akan melihat bahwa "int" dan "float" digunakan sebelum penunjukan input. Istilah-istilah ini memberi tahu komputer jenis variabel apa yang akan menjadi nilai ini. Sebuah "int" adalah bilangan bulat, dan "float" adalah nilai floating point (yaitu desimal). Harus jelas mengapa ini ditunjuk seperti itu.
Teks apa pun yang ada setelah "#" adalah komentar yang memungkinkan pemrogram untuk mengikuti kode dengan cara yang manusiawi; Saya telah membuat komentar tertentu dalam kode saya yang akan Anda salin, tetapi jangan ragu untuk menambahkan komentar apa pun yang membantu Anda secara khusus. Program tidak akan membaca apa pun dengan "#" sebelumnya sebagai perintah.
Bagian kode yang berbunyi "from math import *" memberitahu program untuk mengimpor array fungsi matematika yang dapat digunakan tanpa harus memprogramnya sendiri. Tanda "*" hanya berarti "semua". Baca bagian kode ini sebagai: dari perpustakaan matematika, impor semua fungsi. Ini memungkinkan Anda untuk menggunakan fungsi matematika seperti sinus, kosinus, log, exp, dll. Fungsi ini dapat diintegrasikan secara matematis dalam kode.
Langkah 6: Membuat Program Bagian 3: Membuat Fungsi untuk Integrasi
Salin kode pada gambar di bawah kode sebelumnya.
PERINGATAN: Bagian ini padat, dan saya ingin menjernihkan beberapa hal yang berpotensi membingungkan. Ketika berbicara tentang pemrograman, kata "fungsi" banyak muncul. Istilah ini juga banyak muncul ketika Anda berbicara tentang matematika. Jadi, mulai saat ini, ketika saya berbicara tentang fungsi dalam pengertian pemrograman, saya akan menulis "Fungsi Python," dan ketika saya berbicara tentang fungsi matematika, saya akan mengatakan "fungsi matematika." Pada titik tertentu kita akan menggunakan fungsi Python sebagai representasi untuk fungsi matematika yang dimaksud.
Potongan kode berikutnya adalah inti dari program. Di sini, fungsi Python didefinisikan yang menjalankan algoritma integrasi numerik menggunakan aturan titik tengah. "def Integrate(N, a, b)" dibaca sebagai: mendefinisikan fungsi yang disebut "Integrate" yang menerima variabel "N, " "a, " dan "b, " dan mengembalikan area di bawah kurva (fungsi matematika) yang juga didefinisikan dalam fungsi Python "Integrate". Anda dapat memanggil fungsi Python ini apa saja ketika Anda melakukan pengkodean, tetapi masuk akal untuk menyebutnya integrasi karena ini adalah fungsi yang memang mengintegrasikan fungsi matematika.
Pada titik ini perlu dikomentari bagaimana Python memisahkan blok kode. Sebuah blok kode adalah seluruh bagian yang melakukan tugas tertentu. Bahasa pemrograman yang berbeda akan memiliki cara khusus untuk membedakan "blok" ini. Untuk Python, sebuah blok dibedakan dengan lekukan: setiap bagian yang menjalankan tugas memiliki indentasinya sendiri, dan bisa ada blok indentasi di dalam blok indentasi lainnya. Ini mewakili tugas dalam tugas, dan pada dasarnya memberi tahu urutan kode yang perlu dieksekusi. Dalam kasus fungsi Python yang didefinisikan "Integrate," semua yang ada di dalam fungsi itu diindentasi satu blok sehingga membedakan tugas-tugas yang akan dieksekusi dalam fungsi itu. Ada bagian indentasi dalam fungsi Python ini yang melakukan tugas mereka sendiri juga. Ini berjalan sebagai berikut: perintah (tugas) ditetapkan, titik dua mengikuti perintah, dan apa yang dilakukan perintah diindentasi di bawahnya.
Segera setelah mendefinisikan fungsi Python "integrasi", Anda akan mendefinisikan fungsi Python lain yang disebut f(x). Ini mewakili fungsi matematika yang akan diintegrasikan. Untuk setiap fungsi matematika berbeda yang ingin Anda integrasikan, Anda harus mengambil baris program ini untuk mengubahnya (tidak seperti variabel yang ditentukan saat program dijalankan). Setiap fungsi Python akan memiliki nilai kembalian, inilah fungsi yang dikembalikan saat Anda memberikan nilai. Dalam hal ini nilai yang dilemparkan adalah "x," dan istilah "x" ini akan mengambil nilai dari apa pun yang Anda lemparkan--ini adalah nilai sementara.
Selanjutnya, for-loop bertindak sebagai penjumlahan yang didefinisikan dalam rumus di bagian "Memahami Algoritma" dari tutorial ini. Penjumlahan ini membutuhkan beberapa variabel lagi, salah satunya akan bertindak sebagai nilai balik untuk seluruh fungsi Python "Integrate". Sebelum for-loop, saya telah menetapkan variabel-variabel ini sebagai "nilai", dan "nilai2". tugas for-loop adalah untuk melakukan iterasi pada rentang nilai untuk variabel yang ditunjuk, yang dapat dengan mudah didefinisikan dalam perintah for-loop; dalam hal ini, variabel itu adalah "n." Rentang dimana iterasi terjadi adalah 1 sampai N+1. Anda harus memperhatikan bahwa penjumlahan yang didefinisikan dalam rumus yang disebutkan di atas hanya berkisar dari 1 hingga N. Kami mendefinisikannya dengan cara ini karena bahasa Python menghitung setiap nilai yang diulang mulai dari nol, jadi pada dasarnya kami harus menggeser rentang nilai agar sesuai dengan keinginan kami. jangkauan. For-loop kemudian memungkinkan penjumlahan semua tinggi persegi panjang bersama-sama dan menyimpan nilai itu ke dalam variabel yang saya sebut "nilai." Hal ini terlihat pada potongan kode yang muncul sebagai: nilai += f(a+((n-(1/2))*((b-a)/N))).
Dari sana, potongan kode berikutnya menggunakan variabel yang disebut "value2" yang kemudian ditetapkan sebagai jumlah semua tinggi setiap persegi panjang dikalikan dengan lebar standar setiap persegi panjang--ini adalah jawaban akhir yang kita inginkan ditampilkan oleh program kami, dan dengan demikian merupakan nilai pengembalian dari fungsi Python "Integrate".
Langkah 7: Membuat Program Bagian 4: Menampilkan Jawabannya
Salin kode pada gambar di bawah kode sebelumnya.
Sekarang jawabannya dapat diperoleh melalui fungsi Python "Integrate", kami ingin dapat menampilkannya. Ini hanya masalah menempatkan nilai yang dimasukkan oleh pengguna ("N, " "a, " dan "b") ke dalam fungsi Python "Integrate" dan mencetaknya di layar. Perintah ini ditampilkan pada baris 21, dan hanya itu yang perlu Anda lakukan untuk menyelesaikan langkah ini. Kode pada baris 19 dan 20 hanya ada untuk "mempercantik" output dari keseluruhan program. "print("……………………….")" memisahkan bagian input program dari bagian output, dan "print("Inilah jawaban Anda: ")" hanyalah sebutan bahwa jawabannya akan dicetak setelah baris teks tersebut.
Langkah 8: Menjalankan Program Bagian 1: Menjalankan Program Seperti Apa Adanya
Jika Anda tidak menggunakan Canopy, Anda mungkin tidak perlu mengikuti langkah ini sama sekali dan menjalankan program mungkin memerlukan prosedur yang berbeda. Di Canopy, sebelum Anda dapat menjalankan program, Anda harus menyimpannya. Jenis file untuk program Python adalah file.py--secara otomatis disimpan sebagai ini. Pilih di mana Anda ingin file disimpan, maka Anda akan dapat menjalankan program.
Menjalankan Program:
- Tekan tombol hijau yang terlihat seperti "tombol putar" yang terletak di bilah alat tepat di atas tempat nama file Anda muncul (lihat gambar).
- Program kemudian akan berjalan di layar bawah editor yang dikenal sebagai lingkungan analisis data Canopy. Dengan asumsi Anda menyalin perintah seperti yang saya tulis, Anda akan melihat di bagian bawah lingkungan analisis data Canopy prompt: "Masukkan berapa kali Anda ingin menjumlahkan (lebih banyak = lebih akurat):." (lihat gambar)
- Masukkan nilai berapa kali Anda ingin melakukan iterasi yaitu 10.000 (berapa banyak persegi panjang yang ingin Anda masukkan ke area Anda), lalu tekan enter.
- Prompt lainnya akan muncul dengan pernyataan yang seharusnya merupakan prompt input yang sudah Anda kodekan ke dalam program pada langkah 5. Isilah dengan tepat seperti pada nomor 3 di atas.
- Integral harus dievaluasi, dan hasilnya akan muncul.
Jika Anda mengkodekan program seperti yang ditunjukkan pada gambar sebelumnya, Anda baru saja mengintegrasikan f(x) = x^2 melewati beberapa batas. Integral x^2 mudah untuk dievaluasi dengan tangan, oleh karena itu Anda harus memeriksa dan memastikan program memberikan jawaban yang sangat mendekati nilai analitik yang benar yang ditentukan dengan tangan. Ketika saya menjalankan program dengan nilai N = 10000, a = 0, dan b = 10, saya mendapatkan jawaban 333.33333249999964. Jawaban analitis yang benar adalah 333.333. Ini sangat akurat dan cepat. Anda pada dasarnya telah meremas 10.000 persegi panjang antara 0 dan 10 pada sumbu x dan menggunakannya untuk memperkirakan area di bawah kurva x^2!
Langkah 9: Menjalankan Program Bagian 2: Mengintegrasikan Fungsi Matematika Lainnya
Pada langkah sebelumnya, jika Anda telah mengikuti dengan setia, Anda mengintegrasikan f(x) = x^2. Itu bukan satu-satunya fungsi matematika yang dapat diintegrasikan oleh program ini. Ingat dari langkah 5 Anda mengimpor larik perpustakaan matematika fungsi Python ke dalam program. Ini memungkinkan Anda untuk menggunakan fungsi matematika yang lebih rumit yang dapat diintegrasikan. Mari kita coba. Tentu saja, Anda dapat menggunakan fungsi apa pun yang Anda inginkan, tetapi saya akan menunjukkan lebih lanjut keakuratan kode ini dengan mengintegrasikan fungsi matematika tertentu yang menghasilkan nilai yang diketahui saat diintegrasikan pada rentang tertentu. Fungsi tersebut adalah f(x) = Sin[x]. Fungsi matematika ini ditampilkan pada gambar pertama yang menyertainya, diplot dari 0 hingga 2π, dan area yang diinginkan diarsir dengan warna pirus. Ada jumlah area positif yang sama dengan area negatif dalam interval ini, jadi jika Anda menjumlahkan total area, Anda akan mendapatkan nol. Mari kita lihat apakah ini benar-benar terjadi:
Masukkan fungsi matematika f(x) = Sin[x] ke dalam program:
- Sebelum menjalankan program lagi, di bawah komentar "#ketik fungsi Anda setelah kembali," ketik: sin(x) di mana x**2 saat ini berada. (lihat gambar).
- Jalankan program dengan menekan tombol play hijau lagi.
- Ketik 10000 untuk nilai N (berapa kali Anda ingin menjumlahkan).
- masukkan "0" untuk batas bawah.
- Masukkan 6.2832 untuk batas atas (kira-kira 2π).
- Lihat nilai apa yang Anda dapatkan.
Ketika saya melakukan ini, saya akhirnya mendapatkan nilai 1.079e-10: ini sama dengan.0000000001079, yang benar-benar mendekati nol, sehingga tampaknya akurat, dan menunjukkan bahwa algoritme menangani area negatif secara memadai.
Langkah 10: Menjalankan Program Bagian 3: Memperluas Program
Pada titik ini Anda selesai: Anda memiliki algoritma integral tertentu yang berfungsi yang dikodekan dengan Python yang berjalan dengan lancar dan memberikan jawaban yang sangat akurat. Namun, program ini dapat ditingkatkan. Saya bukan seorang programmer, dan saya memiliki pengalaman minimal dengan Python. Sebenarnya, saya harus menyegarkan diri saya dalam menggunakan Python untuk menyelesaikan tutorial ini, tetapi itu akan memberi Anda kepercayaan diri bahwa Python adalah bahasa yang mudah dipelajari. Maksud saya adalah Anda dapat mengembangkan program ini dengan membuatnya lebih efisien, mungkin menerapkan beberapa GUI, dan membuatnya lebih ramah pengguna.
Pikiran saya tentang perluasan program:
- Menerapkan antarmuka pengguna grafis yang memungkinkan Anda menjalankan program tanpa menggunakan lingkungan analisis data interaktif Canopy
- Jadikan agar fungsi matematika yang akan diintegrasikan tidak harus diinput di dalam program, tetapi bisa diinput setelah program dijalankan (saya awalnya mencoba melakukan ini, tetapi tidak bisa mengetahuinya).
- Definisikan fungsi Python "Integrate" sehingga dibutuhkan fungsi f(x) sebagai pengganti fungsi f(x) yang didefinisikan di dalamnya.
Ini hanya beberapa contoh area perbaikan, tapi saya jamin ada banyak area lain yang bisa ditingkatkan. Jadi saya meninggalkan langkah ini sebagai contoh kekurangan yang dimiliki program ini dan mungkin sebagai latihan bagi siapa saja yang ingin meningkatkan program lebih lanjut.
Direkomendasikan:
TAMPILAN Alfa-numerik BESAR: 7 Langkah (dengan Gambar)
TAMPILAN Alfa-numerik BESAR: Ada beberapa pilihan jika Anda membutuhkan tampilan yang dapat dilihat dari seberang ruangan, tampilan besar. Anda dapat membuatnya seperti 'time squared' atau 'led on glass' saya tetapi ini membutuhkan waktu sekitar 40 jam kerja yang membosankan. Jadi di sini adalah MUDAH untuk membuat tampilan besar. NS
Status Kicker Sederhana dan Sistem Reservasi Dengan Integrasi Slack: 12 Langkah (dengan Gambar)
Status Kicker Sederhana dan Sistem Reservasi Dengan Integrasi Slack: Di perusahaan tempat saya bekerja ada meja kicker. Perusahaan menempati banyak lantai dan untuk beberapa karyawan membutuhkan waktu hingga 3 menit untuk sampai ke meja dan…menyadari bahwa meja sudah ditempati.Oleh karena itu muncul ide untuk membangun sebuah ki
Kontrol Tirai Dengan ESP8266, Integrasi Google Home dan Openhab dan Kontrol Web: 5 Langkah (dengan Gambar)
Kontrol Tirai Dengan ESP8266, Integrasi Google Home dan Openhab dan Kontrol Web: Dalam Instruksi ini saya menunjukkan kepada Anda bagaimana saya menambahkan otomatisasi ke tirai saya. Saya ingin dapat menambah dan menghapus otomatisasi itu, jadi semua instalasi adalah clip on. Bagian utama adalah: Motor stepper Driver stepper dikendalikan bij ESP-01 Gear dan pemasangan
Menggunakan Keypad Numerik Dengan Arduino: 4 Langkah
Menggunakan Keypad Numerik Dengan Arduino: Keypad numerik dapat memberikan alternatif pengguna akhir yang sederhana untuk berbagai antarmuka untuk proyek Anda. Atau jika Anda membutuhkan banyak tombol, mereka dapat menghemat banyak waktu terkait konstruksi. Kami akan menjalankan menghubungkan mereka, menggunakan Arduino l
Cara Membuat Kalender Kakek & Scrapbook (Bahkan Jika Anda Tidak Tahu Cara Membuat Scrapbook): 8 Langkah (dengan Gambar)
Cara Membuat Kalender Kakek & Scrapbook (bahkan Jika Anda Tidak Tahu Cara Membuat Scrapbook): Ini adalah hadiah liburan yang sangat ekonomis (dan sangat dihargai!) untuk kakek-nenek. Saya membuat 5 kalender tahun ini dengan harga masing-masing kurang dari $7. Bahan: 12 foto bagus anak Anda, anak-anak, keponakan, anjing, kucing, atau kerabat lainnya12 bagian berbeda