Как интегрировать по кривой в 2D-пространстве, параметризованной полиномом? - PullRequest
1 голос
/ 05 марта 2020

У меня есть простая кривая в 2D-пространстве (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)

1 Ответ

2 голосов
/ 05 марта 2020

Длина ar c - это многочлен от одной переменной для параметра кривой. Вам нужно определить выражение для дифференциала длины ar c, и тогда вы сможете интегрировать по нему, как объяснено в ссылка в комментариях . Как вы можете видеть, это может быть просто выражено как евклидова норма вектора (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, и тогда вам не понадобится какой-либо метод интеграции.

...