math moduli: ildiz, π va trigonometriya
Bu bobda
- modulni uch xil usulda
importqilishni sqrt,pi,floor,ceil,hypot,sin,cos,logkabi funksiyalarni- yaxlitlashning to'rt xil usulini farqlashni
math domain errornimani anglatishinirandombilan tasodifiy son olishni
Boshlanishiga: Toshkentdan Samarqandgacha necha km?
Ikki shaharning xaritadagi koordinatalarini (kenglik va uzunlik) bilsak (Toshkent: 41.3111, 69.2797; Samarqand: 39.6270, 66.9750), ular orasidagi to'g'ri chiziqli masofani hisoblay olamiz. Yer shar shaklida bo'lgani uchun bu yerda trigonometriya kerak bo'ladi. Formulani hozir yodlash shart emas, bob oxirida undagi har bir funksiyani tushunasiz.
import math f1 = math.radians(41.3111) l1 = math.radians(69.2797) f2 = math.radians(39.6270) l2 = math.radians(66.9750) h = math.sin((f2 - f1) / 2) ** 2 + math.cos(f1) * math.cos(f2) * math.sin((l2 - l1) / 2) ** 2 masofa = 2 * 6371 * math.asin(math.sqrt(h)) print(f"Toshkent - Samarqand: {masofa:.0f} km (to'g'ri chiziq bo'yicha)")
Toshkent - Samarqand: 270 km (to'g'ri chiziq bo'yicha)
Yo'l bo'yicha masofa ko'proq (taxminan 300 km), chunki yo'l to'g'ri emas. Bu formula haversine deyiladi: navigatorlar, taksi va yetkazib berish ilovalari aynan shunday hisoblaydi.
Modul nima va uni qanday ulash kerak?
Modul — tayyor funksiyalar to'plami. Python bilan birga yuzlab modul keladi, math — shulardan biri. Uni ishlatishdan oldin import qilish kerak. Uch xil usul bor:
import math print(math.sqrt(16))
4.0
from math import sqrt, pi print(sqrt(16), pi)
4.0 3.141592653589793
from math import * print(sqrt(16), floor(2.7))
4.0 2
| Usul | Qanday chaqiriladi | Qachon yaxshi |
|---|---|---|
import math |
math.sqrt(16) |
Tavsiya etiladi. Funksiya qayerdan kelgani aniq ko'rinadi |
from math import sqrt |
sqrt(16) |
Bir-ikki funksiya ko'p ishlatilsa |
from math import * |
sqrt(16) |
Faqat sinash uchun. Nomlar aralashib ketadi |
Modul nomini xato yozish yoki import ni unutish
print(mat.sqrt(25))
NameError: name 'mat' is not defined
mat emas, math. Python mat degan nomni topmadi. Agar import math qatorini umuman yozmasangiz, xuddi shu xato chiqadi: name 'math' is not defined. Jupyterda daftarni qayta ochganda import katagini birinchi bo'lib ishga tushiring.
Ildiz va daraja
import math print(math.sqrt(49)) print(math.sqrt(2)) print(49 ** 0.5)
7.0 1.4142135623730951 7.0
math.sqrt() har doim float qaytaradi, hatto ildiz butun chiqsa ham (7.0). Butun ildiz kerak bo'lsa: math.isqrt(50) → 7 (kasrini tashlaydi).
Manfiy sondan ildiz olib bo'lmaydi:
import math print(math.sqrt(-9))
ValueError: math domain error
math domain error — "matematik aniqlanish sohasidan tashqari". Xuddi shunday xato math.log(0) va math.log(-1) da ham chiqadi.
π, e va boshqa konstantalar
import math print(math.pi) print(math.e) print(math.tau)
3.141592653589793 2.718281828459045 6.283185307179586
math.tau = 2π. Mashqlarda π = 3.14 deb hisoblash so'ralsa, 3.14 yozing. Aks holda doim math.pi ishlating, u ancha aniq.
import math r = 5 print("3.14 bilan:", 2 * 3.14 * r) print("math.pi bilan:", 2 * math.pi * r)
3.14 bilan: 31.400000000000002 math.pi bilan: 31.41592653589793
Yaxlitlashning to'rt yo'li
Bu jadval ko'p savolga javob beradi. Ikki son: 2.7 va -2.7.
import math x = 2.7 print(math.floor(x), math.ceil(x), math.trunc(x), int(x), round(x)) x = -2.7 print(math.floor(x), math.ceil(x), math.trunc(x), int(x), round(x))
2 3 2 2 3 -3 -2 -2 -2 -3
Chiqish tartibi: floor, ceil, trunc, int, round.
| Funksiya | Nima qiladi | 2.7 | -2.7 |
|---|---|---|---|
math.floor(x) |
pastga (kichik tomonga) | 2 | -3 |
math.ceil(x) |
yuqoriga (katta tomonga) | 3 | -2 |
math.trunc(x), int(x) |
kasrni tashlaydi (nol tomonga) | 2 | -2 |
round(x) |
eng yaqin butun songa | 3 | -3 |
ceil qayerda kerak?
45 ta talaba bor, avtobusga 20 kishi sig'adi. Nechta avtobus kerak?
import math talaba = 45 print(talaba / 20) print(math.ceil(talaba / 20), "ta avtobus")
2.25 3 ta avtobus
2.25 avtobus bo'lmaydi, 3 ta kerak. Bunday hollarda doim yuqoriga yaxlitlanadi.
Modul, faktorial, EKUB
import math print(abs(-7.5)) print(math.factorial(5)) print(math.gcd(48, 36)) print(math.lcm(4, 6))
7.5 120 12 12
abs()— modul,mathsiz ham ishlaydi.factorial(5)= 1·2·3·4·5 = 120.gcd— eng katta umumiy bo'luvchi (EKUB),lcm— eng kichik umumiy karrali (EKUK).
Masofa va gipotenuza
To'g'ri burchakli uchburchakning katetlari 3 va 4 bo'lsa, gipotenuza √(3² + 4²) = 5. math.hypot() buni bitta chaqiruvda qiladi:
import math print(math.sqrt(3 ** 2 + 4 ** 2)) print(math.hypot(3, 4))
5.0 5.0
Tekislikdagi ikki nuqta orasidagi masofa — xuddi shu formula: √((x₂−x₁)² + (y₂−y₁)²). Uni math.dist() ham hisoblaydi:
import math print(math.hypot(4 - 1, 6 - 2)) print(math.dist((1, 2), (4, 6)))
5.0 5.0
Trigonometriya: radian va gradus
math.sin(), math.cos(), math.tan() burchakni radianda kutadi, gradusda emas. Bu eng ko'p uchraydigan xato:
import math print(math.sin(30)) print(math.sin(math.radians(30)))
-0.9880316240928618 0.49999999999999994
sin(30°) = 0.5 bo'lishi kerak. Birinchi qatorda Python 30 radian ning sinusini hisobladi va -0.988 chiqdi. Ikkinchi qatorda burchak avval math.radians() bilan radianga o'girildi va 0.49999999999999994 chiqdi — bu 0.5, faqat kasr sonlarning kichik xatosi bilan (pastdagi eslatmaga qarang).
Teskarisi — math.degrees():
import math print(math.radians(180)) print(math.degrees(math.pi / 2))
3.141592653589793 90.0
Nolga juda yaqin, lekin nol emas
import math print(math.sin(math.pi)) print(round(math.sin(math.pi), 10))
1.2246467991473532e-16 0.0
sin(π) = 0 bo'lishi kerak, lekin π ning o'zi taqriban saqlangani uchun 1.22e-16 chiqadi (0.000...0122). Bu 3-bobdagi 0.1 + 0.2 bilan bir xil sabab. Chiqarishda yaxlitlang.
Logarifm va eksponenta
import math print(math.log10(1000)) print(math.log2(1024)) print(math.log(math.e)) print(math.exp(1))
3.0 10.0 1.0 2.718281828459045
math.log(x) — natural logarifm (asosi e). Boshqa asos uchun ikkinchi qiymat beriladi: math.log(81, 3) = 4.0.
Kasrlarni to'g'ri solishtirish: isclose
3-bobda abs(x - 0.3) < 1e-9 deb yozgan edik. math da buning tayyor funksiyasi bor:
import math print(0.1 + 0.2 == 0.3) print(math.isclose(0.1 + 0.2, 0.3))
False True
min, max, sum
Bular math ga kirmaydi, Pythonning o'zida bor, lekin hisob-kitobda ko'p kerak:
print(min(7, 3, 9)) print(max(7, 3, 9)) print(sum((7, 3, 9)))
3 9 19
sum() ga sonlarni qavs ichida to'plam sifatida beramiz. Ro'yxatlarni 9-bobda o'rganamiz.
random: tasodifiy sonlar
O'yinlar, test savollarini aralashtirish, tasodifiy g'olib tanlash uchun random moduli bor:
import random random.seed(7) print(random.randint(1, 6)) print(random.randint(1, 6)) print(random.random()) print(random.choice(("olma", "anor", "behi")))
3 2 0.3948234964231735 olma
randint(1, 6)— 1 dan 6 gacha (6 ham kiradi) butun son, xuddi o'yin kubigi.random()— 0 va 1 orasida kasr son.choice(...)— berilganlardan bittasini tanlaydi.seed(7)— tasodifni takrorlanadigan qiladi. Kitobda natija har safar bir xil chiqishi uchun qo'ydik. O'zingiz sinab ko'rgandaseedqatorini olib tashlang, har safar boshqacha chiqadi.
Kitoblarda
- Python asoslari: "Pythonda matematika" 83–87-betlar (
min,max,abs,pow,mathfunksiyalari ro'yxati,ceil,floor,pi); tasodifiy son (random) 20–21-betlar. - Python Crash Course:
importhaqida 8-bob, Storing Your Functions in Modules 150–153-betlar. Bu kitobdamathmoduli o'rgatilmaydi.
Kichik loyiha: kvadrat tenglama
ax² + bx + c = 0 tenglamani yechamiz. Diskriminant D = b² − 4ac, ildizlar x = (−b ± √D) / 2a.
import math a = float(input("a = ")) b = float(input("b = ")) c = float(input("c = ")) d = b ** 2 - 4 * a * c x1 = (-b + math.sqrt(d)) / (2 * a) x2 = (-b - math.sqrt(d)) / (2 * a) print(f"D = {d}") print(f"x1 = {x1}, x2 = {x2}")
a = 1 b = -5 c = 6 D = 1.0 x1 = 3.0, x2 = 2.0
Tekshiramiz: x² − 5x + 6 = (x − 2)(x − 3), ildizlar 3 va 2. To'g'ri.
(2 * a) dagi qavsga e'tibor bering. Usiz / 2 * a bo'lib qoladi: avval 2 ga bo'linadi, keyin a ga ko'paytiriladi.
Endi D manfiy bo'lgan tenglamani beraylik:
import math a = float(input("a = ")) b = float(input("b = ")) c = float(input("c = ")) d = b ** 2 - 4 * a * c x1 = (-b + math.sqrt(d)) / (2 * a)
a = 1 b = 2 c = 5
ValueError: math domain error
D = 4 − 20 = −16, manfiy sondan ildiz yo'q. Dastur yiqildi. To'g'ri dastur avval D ni tekshirib, "haqiqiy ildiz yo'q" deb javob berishi kerak. Buning uchun if kerak — 6-bobda shu dasturni tugatamiz.
Xulosa
import math, keyinmath.funksiya(). Bu eng aniq usul.sqrt,pi,hypot,dist— geometriya;sin,cos— radianda,radians()bilan o'giring.floorpastga,ceilyuqoriga,trunc/intnol tomonga,roundeng yaqiniga.math domain error— manfiy sondan ildiz yoki nol/manfiy sondan logarifm.math.isclose()— kasrlarni solishtirish uchun.random.randint(a, b)— tasodifiy butun son.
Mashqlar
Bu bobda π uchun math.pi ishlating (varaqdagi π = 3.14 o'rniga). Tekshiruvchi aniq qiymat bilan solishtiradi.
Ikkita manfiy bo'lmagan son a va b berilgan. Ularning o'rta geometrigini toping: √(a·b).
| Kirish | Kutilgan natija |
|---|---|
| 4, 9 | 6 |
| 2, 8 | 4 |
| 3, 5 | 3.872983346207417 |
Yechimni ko'rish
import math a = float(input()) b = float(input()) print(math.sqrt(a * b))
To'g'ri burchakli uchburchakning katetlari a va b berilgan. Avval gipotenuzasi c ni, keyin perimetri P ni chiqaring: c = √(a² + b²), P = a + b + c.
| Kirish | Kutilgan natija |
|---|---|
| 3, 4 | 5 12 |
| 6, 8 | 10 24 |
| 1, 1 | 1.4142135623730951 3.414213562373095 |
Yechimni ko'rish
import math a = float(input()) b = float(input()) c = math.hypot(a, b) print(c, a + b + c)
Markazi umumiy bo'lgan ikkita doiraning radiuslari R₁ va R₂ berilgan (R₁ > R₂). Ularning yuzlari S₁, S₂ va oradagi halqaning yuzi S₃ ni chiqaring: S₁ = π·R₁², S₂ = π·R₂², S₃ = S₁ − S₂.
| Kirish | Kutilgan natija |
|---|---|
| 2, 1 | 12.566370614359172 3.141592653589793 9.42477796076938 |
| 5, 3 | 78.53981633974483 28.274333882308138 50.26548245743669 |
| 10, 9 | 314.1592653589793 254.46900494077323 59.690260418206094 |
Yechimni ko'rish
import math r1 = float(input()) r2 = float(input()) s1 = math.pi * r1 ** 2 s2 = math.pi * r2 ** 2 print(s1, s2, s1 - s2)
Varaqdagi xato
Topshiriqlar varag'ida S₃ = π·(R₁ − R₂) deb yozilgan. Bu halqaning yuzi emas. To'g'risi: S₃ = S₁ − S₂ = π·(R₁² − R₂²).
Aylananing uzunligi L berilgan. Uning radiusi R va doira yuzi S ni toping. L = 2·π·R dan: R = L / (2·π), keyin S = π·R².
| Kirish | Kutilgan natija |
|---|---|
| 6.283185307179586 | 1 3.141592653589793 |
| 31.41592653589793 | 5 78.53981633974483 |
| 10 | 1.5915494309189535 7.9577471545947684 |
Yechimni ko'rish
import math l = float(input()) r = l / (2 * math.pi) print(r, math.pi * r ** 2)
Doiraning yuzi S berilgan. Avval diametri d ni, keyin radiusi R ni chiqaring. S = π·R² dan: R = √(S / π), d = 2·R.
| Kirish | Kutilgan natija |
|---|---|
| 3.141592653589793 | 2 1 |
| 78.53981633974483 | 10 5 |
| 50 | 7.978845608028654 3.989422804014327 |
Yechimni ko'rish
import math s = float(input()) r = math.sqrt(s / math.pi) print(2 * r, r)
Tekislikdagi ikki nuqta (x₁, y₁) va (x₂, y₂) berilgan. Ular orasidagi masofani toping: √((x₂−x₁)² + (y₂−y₁)²). Kiritish tartibi: x₁, y₁, x₂, y₂.
| Kirish | Kutilgan natija |
|---|---|
| 0, 0, 3, 4 | 5 |
| 1, 2, 4, 6 | 5 |
| -1, -1, 1, 1 | 2.8284271247461903 |
Yechimni ko'rish
import math x1 = float(input()) y1 = float(input()) x2 = float(input()) y2 = float(input()) print(math.dist((x1, y1), (x2, y2)))
Uchburchakning uchlari (x₁, y₁), (x₂, y₂), (x₃, y₃) berilgan. Avval tomonlarini Begin20 dagi formula bilan toping, keyin uchburchakning yuzi va perimetrini chiqaring. Yuz — Geron formulasi: S = √(p·(p−a)·(p−b)·(p−c)), bu yerda p = (a + b + c) / 2 — yarim perimetr. Kiritish tartibi: x₁, y₁, x₂, y₂, x₃, y₃.
| Kirish | Kutilgan natija |
|---|---|
| 0, 0, 3, 0, 0, 4 | 6 12 |
| 0, 0, 4, 0, 0, 3 | 6 12 |
| 1, 1, 5, 1, 1, 4 | 6 12 |
Yechimni ko'rish
import math x1 = float(input()) y1 = float(input()) x2 = float(input()) y2 = float(input()) x3 = float(input()) y3 = float(input()) a = math.dist((x1, y1), (x2, y2)) b = math.dist((x2, y2), (x3, y3)) c = math.dist((x1, y1), (x3, y3)) p = (a + b + c) / 2 print(math.sqrt(p * (p - a) * (p - b) * (p - c)), a + b + c)
A·x + B = 0 chiziqli tenglama berilgan (A ≠ 0). Uning yechimi x ni toping: x = −B / A.
| Kirish | Kutilgan natija |
|---|---|
| 2, -6 | 3 |
| 4, 2 | -0.5 |
| -1, 5 | 5 |
Yechimni ko'rish
a = float(input()) b = float(input()) print(-b / a)
A·x² + B·x + C = 0 kvadrat tenglama berilgan (A ≠ 0), diskriminanti musbat ekani ma'lum. Ildizlarni toping va avval kichigini, keyin kattasini chiqaring. D = B² − 4·A·C, x = (−B ± √D) / (2·A). Maslahat: min() va max().
| Kirish | Kutilgan natija |
|---|---|
| 1, -5, 6 | 2 3 |
| 1, 0, -4 | -2 2 |
| -1, 1, 6 | -2 3 |
Yechimni ko'rish
import math a = float(input()) b = float(input()) c = float(input()) d = b ** 2 - 4 * a * c x1 = (-b + math.sqrt(d)) / (2 * a) x2 = (-b - math.sqrt(d)) / (2 * a) print(min(x1, x2), max(x1, x2))
Chiziqli tenglamalar sistemasi berilgan:
A₁·x + B₁·y = C₁ va A₂·x + B₂·y = C₂. Determinant D = A₁·B₂ − A₂·B₁ noldan farqli. Yechimni toping: x = (C₁·B₂ − C₂·B₁) / D, y = (A₁·C₂ − A₂·C₁) / D. Kiritish tartibi: A₁, B₁, C₁, A₂, B₂, C₂.
| Kirish | Kutilgan natija |
|---|---|
| 1, 1, 5, 1, -1, 1 | 3 2 |
| 2, 3, 13, 1, -1, -1 | 2 3 |
| 3, 0, 6, 0, 2, 8 | 2 4 |
Yechimni ko'rish
a1 = float(input()) b1 = float(input()) c1 = float(input()) a2 = float(input()) b2 = float(input()) c2 = float(input()) d = a1 * b2 - a2 * b1 print((c1 * b2 - c2 * b1) / d, (a1 * c2 - a2 * c1) / d)
Ichida N ta talaba bor guruh avtobusda sayohatga boradi. Bitta avtobusga K kishi sig'adi. Nechta avtobus kerak? (Ikkalasi butun son.)
| Kirish | Kutilgan natija |
|---|---|
| 45, 20 | 3 |
| 40, 20 | 2 |
| 1, 50 | 1 |
Yechimni ko'rish
import math n = int(input()) k = int(input()) print(math.ceil(n / k))
Burchak gradusda berilgan. Uning sinusi va kosinusini 4 xona aniqlikda chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 30 | 0.5000 0.8660 |
| 90 | 1.0000 0.0000 |
| 0 | 0.0000 1.0000 |
Yechimni ko'rish
import math g = float(input()) r = math.radians(g) print(f"{math.sin(r):.4f} {math.cos(r):.4f}")
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.