需要帮助,因为我的代码中有错误,我看不到它。
我正在尝试使用牛顿拉夫森方法。
用户输入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;
}
答案 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;
}