2015-02-01 4 views
0

Мой учебник дает псевдокод для метода Хорнера следующим образом:Используя метод Хорнера найти Р (х) и Р '(х)

P(x) = a_n x n + a_n−1 x n−1 + ··· + a_1 x + a_0 = (x−x0)Q(x) + b0 

INPUT degree n; coefficients a_0 , a_1 , . . . , a_n ; x0 . 
OUTPUT y = P(x 0); z = P (x 0). 
Step 1 Set y = a_n ; (Compute b n for P.) 
      z = a_n . (Compute b n−1 for Q.) 
Step 2 For j = n − 1, n − 2, . . . , 1 
      set y = x0 * y + a_j ; (Compute b_j for P.) 
        z = x0 * z + y. (Compute b_j−1 for Q.) 
Step 3 Set y = x0 + y + a_0 . 
Step 4 OUTPUT (y, z); 
     STOP. 

Теперь проблема у меня в том, что индекс в псевдо код, кажется, не соответствуют индексы в формуле

Я сделал реализацию питона, но ответы, которые я получил, казалось, не так, поэтому я изменил его немного

def horner(x0, *a): 
    ''' 
     Horner's method is an algorithm to calculate a polynomial at 
     f(x0) and f'(x0) 

     x0 - The value to avaluate 
     a - An array of the coefficients 

     The degree is the polynomial is set equal to the number of coefficients 
    ''' 
    n = len(a) 

    y = a[0] 
    z = a[0] 
    for j in range(1, n): 
     y = x0 * y + a[j] 
     z = x0 * z + y 

    y = x0 * y + a[-1] 

    print('P(x0) =', y) 
    print('P\'(x0) =', z) 

Она работает довольно хорошо, но Мне нужен кто-то, у кого больше опыта в этом отношении, чтобы дать ему один раз.

В качестве очень простого теста я взял многочлен 2x^4 со значением -2 для x.

Чтобы использовать его в метод, который я называю его как таковой

horner(-2, 2, 0, 0 ,0) 

Выход действительно выглядит правильно для этого очень простой задачей. Поскольку f (x) = 2x^4, то f (-2) = -32, но это то, где моя реализация дает другой результат, мой ответ положительный

+0

Можете ли вы предоставить пример ввода и желаемый результат? – vaultah

+0

http://en.wikipedia.org/wiki/Horner%27s_method#Python_implementation ваш вход и ожидаемый результат помогут –

+0

Спасибо @PadraicCunningham, я прочитал wiki-страницу и посмотрел на их алгоритм. Небольшое различие заключается в том, что я пытаюсь решить производную одновременно – Leon

ответ

0

Я нашел проблему, и я добавляю здесь ответ, так как может оказаться полезным для кого-то в будущем

во-первых, есть, но в алгоритме, цикл должен идти до п-1

def horner(x0, *a): 
    ''' 
     Horner's method is an algorithm to calculate a polynomial at 
     f(x0) and f'(x0) 

     x0 - The value to avaluate 
     a - An array of the coefficients 

     The degree is the polynomial is set equal to the number of coefficients 
    ''' 
    n = len(a) 

    y = a[0] 
    z = a[0] 
    for j in range(1, n - 1): 
     y = x0 * y + a[j] 
     z = x0 * z + y 

    y = x0 * y + a[-1] 

    print('P(x0) =', y) 
    print('P\'(x0) =', z) 

во-вторых, и это была моя самая большая ошибка, я не проходит достаточные коэффициенты для метода

Это рассчитает 2x^3

horner(-2, 2, 0, 0, 0) 

Я на самом деле должен был назвать

horner(-2, 2, 0, 0, 0, 0) 
+0

'y = 0 z = 0 для j в [: - 1]' будет делать точно такая же вещь –

Смежные вопросы