Оценка полиномиальных коэффициентов

Я пытаюсь написать функцию, которая принимает в качестве входных данных список коэффициентов (a0, a1, a2, a3 ..... a n) полинома p (x) и значения x. Функция вернет p (x), которое является значением многочлена при оценке в x.

Многочлен степени n с коэффициентом a0, a1, a2, a3 ........ an является функцией

p(x)= a0+a1*x+a2*x^2+a3*x^3+.....+an*x^n

Так что я'Я не уверен, как решить проблему. Я'Я думаю, что мне понадобится диапазон, но как я могу сделать так, чтобы он мог обрабатывать любой числовой ввод для х? Я'Я не ожидаю, что вы, ребята, дадите ответ, яЯ просто нуждаюсь в небольшом старте. Нужен ли мне цикл for, тогда как цикл может быть рекурсивным вариантом?

def poly(lst, x)

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

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

    def poly(lst, x):
        n = len(lst)
        If n==4:
           return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3
        elif n==3:
           return lst[o]+lst[1]*x+lst[2]*x**2
        elif n==2:
           return lst[o]+lst[1]*x
        elif n==1:
           return lst[o]
        else:
            return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3+lst[n]*x**n

Это работает для п <= 4, но я получаю ошибку индекса: индекс списка выходит за пределы диапазона для n>4, можетхотя не понимаю почему.

 Snarre04 июн. 2013 г., 23:11
Я знаю, что делает сумма, но меня отталкивает то, как написать код, чтобы включить значение n
 DSM04 июн. 2013 г., 23:01
