SymPy反三角函数为何未返回预期的π相关分数形式值?
问题:SymPy中acos(1/2)返回数值而非π/3的原因?
已知$\cos(\pi/3) = 1/2$,$\tan(\pi/4) = 1$,调用SymPy的acos(1/2)和atan(1/1)时,预期返回$\pi/3$和$\pi/4$,但实际返回的是浮点数(1.04719755119660和0.785398163397448)。而用sp.sqrt(1)/2和sp.sqrt(1)/1作为参数时,却能得到正确的符号化结果$\pi/3$和$\pi/4$,这是为什么?
核心原因
- Python原生的
1/2、1/1是浮点数运算,生成的是近似浮点数(比如0.5是二进制浮点数的近似值,并非精确的分数)。SymPy对浮点数参数的反三角函数,默认会返回数值近似结果,而非符号化的精确表达式。 sp.sqrt(1)返回的是SymPy的符号化整数1(属于Integer类型),后续的除法sp.sqrt(1)/2得到的是SymPy的Rational类型(精确分数1/2),而非浮点数。- SymPy的反三角函数对精确的符号化有理数参数,会优先返回符号化的角度结果(如$\pi/3$、$\pi/4$),因为它能识别这些精确值对应的特殊角度。
代码验证
import sympy as sp # 传入浮点数参数,返回数值近似值 print(sp.acos(1/2)) # 输出:1.04719755119660 print(sp.atan(1/1)) # 输出:0.785398163397448 # 传入SymPy符号化有理数,返回精确符号结果 print(sp.acos(sp.sqrt(1)/2)) # 输出:pi/3 print(sp.atan(sp.sqrt(1)/1)) # 输出:pi/4
更直接的精确写法
不需要借助sqrt(1),可以直接将Python原生数值转为SymPy的符号类型:
import sympy as sp # 使用sp.S()将整数转为符号类型,再做除法得到精确分数 print(sp.acos(sp.S(1)/2)) # 输出:pi/3 # 直接使用sp.Rational定义精确分数 print(sp.atan(sp.Rational(1, 1))) # 输出:pi/4
内容的提问来源于stack exchange,提问作者Quiche31
相关产品推荐
相关产品推荐

