
Sebagian besar mungkin memiliki pertanyaan yang masuk akal: mengapa?
Dari sudut pandang pragmatis tidak perlu) Anda selalu dapat menggunakan Tungsten bersyarat, dan jika Anda perlu melakukan ini dengan python, maka gunakan modul khusus yang tidak begitu sulit untuk dikuasai.
Tetapi jika Anda tiba-tiba diberi tugas seperti itu atau Anda benar-benar menyukai pemrograman, seperti saya, maka Anda akan memiliki jam yang menyenangkan - dan kadang-kadang tidak terlalu banyak - menulis program dan men-debug-nya)
Saat menulis karya ini, kami benar-benar membutuhkan debugging langkah demi langkah, jadi silakan unduh PyCharm, VS, atau yang lainnya dengan fitur ini. Untuk membangun tabel, kurangnya fungsi ini tidak terlalu penting, tetapi untuk merencanakan ...
Jadi, apa yang akan menjadi program saya. Pada input, dibutuhkan tiga nilai: awal dan akhir segmen di mana kita ingin melihat fungsi kita dan langkah yang akan kita gunakan. Selanjutnya, kita akan menggambar tabel nilai fungsi di setiap titik dari rentang nilai yang ditentukan oleh data input. Nah, maka kita akan menggambar grafik fungsi itu sendiri dengan sumbu y bergerak.
Jadi ayo pergiUntuk mulai dengan, saya akan mendeklarasikan beberapa fungsi yang nilainya akan kita pertimbangkan. Secara khusus saya akan mengambil cukup sederhana
from math import sqrt def y1(x): return x**3 - 2*x**2 + 4*x - 8 def y2(x): return 1 - 1/x**2 def y3(x): return sqrt(abs(y1(x)*y2(x)))
Sekarang kami memiliki tiga fungsi, dua di antaranya memiliki break point. Dari modul matematika, yang menyimpan semua roti matematika (termasuk cosinus, arctangents, dan trigonometri lainnya), kami mengimpor sqrt, yaitu, akar kuadrat. Kita membutuhkannya untuk membaca fungsi y3.
Setelah itu, kita perlu membaca rentang fungsi dengan x dan langkah yang kita lewati rentang ini. Untuk ini, saya akan menggunakan peta.
Sebagai parameter pertama, fungsi ini mengambil beberapa fungsi yang entah bagaimana mengubah data yang kita butuhkan, dan sebagai argumen kedua, beberapa jenis lembar data yang perlu kita proses
from_x, to_x, pace_x = map(float, input("Enter the first and the last"\ " x-coordinates and a pace dividing them by a"\ " space:").split())
Kami membaca tiga nilai yang dimasukkan melalui spasi, membaginya menjadi elemen dengan spasi (menggunakan metode split, yang, ketika dipanggil tanpa parameter, akan secara otomatis membagi string yang Anda tentukan dengan spasi). Data yang dimasukkan menggunakan input () secara default akan menjadi tipe str, yaitu string, jadi kami tidak akan memiliki kesalahan di sini.
Karena angka batas rentang bisa pecahan, kami mengkonversi setiap elemen dari array yang dihasilkan menjadi bilangan real menggunakan fungsi float.
Perhatikan bahwa variabel dideklarasikan tanpa menentukan tipe data. Itu ditentukan secara otomatis (tipe data dari nilai yang Anda coba tetapkan ke variabel), atau menggunakan fungsi str, int, float, dll. diatur secara manual oleh variabel, menerapkan fungsi-fungsi yang sama ini ke nilai-nilai. Variabel yang sama dapat memiliki tipe data yang berbeda di seluruh program - cukup berikan nilai baru dengan tipe data yang berbeda.
Sebagai contoh
auxiliary_variable = ""
Mari kita kembali ke program kita. Kita perlu memeriksa apakah data yang dimasukkan sudah benar.
Program harus mencetak bahwa data yang dimasukkan salah jika:
- langkahnya adalah 0
- batas bawah rentang lebih besar daripada batas atas, dan langkahnya positif (yaitu, kami memiliki perkembangan aritmatika dari bentuk xn = from_x + pace_x * (n - 1) , di mana from_x> ke_x . Karena laju_x> 0, perkembangan ini akan meningkat dan kami tidak pernah mendapatkan to_x )
- batas bawah kisaran kurang dari yang atas, dan langkahnya negatif (alasan yang sama)
- grafik yang terdiri dari satu titik tidak informatif, oleh karena itu segmen di mana kita membangun fungsi harus mengandung setidaknya dua nilai
Kami merumuskan kondisi ini dalam kode. Jelas, item pertama mudah diatur. Yang kedua dan ketiga dapat digabungkan menjadi satu, jika Anda perhatikan bahwa tanda perbedaan antara yang pertama (from_x) dan yang terakhir (to_x) harus bertepatan dengan tanda langkah. Nah, poin keempat juga tidak begitu rumit: modulus perbedaan nilai pertama dan terakhir harus tidak kurang dari modul langkah.
Karena modul, kita mungkin memiliki situasi di mana tanda-tanda perbedaan dan langkah tidak akan bersamaan, tetapi kondisi kedua akan memotong kasus-kasus ini, sehingga kondisinya benar.
Akibatnya, ketiga kondisi ini akan terlihat seperti ini:
if (pace_x != 0) and (to_x - from_x)*pace_x >= 0 and abs(to_x - from_x):
Kami melanjutkan langsung ke meja. Untuk memudahkan debugging, saya akan membuat beberapa variabel dengan nama yang berbicara yang akan bertanggung jawab atas keakuratan angka, jumlah spasi sebelum angka, jumlah spasi setelah angka, dll.
dials_precision = "%10.6g"
Jadi apa yang terjadi di sini?