Подсказка: посмотрите, чтоsum а такжеenumerate делать. (PS: Дон 'не забывайте, что в Python мы используем** и не^ для возведения в степень, то естьx*x = x**2.)
 Rushy Panchal04 июн. 2013 г., 23:12
@Snarre Проверьте мой ответ, я думаю, это то, что вы хотели.
 Benjamin Bannier04 июн. 2013 г., 23:38
@ Ответчики: так как ОП проситлюбой числовой ввод в зависимости отx и коэффициенты, которые можно использовать при настройке суммы, чтобы избежать потери слишком большой точности.
 Sukrit Kalra04 июн. 2013 г., 23:12
enumerate там для вас. Посмотрите, что он делает. Это должно помочь вам в создании n для каждого коэффициента.

Ответы на вопрос(4)

Решение Вопроса

просто:

def poly(lst, x): 
  n, tmp = 0, 0
  for a in lst:
    tmp = tmp + (a * (x**n))
    n += 1

  return tmp

print poly([1,2,3], 2)

простая рекурсия:

def poly(lst, x, i = 0):
  try:
    tmp = lst.pop(0)
  except IndexError:
    return 0
  return tmp * (x ** (i)) + poly(lst, x, i+1)

print poly([1,2,3], 2)
 Yura Beznos05 июн. 2013 г., 00:06
@Snarre добавил пример с рекурсией.
 Snarre04 июн. 2013 г., 23:44
Хорошо, так зачем это делать?
 Snarre05 июн. 2013 г., 00:28
извини яя не знаю, что это значит - ям шведский, извините
 Snarre04 июн. 2013 г., 23:19
Так, где это входит? p (x) = a0 + a1 * x + a2 * x ^ 2 + a3 * x ^ 3 + ..... + an * x ^ n
 Yura Beznos04 июн. 2013 г., 23:57
@ Странно, ты нездесь не нужна рекурсия И это нет один.
 Yura Beznos04 июн. 2013 г., 23:34
@ Представляю, да, похоже. Didn»не знаю об этом.
 Snarre05 июн. 2013 г., 00:39
Хорошо нетна самом деле нет, но яя пытался выполнить вашу простую версию выше, и я получаю сообщение об ошибке с жалобой на строку 4:
 Snarre04 июн. 2013 г., 23:57
Я добавил альтернативу рекурсии, но не уверен, что она работает
 Yura Beznos04 июн. 2013 г., 23:39
@Snarre lst.pop (0) это ваш "a0"первый элемент в списке
 Snarre04 июн. 2013 г., 23:48
Я думаю, рекурсия здесь. Это совершенно неправильно?
 Yura Beznos05 июн. 2013 г., 00:42
@ Странно, да, нужно определить tmp, прежде чем пытаться что-то из этого извлечь. фиксированный.
 Sergio Tulentsev04 июн. 2013 г., 23:32
Вот'Реализация в Ruby (просто для удовольствия):pastie.org/8006761
 Yura Beznos05 июн. 2013 г., 00:32
 Yura Beznos04 июн. 2013 г., 23:46
@ Странно, да, неТ это нужно, х ** 0 1I '
 Yura Beznos05 июн. 2013 г., 00:24
@ Снарре, это троллинг кунг-фу?
 James04 июн. 2013 г., 23:17
Использовать перечисление намного проще, чем вести индекс i.
 Snarre05 июн. 2013 г., 00:15
Итак, я написал рекурсивную альтернативу (добавил), она работает частично, яполучаю ошибку индекса при n>4 ... Могухотя не понимаю почему
 Snarre04 июн. 2013 г., 23:22
И почему lst.pop (0)

либо без, суть решения заключается в создании цикла на «n»потому что многочлен начинается с x ^ 0 и переходит к a_n.x ^ n, и это 'Эта переменная также должна рассматриваться как входная. Кроме того, используйте трюк, называемый умножением и накоплением, чтобы иметь возможность вычислять частичные результаты на каждой итерации цикла.

def evalPoly(lst, x):
    total = 0
    for power, coeff in enumerate(lst): # starts at 0 by default
        total += (x**power) * coeff
    return total

sum

def evalPoly(lst, x):
        total = []
        for power, coeff in enumerate(lst):
            total.append((x**power) * coeff)
        return sum(total)

Без перечисления:

def evalPoly(lst, x):
    total, power = 0, 0
    for coeff in lst:
        total += (x**power) * coeff
        power += 1
    return total

Альтернатива не перечисляемому методу:

def evalPoly(lst, x):
    total = 0
    for power in range(len(lst)):
        total += (x**power) * lst[power] # lst[power] is the coefficient
    return total

Также @DSM заявил, что вы можете собрать это в одну строку:

def evalPoly(lst, x):
    return sum((x**power) * coeff for power, coeff in enumerate(lst))

Или, используя:lambda

evalPoly = lambda lst, x: sum((x**power) * coeff for power, coeff in enumerate(lst))

Рекурсивное решение:

def evalPoly(lst, x, power = 0):
    if power == len(lst): return (x**power) * lst[power]
    return ((x**power) * lst[power]) + evalPoly(lst, x, power + 1)

enumerate(iterable, start) является выражением генератора (поэтому он используетyield вместоreturn это дает число, а затем элемент итерируемого. Число эквивалентно индексу элемента + начало.

Из документов Python, это также, как:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
 Snarre04 июн. 2013 г., 23:16
Да, это работает, но у нас нетперечислил перечислить в классе, поэтому яЯ не уверен, почему или как это работает.
 Rushy Panchal05 июн. 2013 г., 00:37
не обязательно рекурсивный; Это'более грубая сила. Это'это не лучший способ, потому что ты неНе знаю, сколько экспонентов будет в списке.
 Rushy Panchal04 июн. 2013 г., 23:43
@Snarre Это происходит отfor петля.for power, coeff in enumerate(lst) будет начинаться с 0, a0. Тогда следующим будет 1, a1. a0 и a1 - коэффициенты, представленные вlstи 0 и 1 - полномочия, предоставляемыеenumerate функция.
 DSM04 июн. 2013 г., 23:20
(1) я неНе думаю, что вы хотите начать с 1. ОП 'первый членa0*x**0, (2) Мы могли бы сжать все это до.sum(coeff*x**i for i, coeff in enumerate(lst))
 Snarre04 июн. 2013 г., 23:44
Но я могу'не использовать перечислять .... должны придерживаться индекса
 Rushy Panchal04 июн. 2013 г., 23:52
@Snarre Проверьте мое новое редактирование.for coeff in lst предоставляет коэффициент из списка (который задает пользователь) иpower это просто переменная, которую вы увеличиваете.
 Rushy Panchal04 июн. 2013 г., 23:21
@DSM Я думал об этом как об одной строке, но подумал, что это может сбить с толку. Но я'Я добавлю это в любом случае :).
 Snarre04 июн. 2013 г., 23:57
Я добавил альтернативу рекурсии, но не уверен, что она работает
 Snarre04 июн. 2013 г., 23:27
Ну, так как у нас нетЯ использовал enumerate или lambda в классе, но я думаю, что мне нужно придерживаться индексов. Но что смущает меня, так это где в вашем коде функция p (x) = a0 + a1 * x + a2 * x ^ 2 + a3 * x ^ 3 + ..... + an * x ^ n в вашем коде?

используя Horner 'Правило Очень легко сделать в Python:

# Evaluate a polynomial in reverse order using Horner's Rule,
# for example: a3*x^3+a2*x^2+a1*x+a0 = ((a3*x+a2)x+a1)x+a0
def poly(lst, x):
    total = 0
    for a in reversed(lst):
        total = total*x+a
    return total

Ваш ответ на вопрос