2015-04-20 4 views
1

Я новичок, и у меня есть вопрос о моем коде на Python. Он не работает, как я думаю. Та часть, которая портя находится в вложен время:Вложенный цикл while не правильно зацикливается на python

import math 
mu=4*math.pi*10**(-7) ##mu naught 
I= 
float(input('Enter a value for the current measured in Amperes: ')) 
R=abs(float(input('Enter a value for the radius 
of the circle measured in meters: '))) ##radius 
step=R/200 ##Step size for integration 
B=[] ##array for B(r) 
J=[] 
Plot=[B,J] 

k = 1 ##step counter for Circumfrence 
j = 1 ##step counter for Radius 
b_temp = 0 ##place holder to sum b(step*k) 

D_Vector = [R*math.cos(k*math.pi/100),R*math.sin(k*math.pi/100)] 
R_Vector = [R-j*step,0] 

while(j*step<=R): 
    while(k*step<=2*math.pi*R): 
     r=(math.sqrt((R_Vector[0]-D_Vector[0])**2 + 
     (R_Vector[1]-D_Vector[1])**2)) 
     b_temp = b_temp + (mu/(4*math.pi))*I*step*step/(r**2) 
     k=k+1 
     D_Vector = [R*math.cos(k*math.pi/100),R*math.sin(k*math.pi/100)] 
     R_Vector = [R-j*step,0] 
     print(round(r,3), j) 
    B.append(round(b_temp,8)) 
    print('New j value!') 
    b_temp=0 
    J.append(round(step*j,3)) 

    j=j+1 

Он должен уйти радиус (первый в то время как петля), а затем цикл по кругу, подводя вклад магнитного поля для каждого куска проволоки. По какой-то причине, это не цикл через внутренний цикл, каждая итерация внешнего цикла, как и должно быть, и я честно не знаю, почему. Новый J значение линии, чтобы позволить мне увидеть, если он правильно перекручивание, и это мой выход:

... 
13.657 1 
13.884 1 
14.107 1 
14.327 1 
14.543 1 
14.756 1 
14.965 1 
15.17 1 
15.372 1 
New j value! 
New j value! 
New j value! 
New j value! 
New j value! 
New j value! 
New j value! 
New j value! 
... 

1 в конце каждого поплавка (значение радиуса) значение у, который остается в 1 для каждый круг вокруг петли ...

+0

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

+0

Каков желаемый результат? –

ответ

1

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

Обратите внимание, что вы должны избегать циклов while, когда вы просто выполняете итерацию по целочисленному диапазону. Просто используйте for j in range(a, b). Это позволяет избежать ошибок, которые у вас есть в коде.

Если я не ошибаюсь, вы можете заменить петли с:

area = 2*math.pi*R 

for j in range(1, R//step + 1): 
    # j*step <= R holds 
    for k in range(1, area // step + 1): 
     # k * step <= area holds here 

где a // b является фактор a и b.

+0

Спасибо, миллион, что одна линия зафиксировала его. – Tyler

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