Python - 计算移动对象的路径长度

时间:2013-12-25 14:08:39

标签: python math

我正在攻读科学规划的大学课程。我们正在使用使用Python进行科学编程的入门这本书。我正在尝试做很多练习,为考试做好准备,因为我觉得很难从数学到编程。我觉得有点抽象。我在练习3.10时遇到了麻烦:

计算平面中路径的长度。

从(x 0 ,y 0 )到(x n-1 ,y n-的L的总长度1 )由下式给出:

L =Σ i = 1,...,n-1 sqrt [(x i - x i-1 )< sup> 2 +(y i - y i-1 2 ]

我必须为函数设置函数pathlength(x,y),其中(x,y)=(x 0 ,y 0 ),(x < sub> 1 ,y 1 ),...,(x n-1 ,y n-1

然后我必须测试三角形路径(1,1),(2,1),(1,2),(1,1)

的函数

我一直想弄明白。但我很难知道它必须是(x,y)的函数,但到目前为止我得到的是:

from math import sqrt

def pathlength(x,y):
n = len(pts)
x = [pts[i][0] for i in range(n)]
y = [pts[i][1] for i in range(n)]
lv = [sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range (1,n)]
L = sum (lv)
return L

我不知道这是不是正确的方法。 但是在函数之外实现我的代码我得到了这个:

pts = [
(1,1),
(2,1),
(1,2),
(1,1),
]

n = len(pts)
x = [pts[i][0] for i in range(n)]
y = [pts[i][1] for i in range(n)]
lv = [sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range (1,n)]
L = sum (lv)
print lv
print L

当输入这样的点时,有没有办法解决(x,y)?

3 个答案:

答案 0 :(得分:1)

为了完整起见,我也将在此处留下numpy解决方案。因为如果你正在处理科学编程,你很可能在某些时候使用numpy。至少你应该知道它:)

import numpy as np
pts = [(0,0), (0,1), (3,1), (3,0)] # Corners of rectangle of height 1, length 3
arr = np.array(pts) # Make it a numpy array
lengths = np.sqrt(np.sum(np.diff(apts, axis=0)**2, axis=1)) # Length between corners
total_length = np.sum(lengths)

让我们把它分解。

我们得到每个点的x和y坐标之间的平方差异。

np.diff(apts, axis=0)**2

我们得到的是一个新数组,其中第一列包含所有(x_i - x_(i-1))^2,第二列包含相应的(y_i - y_(i-1))^2

现在我们通过对前一个数组中的两列进行求和来计算实际的平方距离

np.sum(np.diff(apts, axis=0)**2, axis=1)

最后一步当然只是平方根,以获得长度而不是平方长度。

答案 1 :(得分:0)

如果xy是数字列表本身,则不会 需要在函数内部计算它们,你 可以使用它们。在这种情况下,您的计划将成为:

from math import sqrt

def pathlength(x,y):
    n = len(x) 
    lv = [sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range (1,n)]
    L = sum(lv)
    return L

pts = [ (1,1), (2,1), (1,2), (1,1) ]

n = len(pts)
x = [pts[i][0] for i in range(n)]
y = [pts[i][1] for i in range(n)]

# Now call the function with the x and y that you prepared
# and print the result
l = pathlength(x, y)
print l

答案 2 :(得分:0)

您可以使用zip函数将2维数组快速转换为2个向量:

def pathlength(x,y):
    n = len(x)
    lv = [sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range(n)]
    L = sum(lv)
pts = [(1, 1), (2, 1), (1, 2), (1, 1)]
x,y = zip(*pts)
print pathlength(x,y)
x = [1, 2, 1, 1]
y = [1, 1, 2, 1]
print pathlength(x,y)

当你学习numpy时,你也可以写

m = numpy.array(pts)
x,y = m.T