dials_precision = "%10.6g"
di baris ini saya mengatur ketepatan angka. Maksimal 10 karakter untuk seluruh angka dan 6 karakter untuk bagian fraksional. Jika kami memiliki nilai terlalu besar untuk rentang ini, maka semua jenis
e-15 atau yang serupa akan muncul.
spaces_in_the_title = int((int(dials_precision[1:3])) / 2)
dials_precision adalah string, jadi kita dapat mengambil sepotong string ini, yaitu, semacam substring. Dalam hal ini, kita perlu mendapatkan angka 10, jadi kita ambil karakter pada indeks 1 dan 2, kita ubah substring ini menjadi tipe data integer, bagi dengan dua dan bulatkan ke bawah.
Kami membutuhkan variabel ini agar prasasti dalam judul tabel dipusatkan pada sel
length_of_table_lower_bound = (int(dials_precision[1:3]) + 2) * 4 + 5
seperti namanya, variabel ini bertanggung jawab untuk panjang batas bawah sel tabel nilai fungsi. Secara total, angka tersebut menempati 10 posisi, yang berarti kolom tidak boleh kurang dari 10 lebar. Ketika kita mendapatkan angka dengan format e-15 (dijelaskan di atas), nilainya mengambil 11-12 posisi. Oleh karena itu, ke 10 kita tambahkan deuce lain.
4 bertanggung jawab atas jumlah kolom (x, y1, y2, y3), dan 5 adalah untuk jumlah karakter yang membatasi sel dalam satu baris.
Sisa variabel tampaknya intuitif, jadi mari kita lanjutkan untuk mencetak pelat
print("|" + (spaces_in_the_title + 1) * delimiter + 'x' + spaces_in_the_title * delimiter + '|' + spaces_in_the_title * delimiter + "y1" +\ spaces_in_the_title* delimiter\ + '|' + spaces_in_the_title * delimiter + 'y2'\ + spaces_in_the_title * delimiter + '|' +\ spaces_in_the_title * delimiter\ + "y3" + spaces_in_the_title * delimiter + "|\n"\ + length_of_table_lower_bound * '-')
jika kita menghubungkan semua kode yang sudah kita tulis, maka di konsol kita akan melihat ini:

