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

Python—计算移动对象的路径长度,python,math,Python,Math,我正在上大学的科学规划课程。我们正在使用这本书作为Python科学编程的入门。我试着做很多练习为考试做准备,因为我觉得从数学到编程很难。我认为这有点抽象。我在练习3.10中遇到问题: 计算平面中路径的长度 从(x0,y0)到(xn-1,yn-1)的L的总长度由下式给出: L=∑i=1,…,n-1 sqrt[(xi-xi-1)2+(yi-yi-1)2] 我必须做一个函数路径长度(x,y)来计算L,其中(x,y)=(x0,y0),(x1,y1),(xn-1,yn-1) 然后我必须测试三角形路径(1,

我正在上大学的科学规划课程。我们正在使用这本书作为Python科学编程的入门。我试着做很多练习为考试做准备,因为我觉得从数学到编程很难。我认为这有点抽象。我在练习3.10中遇到问题:

计算平面中路径的长度

从(x0,y0)到(xn-1,yn-1)的L的总长度由下式给出:

L=∑i=1,…,n-1 sqrt[(xi-xi-1)2+(yi-yi-1)2]

我必须做一个函数路径长度(x,y)来计算L,其中(x,y)=(x0,y0),(x1,y1),(xn-1,yn-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)的问题?

如果
x
y
本身就是数字列表,那么您就没有了 你还需要在函数中计算它们吗 我可以用它们。在这种情况下,您的程序将变成:

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

您可以使用zip函数将二维数组快速转换为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

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

让我们把它分解一下

首先我们得到每个点的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,n-1),否则你也会有问题。@duffymo为什么会有问题?非常感谢,我事先没有看到,但现在它有意义:-)我们的书,没有提到zip函数的解压功能,但是知道它的存在非常好。非常感谢你。这可能对将来的使用有帮助。第三行:arr?也许是apts?
np.sum(np.diff(apts, axis=0)**2, axis=1)