旋转坐标系 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
我是 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