求解参数曲线之间的交点

时间:2019-10-29 11:22:52

标签: python numpy sympy

两条曲线的参数方程如下:

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 个答案:

答案 0 :(得分:1)

对于给定的x,您可以为每个曲线找到t,然后查看相应的y是否相同。您可以使用一些网格跨过x范围,以查找thee曲线命中的位置,并使用二等分线在更精确的x上归零。由于您无法解决x(t) - x的参数t,因此必须使用nsolve来找到一个近似的t。在将Curve1的OP方程校正为与您随后编写的代码相同之后,类似这样的事情会找到4个根的值(以图形方式确认)。

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中实现这种自动化的方式。

答案 1 :(得分:0)

以下可能是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

答案 2 :(得分:0)

两条曲线不同时相交(这就是sin(t)= cos(t)= 0的点,没有解)。所以您真的想知道

npm install cors

相交。

这是两个具有两个未知数的方程,因此使用R = (2*t1 - 2*sin(t1), 2 - 2*cos(t1)) S = (2*t2 - sin(t2), 2 - cos(t2)) 可以轻松解决。您必须对起始值进行一些摸索,才能找到收敛到不同解决方案的值。如果您从图中知道它们的大致含义,那么这是最好的起点。

sympy.nsolve