Newton Raphson方法JS + html

时间:2016-01-02 22:48:01

标签: javascript html

需要帮助,因为我的代码中有错误,我看不到它。

我正在尝试使用牛顿拉夫森方法。

用户输入polinomy并且函数计算衍生物,然后应用Newton的raphson公式并在表格中显示最终结果。

我的问题是我无法使其发挥作用,因为我无法在结果表中显示结果。

请在此处查看示例:http://codepen.io/anon/pen/Qyddoy?editors=101

这就是我的JS代码。

function funcion(func, x) {
    var nuevaFuncion= func.replace(/x/g, x);
    return eval(nuevaFuncion);
}


function derivada(x) {
    var func = document.getElementsByName("func")[0].value.trim();
    var derivative = nerdamer('diff(' + func + ')').evaluate();
}

function procesar(formulario) {
    var i = 0;
    var func = document.getElementsByName("func")[0].value;
    var err, x_1, x = parseFloat(formulario.x.value);
    var resultado = '<table border="3"><tr><td align="center">i</td><td align="center">x<sub></sub></td><td align="center">error</td></tr>';
    do {
        x_1 = x;
        x = x - funcion(func, x) / derivada(x);
        err = Math.abs((x - x_1) / x);
        resultado += '<tr><td>x<sub>' + i + '</sub></td><td>' + x_1 + '</td><td>' + err + '</td></tr>';
        i++;
    } while (x != x_1 && i < 100);
    document.getElementById('resultado').innerHTML = resultado + '</tbody>    </table><br>' + (i == 100 ? 'La solucion no es convergente. ' : 'La solucion es ' + x);
return false;
}

2 个答案:

答案 0 :(得分:1)

函数derivada不会返回任何内容,因此procesar函数中的除法失败。

你必须返回一个值,以便微积分可以继续。我想你想要返回派生函数的结果,如下所示:

function derivada(x) {
    var func = document.getElementsByName("func")[0].value.trim();
    var derivative = nerdamer('diff(' + func + ')').evaluate();
    return eval(derivative.text());
}

答案 1 :(得分:1)

我会做一些不同的事情。首先是我会避免更换和使用eval,让nerdamer完成这项工作。例如,sin(x)会产生错误,因为没有名为sin的本机JS函数,而是Math.sin。我猜你的i < 100是安全的。我更喜欢使用break语句,因为在我看来这更容易阅读和调试。此外,如果您已经知道变量名称,则可以避免调用buildFunction并使用evaluate,例如,如果变量是x nerdamer(func).evaluate({x:x}); 最后,牛顿的方法需要一些精确的停止条件。 x != x_1的停止条件充其量是有风险的。

以下是我的修改 http://codepen.io/anon/pen/gPgXbK?editors=101

function funcion(func, x) {
    return nerdamer(func).buildFunction().call(undefined, x);
}


function derivada(x){
  var func = document.getElementsByName("func")[0].value.trim();
  return nerdamer('diff(' + func + ')').buildFunction().call(undefined, x);
}



function procesar(formulario) {
    var i = 0;
    var func = document.getElementsByName("func")[0].value;

    var err, x_1, x = parseFloat(formulario.x.value);
    var resultado = '<table border="3"><tr><td align="center">i</td><td align="center">x<sub></sub></td><td align="center">error</td></tr>';
    do {
        var x_1 = x - funcion(func, x) / derivada(x);
        //get the error
        var e = Math.abs(x-x_1);
        x = x_1
        err = Math.abs((x - x_1) / x);
        resultado += '<tr><td>x<sub>' + i + '</sub></td><td>' + x_1 + '</td><td>' + err + '</td></tr>';
        i++;
        //I imagine that this is your safety so I would implement it like this
        if(i > 100) break;
    } while (e > 0.01);
document.getElementById('resultado').innerHTML = resultado + '</tbody></table><br>' + (i == 100 ? 'La solucion no es convergente. ' : 'La solucion es ' + x);
return false;

}