Итак, я пытаюсь написать функцию js, которая принимает 3 ввода (многочлен, угадывание и ограничение) и заставляет их возвращать приблизительный корень полинома. Проблема в том, что даже с пределом 1000 результат все же очень неточный. Есть ли у кого-нибудь идеи о том, почему это может быть?Метод Ньютонов в JS, являющийся неточным
Код:
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
.
Отправьте свой код здесь, а не как ссылку. – Barmar
используйте что-то вроде https://github.com/MikeMcl/bignumber.js/ –
Можете ли вы привести пример полинома, который вы попробовали, результат, которого вы ожидали, и неточный результат, который вы получили? – Barmar