一元三次方程的求解

用盛金公式求解一元三次方程
任何實係數一元奇數次方程都有至少一個的實根。

(1)代數基本定理:一元n次方程有n個根(重根按重數計算)
(2)虛根判定定理:實係數方程虛根成對出現,互爲共軛,且互爲共軛的虛根重數相等。
所以任何一個實係數一元三次方程至少有一個實根。實際上,任何實係數一元奇數次方程都有實根。

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>

</head>
<body style="font-family:'lucida grande', tahoma, verdana, arial, sans-serif;background-color: #f7f7f7;color: #333;">

<br>
<input type="text" id="x3Factor" style="width:30px" value="1"> X^3 + <input type="text" id="x2Factor" style="width:30px" value="1"> X^2 + 
<input type="text" id="x1Factor" style="width:30px" value="1"> X + <input type="text" id="factor" value=0 style="width:30px"> = 0
<br>
<br>

Delta: <span id="delta">0</span><br><br>
<span id="desc"></span><br>
<span id="x1">0</span><br><br>
<span id="x2">0</span><br><br>
<span id="x3">0</span><br><br>

<!-- <input type="submit" value="Submit" οnclick="start()"> -->
<input type="button" value="calculate" onclick="start()" id="startBtn" />

<script>
var a = 1;
var b = 1;
var c = 1;
var d = 0;
var A;
var B;
var C;
var delta;
var x1, x2, x3;
var x2_real, x3_real, x2_virtual, x3_virtual;
var deltaQuadratic;

function initParams () {
    a = parseFloat(document.getElementById("x3Factor").value);
    b = parseFloat(document.getElementById("x2Factor").value);
    c = parseFloat(document.getElementById("x1Factor").value);
    d = parseFloat(document.getElementById("factor").value);
    A = b * b - 3 * a * c;
    B = b * c - 9 * a * d;
    C = c * c - 3 * b * d;
    delta = B * B - 4 * A * C;
}

function start() {
    initParams ();
    if (d == 0) {
        x3 = 0;
        solveQuadraticEquation();
    } else if (A == 0 && B == 0) {
        x1 = -b / (3*a);
        x2 = -c / b;
        x3 = -3 * d / c;

    } else if (delta > 0) {
        Y1 = A * b + 3 * a * (-B + Math.sqrt(delta)) / 2;
        Y2 = A * b + 3 * a * (-B - Math.sqrt(delta)) / 2;

        x1 = (-b - (getCubeRoot(Y1) + getCubeRoot(Y2))) / (3 * a);
        x3_real = x2_real = (-b + getCubeRoot(Y1)) / (3 * a);
        x2_virtual = ((Math.sqrt(3) / 2) * (getCubeRoot(Y1) - getCubeRoot(Y2)) ) / (3 * a);
        x3_virtual = -x2_virtual;
    } else if (delta == 0) {
        var K = B / A; //A != 0
        x1 = -b / a + K;
        x2 = x3 = -K / 2;
    } else {
        //delta < 0
        var T = (2 * A * b - 3 * a * B) / (2 * Math.sqrt(A * A * A)); // A > 0, -1 < T < 1
        var angle = Math.acos(T) / 3;
        x1 = (-b - 2 * Math.sqrt(A) * Math.cos(angle)) / (3 * a);
        x2 = (-b + Math.sqrt(A) * (Math.cos(angle) + Math.sqrt(3) * Math.sin(angle))) / (3 * a);
        x3 = (-b + Math.sqrt(A) * (Math.cos(angle) - Math.sqrt(3) * Math.sin(angle))) / (3 * a);
    }
    displayResults();
}

function solveQuadraticEquation() {
    deltaQuadratic = b * b - 4 * a * c;
    if (deltaQuadratic == 0) {
        x1 = x2 = -b / (2 * a);
    } else if (deltaQuadratic > 0) {
        x1 = (-b + Math.sqrt(deltaQuadratic)) / (2 * a);
        x2 = (-b - Math.sqrt(deltaQuadratic)) / (2 * a);
    } else {
        x2_real = -b / (2 * a);
        x2_virtual = Math.sqrt(-deltaQuadratic) / (2 * a);
    }
}

function getCubeRoot(value) {
    if (value < 0) {
        return -Math.pow(-value, 1/3);
    } else if (value == 0) {
        return 0;
    } else {
        return Math.pow(value, 1/3);
    }
}

function displayResults() {
    document.getElementById("delta").innerHTML = "";
    document.getElementById("x1").innerHTML = "";
    document.getElementById("x2").innerHTML = "";
    document.getElementById("x3").innerHTML = "";
    document.getElementById("desc").innerHTML = "";
    if (d == 0) {
        document.getElementById("desc").innerHTML = "親,你在解一元二次方程哦。";
        document.getElementById("x3").innerHTML = "x3 = " + x3;
        document.getElementById("delta").innerHTML = deltaQuadratic;
        if (deltaQuadratic >= 0) {
            document.getElementById("x1").innerHTML = "x1 = " + x1;
            document.getElementById("x2").innerHTML = "x2 = " + x2;
        } else {
            document.getElementById("x1").innerHTML = "x1 = " + x2_real + " + " + x2_virtual + "i";
            document.getElementById("x2").innerHTML = "x2 = " + x2_real + " - " + x2_virtual + "i";
        }
        return;
    }
    if (A == 0 && B == 0) {
        document.getElementById("x1").innerHTML = "x1 = x2 = x3 = " + x1;
        document.getElementById("desc").innerHTML = "方程有一個三重實根";
        return;
    }
    document.getElementById("delta").innerHTML = delta;
    if (delta > 0) {
        document.getElementById("x1").innerHTML = "x1 = " + x1;
        document.getElementById("x2").innerHTML = "x2 = " + x2_real + " + " + x2_virtual + "i";
        document.getElementById("x3").innerHTML = "x3 = " + x2_real + " - " + x2_virtual + "i";
        document.getElementById("desc").innerHTML = "方程有一個實根和一對共軛虛根";
    } else if (delta == 0) {
        document.getElementById("x1").innerHTML = "x1 = " + x1;
        document.getElementById("x2").innerHTML = "x2 = x3 = " + x2;
        document.getElementById("desc").innerHTML = "方程有一個實根,其中有一個兩重根";
    } else {
        document.getElementById("x1").innerHTML = "x1 = " + x1;
        document.getElementById("x2").innerHTML = "x2 = " + x2;
        document.getElementById("x3").innerHTML = "x3 = " + x3;
        document.getElementById("desc").innerHTML = "方程有三個不相等的實根";
    }
}

</script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章