Sekarang kita perlu mencetak nilainya sendiri. Untuk melakukan ini, Anda perlu perulangan. Karena data yang dimasukkan mungkin fraksional,
rentang penggunaan tidak akan berfungsi, jadi saya akan menggunakan loop reguler.
Karena kita dapat memiliki urutan menurun dari X dan yang meningkat, kondisi siklus harus diatur sehingga kedua opsi ini diperhitungkan. Kami memiliki variabel yang dibuat sebelumnya yang menyimpan jawaban tentang sifat urutan dalam bentuk 0 atau 1. Oleh karena itu, cukup untuk mempertimbangkan dua kasus dan memilih kondisi yang sesuai untuk masing-masing
while(is_sequence_decreasing and x_copy >= to_x) or\ (not is_sequence_decreasing and x_copy <= to_x):
Karena untuk grafik kita membutuhkan minimum dan maksimum dari grafik y1, yang akan kita gambar, kami memperkenalkan variabel khusus yang akan bertanggung jawab untuk min dan maks
y1_cur_value = y1(x_copy) min_y1_value = (min_y1_value > y1_cur_value) * y1_cur_value + \ (min_y1_value <= y1_cur_value) * min_y1_value max_y1_value = (max_y1_value < y1_cur_value) * y1_cur_value + \ (max_y1_value >= y1_cur_value) * max_y1_value negative_value_exists += y1_cur_value < 0
konstruksi pada dasarnya mengulangi konstruksi
if: ... else: ... , hanya melalui ketidaksetaraan Boolean.
y1_cur_value menyimpan nilai fungsi saat ini. Saya membuat variabel agar tidak terus-menerus memanggil fungsi ketika nilainya pada suatu titik diperlukan.
Kita juga membutuhkan keberadaan nilai negatif untuk merencanakan.

Sekarang langsung cetak nilainya. Saya ingin semuanya menjadi indah dan terpusat di setiap sel, jadi saya harus memproses setiap nilai secara manual untuk memeriksa panjang angka dan memilih jumlah ruang tergantung padanya untuk menyelaraskan nilainya.
Catatan
Memusatkan nomor secara harfiah tidak akan berfungsi. Variabel yang bertanggung jawab atas akurasi memiliki parameter g. Dia mengatakan bahwa sejumlah posisi untuk nomor dicadangkan untuk nomor (dalam kasus kami, 10 secara default). Jika 10 digit tidak diputar, maka posisi kosong akan terletak di sebelah kiri posisi yang diisi. Karena itu, kami hanya dapat memusatkan deretan 10 posisi.
aux_x = dials_precision % x_copy aux = len(aux_x) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_x) == int(dials_precision[1:3]) + 1 print('|' + delimiter * aux + aux_x + delimiter * (aux - aux_2) + '|', end='')
aux_x - string yang sudah dibawa ke tampilan dengan presisi yang diberikan. Sekarang kita perlu memeriksa panjang angka dan memilih jumlah spasi yang diperlukan. Karena lebih dari satu ruang di setiap sisi tidak diperlukan, maka variabel
bool eva sempurna sebagai penjaga jumlah ruang yang sama ini.
aux_2 menangkap case ketika panjang angkanya 11.
Kami juga melakukan untuk nilai-nilai dari tiga fungsi
aux_y1 = dials_precision % y1_cur_value aux = len(aux_y1) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y1) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y1 + delimiter * (aux - aux_2) + '|', end='') if (x_copy != 0): aux_y2 = dials_precision % y2(x_copy) aux = len(aux_y2) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y2) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y2 + delimiter * (aux - aux_2) + '|', end='') aux_y3 = dials_precision % y3(x_copy) aux = len(aux_y3) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y3) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y3 + delimiter * (aux - aux_2) + \ "|\n" + length_of_table_lower_bound * '-') else: print((spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + '|' \ + (spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + "|\n" \ + length_of_table_lower_bound * '-') x_copy += pace_x
Seperti yang saya katakan di awal, fungsi kedua dan ketiga memiliki titik istirahat - kedua fungsi tidak ada pada titik x = 0. Oleh karena itu, kita juga perlu menangkap kasus ini.
Nah, jangan lupa untuk meningkatkan nilai x saat ini sehingga kita tidak mendapatkan siklus tanpa akhir.
Mari kumpulkan semua kode dalam satu program dan jalankan, misalnya, pada pengujian -1.2 3.6 0.3

from math import sqrt def y1(x): return x**3 - 2*x**2 + 4*x - 8 def y2(x): return 1 - 1/x**2 def y3(x): return sqrt(abs(y1(x)*y2(x))) from_x, to_x, pace_x = map(float, input("Enter the first and the last"\ " x-coordinates and a pace dividing them by a"\ " space:").split()) if (pace_x != 0) and (to_x - from_x)*pace_x >= 0 and abs(to_x - from_x): dials_precision = "%10.6g"
Di bagian kedua dari ciptaan ini, kami akan membuat grafik
Dilanjutkan ...