2013-07-26 3 views
1

Я пытаюсь получить следующий код, чтобы сделать несколько больше трюков:Tweaking функции в Python

class App(Frame): 
     def __init__(self, master): 
      Frame.__init__(self, master) 
      self.grid() 
      self.create_widgets() 

     def create_widgets(self): 

      self.answerLabel = Label(self, text="Output List:") 
      self.answerLabel.grid(row=2, column=1, sticky=W) 

     def psiFunction(self): 
      j = int(self.indexEntry.get()) 
      valueList = list(self.listEntry.get()) 
      x = map(int, valueList) 
      if x[0] != 0: 
       x.insert(0, 0) 
      rtn = [] 
      for n2 in range(0, len(x) * j - 2): 
       n = n2/j 
       r = n2 - n * j 
       rtn.append(j * x[n] + r * (x[n + 1] - x[n])) 
      self.answer = Label(self, text=rtn) 
      self.answer.grid(row=2, column=2, sticky=W) 


    if __name__ == "__main__": 
     root = Tk() 

В частности, я пытаюсь заставить его вычислить LEN (х) * J - 1 членов , и работать для различных значений параметров. Если вы попробуете запустить его, вы обнаружите, что вы получите ошибки для больших значений параметров. Например, с помощью списка 0,1,2,3,4 и параметра j = 3 мы должны запустить программу и получить. Однако я получаю сообщение об ошибке, что последнее значение «вне диапазона», если я пытаюсь вычислите его.

Я считаю, что это проблема с моей функцией, как определено. Похоже, что проблема с параметрами имеет какое-то отношение к тому, как он связывает параметр с значением n. Рассмотрим 0123. Он отлично работает, если я использую 2 в качестве моего параметра (так называемый индекс в функции), но терпит неудачу, если я использую 3.

EDIT:

def psi_j(x, j): 
     rtn = [] 
     for n2 in range(0, len(x) * j - 2): 
     n = n2/j 
     r = n2 - n * j 
     if r == 0: 
     rtn.append(j * x[n]) 
     else: 
     rtn.append(j * x[n] + r * (x[n + 1] - x[n])) 
     print 'n2 =', n2, ': n =', n, ' r =' , r, ' rtn =', rtn 
     return rtn 

Например, если мы имеем psi_j (х, 2) с x = [0,1,2,3,4], мы сможем получить [0,1,2,3,4,5,6,7,8,9,10,11] с ошибкой на 12.

Идея состоит в том, что мы должны уметь вычислить этот последний термин. Это 12-й член нашей выходной последовательности и 12 = 3 * 4 + 0 => 3 * x [4] + 0 * (x [n + 1] -x [n]). Теперь нет пятого термина для вычисления, поэтому это определенно проблема, но нам не нужен этот термин, так как вторая часть уравнения равна нулю. Есть ли способ записать это в уравнение? (? Это своего рода фильтр или сглаживая функцию)

+3

Удалите ненужный код, например 'indexEntry'. Более короткий код легче читать и проще найти проблему. – FakeRainBrigand

+0

@FakeRain Я также удалил некоторые строки self.entry. Я был обеспокоен тем, что удаление некоторых вещей может затмить эту идею. Если есть больше, вы считаете, что я могу удалить, сообщите мне, и я был бы рад сделать это. – 114

+0

Может оказаться полезным, если вы распечатаете значения переменных во время прогона программы и сравните их с вашими ожиданиями. Также может быть полезно протестировать такие довольно сложные функции без чрезмерных затрат, например. г. графический интерфейс. – glglgl

ответ

1

Не понимая, что цель функции, я колола его из GUI Suff и протестировали его в покое:

def psiFunction(j, valueList): 
    x = map(int, valueList) 
    if x[0] != 0: 
     x.insert(0, 0) 
    rtn = [] 
    for n2 in range(0, len(x) * j - 2): 
     n = n2/j 
     r = n2 - n * j 
     print "n =", n, "max_n2 =", len(x) * j - 2, "n2 =", n2, "lx =", len(x), "r =", r 
     val = j * x[n] + r * (x[n + 1] - x[n]) 
     rtn.append(val) 
     print j * x[n], r * (x[n + 1] - x[n]), val 
    return rtn 

if __name__ == '__main__': 
    print psiFunction(3, [0, 1, 2, 3, 4]) 

Вызов этого модуля приводит к некоторому отладочному выводу и, в конце, упоминаемому сообщению об ошибке.

Очевидно, что ваш x[n + 1] доступа терпит неудачу, поскольку n является 4 там, так n + 1 5, один слишком много для доступа к x массив, который имеет длину 5 и, таким образом, индексы от 0 до 4.

EDIT: Ваш psi_j() дает мне такое же поведение.

Позвольте мне продолжать гадать: что бы мы ни делали, мы должны обеспечить, чтобы n + 1 оставался ниже len(x). Так что может быть

for n2 in range(0, (len(x) - 1) * j): 

было бы полезно. Она производит только цифры 0..11, но я думаю, что это единственное, что можно ожидать от него: последние детали только может быть

3*3 + 0*(4-3) 
3*3 + 1*(4-3) 
3*3 + 2*(4-3) 

и остановиться. И это достигается с ограничением, о котором я упоминаю здесь.

+0

Я должен указать, и, возможно, это была проблема изначально, что мы должны считать [0,1,2,3,4] в виде 4 терминов. Таким образом, у нас есть слот 0, слот 1 ... слот 4. n не должен быть 4, однако. Если мы вычисляем 5-й член нашей выходной последовательности, мы делаем это следующим образом: n2 = 5 = 3 * (1) + 2 = (работает через функцию) 3x [1] + 2 (x [2] -x [1]) – 114

+0

Я думаю, что ваше решение хорошее, но похоже, что FakeRain получит окончательный срок, пока я могу заставить его работать. Проблема заключается только в том, что, похоже, он не перечисляет каждый элемент, как это было ранее. – 114

+0

Одна из проблем заключается в том, что по мере увеличения значений параметров мы теряем все больше и больше терминов. Например, со списком [0,1,2,2,2,3,3] мы получаем 20 сроков. – 114

2

Если мы думаем о примерных данных [0, 1, 2, 3] и j из 3, проблема заключается в том, что мы пытаемся получить x[4] `в последней итерации.

  • len(x) * j - 2 для этих данных 10
  • range(0, 10) 0 до 9.

Ручная обработка нашей последней итерации позволяет нам разрешить этот код.

n = 3 # or 9/3 
r = 0 # or 9 - 3 * 3 
rtn.append(3 * x[3] + 0 * (x[3 + 1] - x[3])) 

У нас есть код пытается достичь x[3 + 1], который не существует, когда мы имеем только индексы 0 до 3.

Чтобы исправить это, мы могли бы переписать код, как это.

n = n2/j 
r = n2 - n * j 
if r == 0: 
    rtn.append(j * x[n]) 
else: 
    rtn.append(j * x[n] + r * (x[n + 1] - x[n])) 

Если r равен 0, то (x[n + 1] - x[n]) не имеет значения.

Пожалуйста, исправьте меня, если моя математика ошибается в этом. Я не вижу случая, когда n >= len(x) и r != 0, но если это возможно, то мое решение недействительно.

+0

Так как len (x) содержит ноль, вы правы. Итак, [0,1,2,3,4] имеет длину 5 и никогда не будет случая, когда нам нужно использовать x [5] и r! = 0. Я думаю, ваше решение работает отлично. – 114

+0

Однако у меня проблема, когда я пытаюсь запустить ее. Не ошибка, но она просто печатает одно число. Является ли моя адаптация вашего кода в моем оригинальном посте? – 114

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