Функция производная вычисляет производную многочлена; степень каждой записи необходимо уменьшить на единицу, каждую запись нужно умножить на предыдущую степень, а член со степенью [0] необходимо удалить.

Этот код

lst = [1,2,3] """This list represents the polynomial 3x^2+2x+1"""

"""This function moves each entry one index down and removes the last 
entry"""

def move(lst):
    copy = list(lst)
    for i in range(len(lst)):
        lst[i-1] = copy[i]
    del lst[-1]
    print lst

move(lst)

Производит это:

Samuels-MacBook:python barnicle$ python problemset2.py
[2, 3]

Этот код:

def derivative(poly):
    copy = list(poly)
    degree = 0
    for i in range(len(poly)):
        i = degree*(i+1) 
        poly[i-1] = copy[i]
        degree += 1
    del poly[-1]
    print poly

derivative(lst)

Выдает эту ошибку:

Samuels-MacBook:python barnicle$ python problemset2.py

     Traceback (most recent call last):   File "problemset2.py", line 59,
     in <module>
         derivative(lst)   File "problemset2.py", line 55, in derivative
         poly[i-1] = copy[i] IndexError: list index out of range

Итак, я разобрался. Вот моя новая рабочая функция, переименованная в ddx2:

lst = [0,3,5,4] #lst represents the polynomial 4x^3+3x^2+5x
def ddx2(lst):
    for i in range(len(lst)):
        lst[i] = lst[i]*i
        if i != 0:
            lst[i-1] = lst[i]
    del lst[-1]
    print lst
ddx2(lst) #Here I call the function

Когда я вызываю функцию, я получаю правильную производную в правильном формате, то есть [3,10,12]. Я думаю, что сообщение об ошибке, которое я получил, было связано с тем, что я пытался сократить длину списка, прежде чем выйти из цикла.

2
sampy 7 Июн 2016 в 10:54
2
Добавьте некоторые отладочные операторы, распечатав значение i в цикле до и после того, как вы установите для него значение degree*(i+1). Вы увидите, что делаете.
 – 
leekaiinthesky
7 Июн 2016 в 10:57
Вместо move вы можете просто сделать my_list[:-1]
 – 
Ben
7 Июн 2016 в 11:04

3 ответа

Линия i = degree*(i+1) в основном означает квадрат индекса. У вас есть массив длины i, но вы пытаетесь получить элемент с индексом i*i.

2
m9_psy 7 Июн 2016 в 11:02
Это еще хуже. degree то же самое, что i, поэтому это i = i * (i+1).
 – 
Barmar
7 Июн 2016 в 11:03

Индекс i с его вычислением i = degree*(i+1) вырастет равным или большим, чем len(poly) и len(copy), и, следовательно, выйдет за пределы допустимого диапазона

0
DomTomCat 7 Июн 2016 в 11:02

Вот быстрый совет, который я сделал :) Надеюсь, он соответствует вашим требованиям, вы просто должны знать о длине списков.

lst = [1,2,3] 


dlist=[]
derivate=[]
for i in range(len(lst)): #Here you multiply the coeficients by the power
    dlist.append(lst.__getitem__(i)*i)
#print dlist
for m in range(len(dlist)): #In the derivate the constants become zero
    if dlist.__getitem__(m) != 0:
        derivate.append(dlist.__getitem__(m))
print lst
print derivate

Наслаждайтесь!

0
Joseph 7 Июн 2016 в 11:29
Спасибо! Да, размер списка - это то, о чем я должен был знать. Я ценю вашу помощь, я действительно хотел сделать это (почти) самостоятельно. Кстати, разве getitem не метод класса или что-то в этом роде? Я еще не совсем там! Спасибо!!!
 – 
sampy
9 Июн 2016 в 04:20