2016-01-02 2 views
2

Нужна помощь, потому что у меня есть ошибка в моем коде, и я не вижу ее.Метод Ньютона Рафсона JS + html

Я пытаюсь сделать метод 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; 
} 

ответ

1

Есть несколько вещей, которые я хотел бы сделать по-другому. Во-первых, я бы избегал замены и использования eval и позволял выполнять работу. Например, sin (x) даст ошибку, поскольку не существует нативной JS-функции, называемой sin, а скорее Math.sin. Я предполагаю, что ваш i < 100 - это безопасность. Я предпочитаю использовать оператор break, потому что это гораздо легче читать и отлаживать, на мой взгляд. Кроме того, если вы уже знаете имя переменной, вы можете избежать вызова функции buildFunction и использовать вместо этого оценку, например, если переменная равна 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; 

}

1

Функция derivada не возвращает ничего, так что деление в procesar функции не удается.

Вы должны вернуть значение, чтобы исчисление могло идти вперед. И я думаю, что вы хотите, чтобы вернуть результат порождая функцию, например:

function derivada(x) { 
    var func = document.getElementsByName("func")[0].value.trim(); 
    var derivative = nerdamer('diff(' + func + ')').evaluate(); 
    return eval(derivative.text()); 
} 
Смежные вопросы