Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การหารากของสมการกำลังสองใน JavaScript

ภาพรวม

บทความนี้สาธิตวิธีหาราก (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