如何对由多项式参数化的 2D space 曲线进行积分?
How do you integrate over a curve in 2D space that is parameterized by a polynomial?
我有一条简单的 2D 曲线 space (x, y)
由多项式作为 t
的函数参数化,我想知道该曲线的长度。我如何做到这一点?我查看了 scipy.integrate
和 numpy.polyint
,但没有找到解决方案。似乎它们都只能对一维多项式进行积分。这是曲线的示例:
import numpy as np
from scipy import integrate
x0, y0 = 0.0, 0.0
vx, vy = 0.1, 0.1
ax, ay = -0.0001, 0
coeff = np.array([[ax, ay], [vx, vy], [x0, y0]])
pos = lambda t: np.polyval(coeff, t)
弧长是曲线参数上的单变量多项式。您需要定义弧长微分的表达式,然后才能对其进行积分,如 the link in the comments 中所述。正如你在那里看到的,它可以简单地表示为向量的欧几里德范数(dx/dt, dy/dt)
。因此,您可以通过以下方式实现它:
import numpy as np
import scipy
x0, y0 = 0.0, 0.0
vx, vy = 0.1, 0.1
ax, ay = -0.0001, 0
coeff = np.array([[ax, ay], [vx, vy], [x0, y0]])
# Position expression is not really necessary
pos = lambda t: np.polyval(coeff, t)
# Derivative of the arc length
def ds(t):
# Coefficients of polynomial derivative
coeff_d = coeff[:-1] * np.arange(len(coeff) - 1, 0, -1)[:, np.newaxis]
# Norm of position derivatives
return np.linalg.norm(np.polyval(coeff_d, np.expand_dims(t, -1)), axis=-1)
# Integrate across parameter interval
t_start, t_end = 0, 1
arc_length, err = scipy.integrate.quad(ds, t_start, t_end)
print(arc_length)
# 0.1413506691471052
当然,你可以尝试求出ds
的积分的解析表达式,这样就不需要任何积分方法了
我有一条简单的 2D 曲线 space (x, y)
由多项式作为 t
的函数参数化,我想知道该曲线的长度。我如何做到这一点?我查看了 scipy.integrate
和 numpy.polyint
,但没有找到解决方案。似乎它们都只能对一维多项式进行积分。这是曲线的示例:
import numpy as np
from scipy import integrate
x0, y0 = 0.0, 0.0
vx, vy = 0.1, 0.1
ax, ay = -0.0001, 0
coeff = np.array([[ax, ay], [vx, vy], [x0, y0]])
pos = lambda t: np.polyval(coeff, t)
弧长是曲线参数上的单变量多项式。您需要定义弧长微分的表达式,然后才能对其进行积分,如 the link in the comments 中所述。正如你在那里看到的,它可以简单地表示为向量的欧几里德范数(dx/dt, dy/dt)
。因此,您可以通过以下方式实现它:
import numpy as np
import scipy
x0, y0 = 0.0, 0.0
vx, vy = 0.1, 0.1
ax, ay = -0.0001, 0
coeff = np.array([[ax, ay], [vx, vy], [x0, y0]])
# Position expression is not really necessary
pos = lambda t: np.polyval(coeff, t)
# Derivative of the arc length
def ds(t):
# Coefficients of polynomial derivative
coeff_d = coeff[:-1] * np.arange(len(coeff) - 1, 0, -1)[:, np.newaxis]
# Norm of position derivatives
return np.linalg.norm(np.polyval(coeff_d, np.expand_dims(t, -1)), axis=-1)
# Integrate across parameter interval
t_start, t_end = 0, 1
arc_length, err = scipy.integrate.quad(ds, t_start, t_end)
print(arc_length)
# 0.1413506691471052
当然,你可以尝试求出ds
的积分的解析表达式,这样就不需要任何积分方法了