def _solve_real_trig(f, symbol): """ Helper to solve trigonometric equations """ f = trigsimp(f) f = f.rewrite(exp) f = together(f) g, h = fraction(f) y = Dummy('y') g, h = g.expand(), h.expand() g, h = g.subs(exp(I * symbol), y), h.subs(exp(I * symbol), y) if g.has(symbol) or h.has(symbol): return ConditionSet(symbol, Eq(f, 0), S.Reals) solns = solveset_complex(g, y) - solveset_complex(h, y) if isinstance(solns, FiniteSet): return Union( *[invert_complex(exp(I * symbol), s, symbol)[1] for s in solns]) elif solns is S.EmptySet: return S.EmptySet else: return ConditionSet(symbol, Eq(f, 0), S.Reals)
def _solve_real_trig(f, symbol): """ Helper to solve trigonometric equations """ f = trigsimp(f) f = f.rewrite(exp) f = together(f) g, h = fraction(f) y = Dummy('y') g, h = g.expand(), h.expand() g, h = g.subs(exp(I*symbol), y), h.subs(exp(I*symbol), y) if g.has(symbol) or h.has(symbol): raise NotImplementedError solns = solveset_complex(g, y) - solveset_complex(h, y) if isinstance(solns, FiniteSet): return Union(*[invert_complex(exp(I*symbol), s, symbol)[1] for s in solns]) elif solns is S.EmptySet: return S.EmptySet else: raise NotImplementedError
def _solve_trig(f, symbol, domain): """ Helper to solve trigonometric equations """ f = trigsimp(f) f_original = f f = f.rewrite(exp) f = together(f) g, h = fraction(f) y = Dummy("y") g, h = g.expand(), h.expand() g, h = g.subs(exp(I * symbol), y), h.subs(exp(I * symbol), y) if g.has(symbol) or h.has(symbol): return ConditionSet(symbol, Eq(f, 0), S.Reals) solns = solveset_complex(g, y) - solveset_complex(h, y) if isinstance(solns, FiniteSet): result = Union(*[invert_complex(exp(I * symbol), s, symbol)[1] for s in solns]) return Intersection(result, domain) elif solns is S.EmptySet: return S.EmptySet else: return ConditionSet(symbol, Eq(f_original, 0), S.Reals)
from sympy import solve, symbols, pi, sin, cos from sympy.simplify.simplify import trigsimp def msprint(expr): pr = MechanicsStrPrinter() return pr.doprint(expr) theta = symbols('theta:3') x = symbols('x:3') q = symbols('q') A = ReferenceFrame('A') B = A.orientnew('B', 'SPACE', theta, 'xyz') O = Point('O') P = O.locatenew('P', x[0] * A.x + x[1] * A.y + x[2] * A.z) p = P.pos_from(O) # From problem, point P is on L (span(B.x)) when: constraint_eqs = {x[0] : q*cos(theta[1])*cos(theta[2]), x[1] : q*cos(theta[1])*sin(theta[2]), x[2] : -q*sin(theta[1])} # If point P is on line L then r^{P/O} will have no components in the B.y or # B.z directions since point O is also on line L and B.x is parallel to L. assert(trigsimp(dot(P.pos_from(O), B.y).subs(constraint_eqs)) == 0) assert(trigsimp(dot(P.pos_from(O), B.z).subs(constraint_eqs)) == 0)