旋转坐标系 sympy

rotating coordinate systems sympy

我是 sympy 的初学者,所以我可能忽略了一些基本的东西。我想旋转我的坐标系,这样我就可以在标准位置建立一个双曲线,然后将其转换为任意情况。首先我建立我的等式:

> x, y, a, b, theta = symbols('x y a b theta')
> f = Eq(x ** 2/a ** 2 - y ** 2/b ** 2, 1)
> f1 = f.subs({a: 5, b: 10})
> f1
> x**2/25 - y**2/100 == 1

接下来我想旋转它,我尝试使用 sub:

> f1.subs({x: x*cos(theta) - y*sin(theta), y: x*sin(theta) + y*cos(theta)})
> -(x*sin(theta) + y*cos(theta))**2/100 + (x*cos(theta) - (x*sin(theta) + y*cos(theta))*sin(theta))**2/25 == 1

但这行不通,因为显然 x 的替换是在 y 的替换之前进行的,并且被替换的 x 的值已经更新。一定有某种方法可以进行这种替换,对吧?

或者是否有比 sympy 更好的工具来执行此操作?一旦我得到双曲线,我就会想找到不同双曲线之间的交点。

感谢您的任何建议。

一个简单的解决方案是使用临时符号:

x_temp, y_temp = symbols('x_temp y_temp')
f1.subs({x: x_temp*cos(theta) - y_temp*sin(theta), y: x_temp*sin(theta) + y_temp*cos(theta)}).subs({x_temp: x, y_temp: y})

> -(x*sin(theta) + y*cos(theta))**2/100 + (x*cos(theta) - y*sin(theta))**2/25 == 1

I think sympy can do what you want. There is a polysys modules in sympy.solvers :

"""
Solve a system of polynomial equations.

Examples
========

>>> from sympy import solve_poly_system
>>> from sympy.abc import x, y

>>> solve_poly_system([x*y - 2*y, 2*y**2 - x**2], x, y)
[(0, 0), (2, -sqrt(2)), (2, sqrt(2))]

"""

您可以在 .subs( ) 方法中设置 simultaneous=True 以强制 SymPy 立即替换所有变量(实际上, SymPy 在内部创建临时变量,进行替换,然后恢复旧变量)。

In [13]: f1.subs({x: x*cos(theta) - y*sin(theta),
                  y: x*sin(theta) + y*cos(theta)}, simultaneous=True)
Out[13]: 
                   2                        2    
  (x⋅sin(θ) + y⋅cos(θ))    (x⋅cos(θ) - y⋅sin(θ))     
- ────────────────────── + ────────────────────── = 1
           100                       25

否则使用 .xreplace( ... ) 而不是 .subs( ... )

In [11]: f1.xreplace({x: x*cos(theta) - y*sin(theta), 
                      y: x*sin(theta) + y*cos(theta)})
Out[11]: 
                       2                        2    
  (x⋅sin(θ) + y⋅cos(θ))    (x⋅cos(θ) - y⋅sin(θ))     
- ────────────────────── + ────────────────────── = 1
           100                       25