Решение для точек пересечения между параметрическими кривыми - PullRequest
0 голосов
/ 29 октября 2019

Параметрические уравнения двух кривых следующие:

Curve1: r(t) = (2(t-sin(t)),2(1 -cos(t)))

Curve2: s(t) = (2t - sin(t),2 - cos(t))

Мне нужно найти точки пересечения в регионе [0,4π].

Мне удалось построить график для упомянутой области и наблюдать 4 точки пересечения. Но я не могу определить точные точки пересечения.

Для непараметрических уравнений можно использовать fsolve из sympy, но кривые, которые приведены в их параметрических формах, я неудалось найти обходной путь.

t = np.arange(-0.25*np.pi,4.25*np.pi,0.01)
rx = np.zeros(len(t))
ry = np.zeros(len(t))
for i in t:
   rx = 2*(t - np.sin(t))
   ry = 2*(1 - np.cos(t))
sx = np.zeros(len(t))
sy = np.zeros(len(t))
for i in t:
   sx = 2*t - np.sin(t)
   sy = 2 - np.cos(t)
plt.plot(rx,ry)
plt.plot(sx,sy)

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Для данного x вы можете найти t для каждой кривой и посмотреть, совпадают ли соответствующие y. Вы можете перешагнуть через диапазон x с помощью некоторой сетки, ища такие места, куда попадают кривые, и использовать деление пополам, чтобы сосредоточиться на более точном x. Поскольку вы не можете определить параметрикс x(t) - x для t, nsolve придется использовать для поиска приблизительного значения t. Нечто подобное находит значения для ваших 4 корней (подтвержденные графически) после исправления вашего OP-уравнения для Curve1 такими же, как в коде, который вы написали позже.

f = lambda xx: a[1].subs(t, tt)-b[1].subs(t,nsolve(b[0]-xx,tlast))
tlast = 0 # guess for t for a given xx to be updated as we go
tol = 1e-9  # how tight the bounds on x must be for a solution
dx = 0.1
for ix in range(300):
 xx = ix*dx
 tt=nsolve(a[0]-xx,tlast)
 y2 = f(xx)
 if ix != 0 and yold*y2 < 0 and tt<4*pi:
   tlast = tt  # updating guess for t
   # bisect for better xx now that bounding xx are found
   x1 = xx-dx
   x2 = xx
   y1 = yold
   while x2 - x1 > tol:
     xm = (x1 + x2)/2
     ym = f(xm)
     if ym*y1 < 0:
       y2 = ym
       x2 = xm
     elif ym != 0:
       y1 = ym
       x1 = xm
     else:
       break
   print(xm)  # a solution
 yold = y2

Я не знаю оболее автоматизированный способ сделать это в SymPy.

0 голосов
/ 31 октября 2019

Две кривые не пересекаются одновременно (это были бы точки, где sin (t) = cos (t) = 0, которые не имеют решений). Таким образом, вы действительно хотите знать, когда

R = (2*t1 - 2*sin(t1), 2 - 2*cos(t1))
S = (2*t2 - sin(t2), 2 - cos(t2))

пересекаются.

Это два уравнения с двумя неизвестными, поэтому решить с помощью sympy.nsolve просто. Вам нужно немного поиграть с начальными значениями, чтобы найти те, которые сходятся к разным решениям. Если вы знаете, что они примерно из графика, это лучшее место для начала.

>>> t1, t2 = symbols('t1 t2')
>>> R = (2*t1 - 2*sin(t1), 2 - 2*cos(t1))
>>> S = (2*t2 - sin(t2), 2 - cos(t2))
>>> nsolve([R[0] - S[0], R[1] - S[1]], [t1, t2], [1, 1])
Matrix([
[ 1.09182358380672],
[0.398264297579454]])
>>> nsolve([R[0] - S[0], R[1] - S[1]], [t1, t2], [5, 5])
Matrix([
[5.19136172337286],
[5.88492100960013]])
>>> nsolve([R[0] - S[0], R[1] - S[1]], [t1, t2], [7, 7])
Matrix([
[7.37500889098631],
[6.68144960475904]])
>>> nsolve([R[0] - S[0], R[1] - S[1]], [t1, t2], [10, 10])
Matrix([
[11.4745470305524],
[12.1681063167797]])
0 голосов
/ 29 октября 2019

Вероятно, следующая версия SymPy:

from sympy import *
from sympy.geometry import Curve

t = Symbol("t", real=True)

r = Curve((2*(t-sin(t)), 2*(-cos(t))), (t, 0, 4*pi))
s = Curve((2*t - sin(t), 2 - cos(t)), (t, 0, 4*pi))

print(intersection(r, s))

Но, к сожалению, это возвращает NotImplementedError

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...