Учусь программировать на питоне. В порядке тренировке решил написать программку для простейшего расчета задачи трех тел (см.
http://ru.wikipedia.org/wiki/Задача_трёх_тел).
И, вроде, я уже приближаюсь к концу в этом, но возникает непонятная мне ошибка (то есть я, вроде, понимаю, что ему не нравится, но не понимаю, почему ошибка возникает в этом месте...).
Поскольку программировать я только учусь, код, наверное, не очень "красивый", но пока что я за этим не гонюсь, хотя буду рад, если кто-то укажет на такие места и опишет, как можно сделать лучше.
Вот сама программа:
# A program to calculate movement of three objects in others gravity fields.
import operator
G = 6.6725*10**(-11)
masses = [1, 2, 3]
coordinates = [(0, 10, 20), (10, 20, 0), (20, 10, 0)]
velocitys = [(1, 2, 3), (2, 3, 1), (3, 2, 1)]
def results(coordinate = coordinates, velocity = velocitys, steps = 1000, dt=1):
coord = [coordinate]
t = [0]
allFs = [allF]
allVs = [velocitys]
for i in range (steps+1):
coordi = []
Fi = []
Vi = []
for v in range(len(velocitys) + 1):
t.append (i * dt)
Fs = allF(coord[i], masses)
Fi.append(Fs)
a = map(operator.div, Fs[0], masses)
V = tuple(n/dt for n in a)
Vs = map(operator.add, velocitys[v], V)
Vi.append(Vs)
coordi.append(tuple(sum(pair) for pair in zip(coord[i-1][v], (j*dt for j in allVs[i]))))
allFs.append(Fi)
allVs.append(Vi)
coord.append(coordi)
return coord
def sumOfSquares(r = [1,1,1]):
s = []
for i in r:
s.append (i**2)
return sum(s)
def allF(coordinate = coordinates, mass = masses):
Fs = []
rs = []
for i in range(len(mass)):
r = map(operator.sub, coordinate[i], coordinate[i-1])
rs.append(r)
length = sumOfSquares(r)**0.5
F = G * mass[i-1] * mass[i] / length**2
Fs.append(F)
return [Fs, rs]
print allF()
print results()
А вот результат запуска (строчка, в которой возникает ошибка, выделена лишними отступами в коде программы для удобства - цвет в коде не показывает):
[[2.5021874999999995e-13, 2.2241666666666664e-13, 2.0017499999999996e-12], [[-20, 0, 20], [10, 10, -20], [10, -10, 0]]]
#
#Вставляю пропуск для удобства
#
Traceback (most recent call last):
File "/home/ilya/python scripts/3 objects.py", line 56, in <module>
print results()
File "/home/ilya/python scripts/3 objects.py", line 33, in results
coordi.append(tuple(sum(pair) for pair in zip(coord[i-1][v], (j*dt for j in allVs[i]))))
File "/home/ilya/python scripts/3 objects.py", line 33, in <genexpr>
coordi.append(tuple(sum(pair) for pair in zip(coord[i-1][v], (j*dt for j in allVs[i]))))
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
Буду очень благодарен, если кто-то найдет время, жаление и силу, чтобы разобраться с программкой и помочь!
Спасибо заранее!