如何告诉同意在整合中保持准确的数字?

时间:2017-03-29 08:17:43

标签: sympy

当我输入

>python
> from sympy import *
> x=symbols('x')
> integrate(1/4/sin(1/3*x),x)

输出

0.375*log(cos(0.333333333333333*x) - 1) - 0.375*log(cos(0.333333333333333*x) + 1)

如果不同意将精确输入转换为浮点数,应该怎么做?我知道我可以输入以下内容

integrate(S('1/4')/sin(S('1/3')*x),x)

现在结果是

 3*log(cos(x/3) - 1)/8 - 3*log(cos(x/3) + 1)/8

但是我希望得到这个结果,而不必像上面那样用S('')包装每个数字。

是否需要为此导入一个选项或模块?

使用

>conda list sympy
sympy                     1.0                      py36_0 

在Linux上。

2 个答案:

答案 0 :(得分:2)

  

无需用func setCardView(view : UIView){ view.layer.masksToBounds = false view.layer.shadowOffset = CGSize(width: 0, height: 0) view.layer.shadowRadius = 2 view.layer.shadowOpacity = 0.5 }

包装每个数字

将整个表达式包装在S('')

中可以避免这种情况
S('')
  

告诉他们不要将确切的输入转换为浮点

不是SymPy将1/3评估为浮点数;它的Python。在integrate(S('1/4/sin(1/3*x)'), x) 中,除了涉及sin(1/3*x)之类的SymPy对象之前,除法1/3出现在Python级别上。

除此之外:用更加数学上自然的方式表达相同的公式,

x

根本不需要integrate(1/(4*sin(x/3)), x) ,因为这里没有标量的划分。实际上,S()解析为

1/(4*sin(x/3))

Mul(Rational(1, 4), Pow(sin(Mul(Rational(1, 3), Symbol('x'))), Integer(-1))) 解析为

1/4/sin(1/3*x)

答案 1 :(得分:2)

一种选择是使用isympy -i作为您的翻译。这将启动一个交互式SymPy会话,其中使用S自动包装整数,这样您就不必担心划分整数了。但请注意,这只能以交互方式工作。如果要在文件中使用SymPy编写代码,建议使用S或使用Rational包含分割的整数。

顺便说一句,您通常可以通过以不具有integer/integer的方式编写表达式来避免此问题。例如,您可以写1/4/sin(1/3*x)(或1/(4*sin(x/3)))代替1/sin(x/3)/4。当你有一个有理数的时候,你真的需要使用S,比如S(1)/2 + x