Канонические коэффициенты из полинома Ньютона
Некоторое время назад я реализовал приближение Полинома для игры, которую я запрограммировал.
Я использую метод пирамиды Ньютона. Мне потребовалось много времени, чтобы понять это, но мое решение требует вычисления биномиальных коэффициентов, и я также должен суммировать все коэффициенты для конечного коэффициента каждой степени (так как решение этой проблемы похоже на возведение в квадрат, кубирование.. условия и вычисление биномиальных коэффициентов)
Например: выберите k из n биономных терминов и добавьте их
один выбор умножается
a * (x + b)(x + c)(x + d) ==> a * x ^ 3 + a * x ^ 2 * (b + c + d) + a * x (bc + bd + cd) + а * Ь * с * д
поэтому b * c * d будет одним выбором b * c и b * d тоже
Мой вопрос сейчас таков: есть ли способ вычисления полиноминтерполяции по схеме Ньютона без необходимости вычисления всех биономных коэффициентов?
Мой код: https://github.com/superphil0/Polynominterpolation/blob/master/PolynomInterpolation.java
Это работает довольно хорошо, хотя, если кто-то даст слишком много очков, он будет довольно медленным из-за выбора терминов, которые все должны быть суммированы
(Я действительно плохо объясняю это по-английски, я надеюсь, что кто-то может понять то, что я хочу знать, хотя)
ура
1 ответ
Исходя из этого описания, я понимаю, что ваша "схема пирамиды" генерирует коэффициенты ci, так что многочлен p(x) можно записать в виде
p(x) =c0 + (x - x0) (c1 + (x - x1) (c2 + (x - x2) (c3 + (x - x3) (… (cn- 1 + (x - xn ‒1)cn)…))))
Теперь вы можете вычислить канонические коэффициенты рекурсивно со спины. Начать с
pn = cn
На каждом шаге текущий многочлен можно записать в виде
pk = ck + (x - xk)pk+1 = ck + (x - xk) (b0 +b1x + b2x2 +…)
предполагая, что следующий меньший многочлен уже превращен в канонические коэффициенты.
Теперь вы можете вычислить коэффициенты ai of pk, используя эти коэффициенты bi of pk+1. Строго формально я должен был бы использовать индексы вместо a и b, но я считаю, что так понятнее. Так каковы канонические коэффициенты следующего многочлена?
- a0 = ck - xk b0
- a1 = b0 - xk b1
- a2 = b1 - xk b2
- ...
Вы можете написать это в цикле, используя и повторно используя один массив a
держать коэффициенты:
double[] a = new double[n + 1]; // initialized to zeros
for (int k = n; k >= 0; --k) {
for (int i = n - k; i > 0; --i)
a[i] = a[i - 1] - x[k]*a[i];
a[0] = c[k] - x[k]*a[0];
}