如何消元求解仅用A、B、C表示sin(D)、sin(E)的三角联立方程
三角函数联立方程求解方案
问题说明
目前无法求解如下三角函数联立方程:
(1) $\cos(C)=-\sin(B)\sin(D)\cos(E)+\sin(D)\sin(E)\cos(B)$
(2) $-\sin(A)\sin(B)\sin(D)\sin(E)-\sin(A)\sin(D)\cos(B)\cos(E)-\cos(A)\cos(D)=0$
需求为仅使用常量角A、B、C表示$\sin(D)$和$\sin(E)$,原有求解代码运行后结果仍包含$\cos(D)$、$\cos(E)$项,无法消去变量D和E。
原有求解代码如下:
import sympy as sp from sympy import sin, cos sp.init_printing() sp.var('A,B,C,D,E') eq1=sp.Eq(cos(C),-sin(B)*sin(D)*cos(E)+sin(D)*sin(E)*cos(B)) eq2=sp.Eq(0,-sin(A)*sin(B)*sin(D)*sin(E)-sin(A)*sin(D)*cos(B)*cos(E)-cos(A)*cos(D)) sp.solve ([eq1, eq2], [sin(D), sin(E)])
问题原因
原有调用solve时仅指定了sin(D)、sin(E)为求解变量,Sympy不会主动关联三角函数的平方和恒等式,会将cos(D)、cos(E)识别为独立常量处理,因此结果中会保留这两项。
解决方案
方案1:补充约束后用Sympy直接求解
补充$\sin2(D)+\cos2(D)=1$、$\sin2(E)+\cos2(E)=1$两个恒等式约束,将cos(D)、cos(E)也加入求解变量列表即可,修正后代码如下:
import sympy as sp from sympy import sin, cos, solve sp.init_printing() A,B,C,D,E = sp.symbols('A B C D E', real=True) # 原方程 eq1 = sp.Eq(cos(C), -sin(B)*sin(D)*cos(E) + sin(D)*sin(E)*cos(B)) eq2 = sp.Eq(0, -sin(A)*sin(B)*sin(D)*sin(E) - sin(A)*sin(D)*cos(B)*cos(E) - cos(A)*cos(D)) # 补充三角恒等式约束 eq3 = sp.Eq(sin(D)**2 + cos(D)**2, 1) eq4 = sp.Eq(sin(E)**2 + cos(E)**2, 1) # 求解并输出结果 result = solve([eq1, eq2, eq3, eq4], [sin(D), cos(D), sin(E), cos(E)], dict=True) for res in result: print("sin(D) =", res[sin(D)]) print("sin(E) =", res[sin(E)]) print("------")
方案2:手动三角化简后求解(结果更简洁)
利用正弦、余弦的差角公式先对原式做化简:
- 式1右侧提取公因子$\sin(D)$后,可整理为:$\cos(C) = \sin(D) \cdot \sin(E-B)$
- 式2前两项提取公因子后,可整理为:$\sin(A)\sin(D)\cos(E-B) = -\cos(A)\cos(D)$
将上述两个新式子左右两边分别平方后相加,利用$\sin2x+\cos2x=1$消去E相关项,再代入$\cos2(D)=1-\sin2(D)$整理,即可直接得到仅由A、B、C表示的$\sin(D)$,回代后即可求得$\sin(E)$。
内容的提问来源于stack exchange,提问作者Y K
相关产品推荐
相关产品推荐

