6.17. ตัวแก้สมการและตัวเลขสุ่ม#
เมื่อฟังก์ชันที่ต้องการศึกษาถูกกำหนดโดยโค้ด Python แทนที่จะเป็นบัฟเฟอร์ของตัวอย่าง กลุ่มเครื่องมืออีกประเภทหนึ่งจะเหมาะสมกว่า ได้แก่ รากของฟังก์ชันอยู่ที่ไหน ค่าต่ำสุดอยู่ที่ไหน ค่าอินทิกรัลในช่วงที่กำหนดเป็นเท่าไร โมดูลย่อย scipy.integrate และ scipy.optimize ครอบคลุมงานดังกล่าว แต่ละอัลกอริทึมเรียกกลับไปยังฟังก์ชัน Python ที่ผู้ใช้ระบุ ดังนั้นต้นทุนต่อรอบการทำงานจึงสูงกว่าการลดขนาดบัฟเฟอร์ ความสะดวกอยู่ที่ไม่ต้องเขียนตัวแก้สมการเอง
โมดูลย่อย scipy.special ครอบคลุมฟังก์ชันพิเศษทางสถิติ (ฟังก์ชันความผิดพลาด แกมมา) ที่ปรากฏเมื่อคำนวณ ฟังก์ชันการแจกแจงแบบสะสม (CDF ความน่าจะเป็นที่ตัวอย่างมีค่าไม่เกินค่าที่กำหนด) หรือ ฟังก์ชันความหนาแน่นของความน่าจะเป็น (PDF ความน่าจะเป็นสัมพัทธ์ที่ค่าที่กำหนด) numpy.random ครอบคลุมตัวสร้างตัวเลขสุ่มเทียมสำหรับการ dithering การจำลอง และข้อมูลทดสอบสังเคราะห์
6.17.1. การอินทิเกรตเชิงตัวเลขของ callable#
เมื่อ integrand เป็นฟังก์ชัน Python แทนที่จะเป็นบัฟเฟอร์ของตัวอย่าง scipy.integrate เปิดเผยอัลกอริทึม quadrature สี่แบบ:
quad()-- Gauss-Kronrod แบบปรับตัว ค่าเริ่มต้นที่ถูกต้องสำหรับ integrand ที่เรียบ คืนค่า(value, error)romberg()-- Romberg / Newton-Cotes แบบคลาสสิก คืนค่า float เดี่ยว เลิกใช้งานต้นทาง รวมไว้เพื่อความเข้ากันได้simpson()-- กฎ Simpson แบบปรับตัว คืนค่า float เดี่ยวtanhsinh()-- quadrature แบบ double-exponential ใช้เมื่อ integrand มีจุดเอกฐานที่ปลายหรือขีดจำกัดอนันต์ คืนค่า(value, error)
Gaussian integral ที่คำนวณด้วยกฎ double-exponential (tanhsinh):
from math import exp
from math import pi
from math import sqrt
from ulab import numpy as np
from ulab import scipy as sp
f = lambda x: exp(-x * x)
value, err = sp.integrate.tanhsinh(f, -np.inf, np.inf)
print("approx:", value, " exact:", sqrt(pi))
ผลลัพธ์:
approx: 1.7724538... exact: 1.7724538...
6.17.2. การหารากและการหาค่าต่ำสุด#
scipy.optimize ครอบคลุมตัวแก้สมการตัวแปรเดียวแบบคลาสสิกสามตัว แต่ละรอบการทำงานจะเรียกกลับไปยังฟังก์ชัน Python ที่ผู้ใช้ระบุ ดังนั้นความเร็วที่เพิ่มขึ้นเมื่อเทียบกับตัวแก้สมการ Python แบบบริสุทธิ์จึงน้อยมาก (ประมาณ 2 เท่า) ความสะดวกอยู่ที่ไม่ต้องเขียนตัวแก้สมการเอง
bisect()-- หารากของfบน[a, b]โดยการแบ่งช่วงครึ่งf(a)และf(b)ต้องมีเครื่องหมายตรงข้ามกัน:def f(x): return x * x - 1 sp.optimize.bisect(f, 0, 4) # ~1.0
newton()-- หารากโดยใช้การวนซ้ำ secant / Newton-Raphson:def f(x): return x * x * x - 2.0 sp.optimize.newton(f, 3., tol=0.001, rtol=0.01) # ~1.260
fmin()-- หาค่าต่ำสุดท้องถิ่นโดยใช้วิธี downhill-simplex (Nelder-Mead):def f(x): return (x - 1) ** 2 - 1 sp.optimize.fmin(f, 3.0) # ~1.0
ขอบเขตตัวแปรเดียวเพียงพอสำหรับการเพิ่มประสิทธิภาพส่วนใหญ่ทางฝั่งกล้อง เช่น ค่าคงที่การสอบเทียบของเซนเซอร์ ค่าเกนที่เพิ่มการวัดค่าคอนทราสต์ให้สูงสุด ค่าขีดแบ่งที่ทำให้ฮิสโตแกรมมี bimodality ชัดเจนที่สุด สำหรับปัญหาหลายตัวแปร คำตอบที่ถูกต้องโดยทั่วไปคือการกำหนดปัญหาใหม่เป็นการแก้สมการพีชคณิตเชิงเส้นขนาดเล็กแทนที่จะใช้ตัวหาค่าเหมาะสมที่ไม่เชิงเส้นทั่วไป
6.17.3. ฟังก์ชันพิเศษ#
scipy.special เปิดเผยฟังก์ชันทางสถิติและความน่าจะเป็นจำนวนหนึ่งที่ทำงานเหมือนฟังก์ชันสากล โดยรับ scalar, iterable หรือ ndarray และคืนค่า ndarray แบบ float:
x = np.linspace(0, 4, num=8)
sp.special.erf(x) # error function
sp.special.erfc(x) # complementary error function
sp.special.gamma(x + 1) # gamma function
sp.special.gammaln(x + 1) # log-gamma function
ฟังก์ชันความผิดพลาดและส่วนเสริมปรากฏใน CDF ของการแจกแจง Gaussian ซึ่งเป็นแอปพลิเคชันที่เหมาะสำหรับการแปลงระหว่าง z-score ที่วัดได้กับความน่าจะเป็น หรือสำหรับการคำนวณ tail integral ของการแจกแจงปกติ ฟังก์ชัน gamma และ log-gamma ปรากฏในการคำนวณ beta / chi-squared / student-t โดย gammaln เป็นรูปแบบที่มีความเสถียรเชิงตัวเลขสำหรับอาร์กิวเมนต์ขนาดใหญ่ที่ gamma เองจะล้นค่า
6.17.4. ตัวเลขสุ่ม#
numpy.random ให้คลาส Generator ที่ดึงตัวอย่างจากการแจกแจงทั่วไป ตัวสร้างมีสถานะ: แต่ละการเรียกจะก้าวหน้าสถานะภายใน ดังนั้นการเรียกต่อเนื่องจะคืนค่าตัวอย่างที่เป็นอิสระ:
from ulab import numpy as np
rng = np.random.Generator(seed=42)
rng.random(size=5) # 5 uniform [0.0, 1.0) samples
rng.uniform(low=-1.0, high=1.0, size=10)
rng.normal(loc=0.0, scale=1.0, size=(2, 4))
ประเภทข้อมูลเอาต์พุตจะเป็น float เสมอ size= รับจำนวนเต็ม (เอาต์พุต 1 มิติ) หรือ tuple (เอาต์พุต n มิติ) เมื่อไม่ระบุ จะคืนค่า Python float เดี่ยว
ตัวสร้างเหมาะสำหรับการจำลอง การ dithering ข้อมูลทดสอบสังเคราะห์ และแอปพลิเคชันอื่น ๆ ที่ไม่ต้องการความแข็งแกร่งในระดับ cryptographic ไม่ เหมาะสำหรับคีย์หรือ token ให้ใช้แหล่งสุ่มของระบบผ่าน os สำหรับสิ่งเหล่านั้น
6.17.5. ความพร้อมใช้งานในเวลาสร้าง#
ว่าแต่ละโมดูลย่อยมีอยู่จริงหรือไม่ขึ้นอยู่กับวิธีที่สร้างกล้อง scipy.optimize และ scipy.special ไม่ได้เปิดใช้งานบนกล้องทุกตัว การเรียกฟังก์ชันที่กล้องไม่รวมไว้จะทำให้เกิด AttributeError dir(sp), dir(sp.optimize), dir(np.random) และคำสั่งที่คล้ายกันจะรายงานสิ่งที่มีอยู่บนกล้องที่กำหนดเป้าหมาย