2016-12-23 40 views
2

Итак, я пытаюсь написать функцию js, которая принимает 3 ввода (многочлен, угадывание и ограничение) и заставляет их возвращать приблизительный корень полинома. Проблема в том, что даже с пределом 1000 результат все же очень неточный. Есть ли у кого-нибудь идеи о том, почему это может быть?Метод Ньютонов в JS, являющийся неточным

The Method

Код:

var derivativeOfATerm = function(arr) { 
 
    var one = arr[0]; 
 
    var two = arr[1]; 
 
    var derivative = []; 
 
    if (two <= 0) { 
 
    return [0, 0]; 
 
    } else { 
 
    derivative.push(one * two); 
 
    derivative.push(two - 1); 
 
    return derivative; 
 
    } 
 
}; 
 

 
var derivativeOfPolynomial = function(arr, order = 1) { 
 
    var derivative = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    //console.log(arr[i]); 
 
    derivative.push(derivativeOfATerm(arr[i])); 
 
    } 
 
    if (order === 1) { 
 
    return derivative; 
 
    } else { 
 
    return derivativeOfPolynomial(derivative, order - 1); 
 
    } 
 
}; 
 

 
var runPolynomial = function(poly, num) { 
 
    var array = []; 
 
    for (var i = 0; i < poly.length; i++) { 
 
    array.push(Math.pow(num, poly[i][1]) * poly[i][0]); 
 
    } 
 
    return array.reduce((a, b) => a + b); 
 
}; 
 

 
var newtonRootFind = function(polynomial, guess, limit = 10) { 
 
    var derivative = derivativeOfPolynomial(polynomial); 
 
    var previous = guess; 
 
    var next; 
 
    for (var i = 0; i < limit; i++) { 
 
    next = previous - (runPolynomial(polynomial, previous))/(runPolynomial(derivative, previous)); 
 
    previous = next; 
 
    console.log("%o : x=%o, p(x)=%o", i+1, next, runPolynomial(polynomial, next)); 
 
    } 
 
    return previous; 
 
}; 
 

 
console.log("result x=",newtonRootFind([[1,2],[1,1],[-5,0]], 5, 10));

Я только 12, поэтому постарайтесь не использовать, что много технических терминов. Например, ввод [[1,2],[1,1],[-5,0]] или x^2+x-5, он возвращает 1.79128784747792, что недостаточно точно. Он равен 4.79..., когда он должен быть очень близок к 5.

+1

Отправьте свой код здесь, а не как ссылку. – Barmar

+0

используйте что-то вроде https://github.com/MikeMcl/bignumber.js/ –

+1

Можете ли вы привести пример полинома, который вы попробовали, результат, которого вы ожидали, и неточный результат, который вы получили? – Barmar

ответ

2

Как было разработано в комментариях, представленный код работает по назначению, проблема заключалась в том, что при проверке решения x^2 использовался для квадрата x*x.

Однако x^y в большинстве языков C- или Java - это побитовое «исключительное» или «XOR», а не силовая операция. x^y как символ для работы с энергией, как правило, находится в системах компьютерной алгебры. Языки скриптов как питона или gnuplot имеют тенденцию использовать x**y.

+0

Спасибо, я буду помнить об этом. –