ภาพรวม
บทความนี้สาธิตวิธีหาราก (Roots) ของสมการกำลังสอง ax² + bx + c = 0 โดยใช้สูตรกำลังสอง (Quadratic Formula)
สูตรคณิตศาสตร์
Discriminant (Δ) = b² - 4ac
- Δ > 0: มีรากจริง 2 ราก
- Δ = 0: มีรากจริง 1 ราก (รากซ้ำ)
- Δ < 0: ไม่มีรากจริง (Complex Roots)
ราก: x = (-b ± √Δ) / 2a
การนำไปใช้
const coeff = [1, 12, 3]; // a=1, b=12, c=3
const findRoots = (co) => {
const [a, b, c] = co;
const discriminant = (b * b) - 4 * a * c;
// ไม่มีรากจริง
if (discriminant < 0) {
return false;
}
const d = Math.sqrt(discriminant);
const x1 = (-b + d) / (2 * a);
const x2 = (-b - d) / (2 * a);
return [x1, x2];
};
console.log(findRoots(coeff));
ผลลัพธ์
[ -0.2554373534619714, -11.744562646538029 ]
เวอร์ชันปรับปรุง: รองรับ Complex Numbers
const findRootsComplete = (a, b, c) => {
const discriminant = b * b - 4 * a * c;
const denom = 2 * a;
if (discriminant >= 0) {
const sqrtD = Math.sqrt(discriminant);
return [
(-b + sqrtD) / denom,
(-b - sqrtD) / denom
];
} else {
// Complex Roots
const realPart = -b / denom;
const imagPart = Math.sqrt(-discriminant) / denom;
return [
`${realPart} + ${imagPart}i`,
`${realPart} - ${imagPart}i`
];
}
};
console.log(findRootsComplete(1, 0, 1)); // ["0 + 1i", "0 - 1i"] -> x² + 1 = 0
ข้อควรระวังด้าน Numerical Stability
เมื่อ b ใหญ่และ discriminant เล็ก การคำนวณ (-b ± √Δ) อาจสูญเสีย Precision
const findRootsStable = (a, b, c) => {
const discriminant = b * b - 4 * a * c;
if (discriminant < 0) return false;
const sqrtD = Math.sqrt(discriminant);
// ใช้สูตรที่เสถียรกว่า: q = -0.5 * (b + sign(b) * sqrtD)
const q = -0.5 * (b + (b > 0 ? sqrtD : -sqrtD));
return [q / a, c / q]; // x1 = q/a, x2 = c/q
};
การประยุกต์ใช้
- Physics: Projectile Motion, Oscillations
- Engineering: Control Systems, Circuit Analysis
- Finance: Option Pricing (Black-Scholes)
- Computer Graphics: Ray-Sphere Intersection