sympy - 我怎样才能说服 Sympy 对 1961 年 MIT 本科生微积分问题进行同样的简化?

标签 sympy equation simplification

James R Slagle 麻省理工学院论文的程序解决新生微积分中符号积分问题的启发式程序,符号自动积分器(SAINT)很出名(ish)作为第一个实用的“专家系统”符号积分器,并且能够解决麻省理工学院本科微积分测试中的所有问题(迂腐地,错过了一些问题,但它可以解决它们;详细信息请参见in this excellent YouTube video)

他的论文可以在这里免费获得:https://dspace.mit.edu/handle/1721.1/11997

我很高兴尝试 Sympy 来解决这个问题,因为它看起来很平易近人,并且是一个相当困难的简化,我碰巧已经有了答案..但是,Sympy 并没有将积分简化为如此好的(主观?)简化,例如1961 年的程序(尽管它确实返回了相同的结果!)


问题与推测

如何说服 Sympy 简化为相同的方程?
为什么它没有得到相同的、看似更简单的结果?

也许它会选择第一个可能的结果,或者 tan**3 被确定为更糟糕?如果是这样,为什么它不简化 SAINT 的输出?)

当它找到一些匹配的Fu-routine时,也许它会启动一个不同的分支。 ?

考试题3c

MIT problem 3c

Sympy 简化

from sympy import *
x = symbols("x", real=True)  # should this be assumed?
expr_inner = (x**4) / ((1 - x**2)**Rational(5,2))
expr_integral = integrate((expr_inner), x)
print(simplify(expr_integral))

(x**4*asin(x) + 4*x**3*sqrt(1 - x**2)/3 - 2*x**2*asin(x) - x*sqrt(1 - x**2) + asin(x))/(x**4 - 2*x**2 + 1)

平等证明

from sympy import *
x = symbols("x", real=True)  # should this be assumed?
expr_saint = asin(x) + Rational(1,3)*tan(asin(x))**3 - tan(asin(x))
expr_sympy = (x**4*asin(x) + 4*x**3*sqrt(1 - x**2)/3 - 2*x**2*asin(x) - x*sqrt(1 - x**2) + asin(x))/(x**4 - 2*x**2 + 1)
expr_saint.equals(expr_sympy)  # alternatively simplify(expr_saint - expr_sympy) https://stackoverflow.com/a/37115190/

True

方程显示

init_printing display

最佳答案

主要部分是分解出 asin(x) 并将其与分数分开。之后,sympy 可以证明两个表达式相等:

from sympy import *
from IPython.display import Math, display
x = symbols("x", real=True)  # should this be assumed?
expr_saint = asin(x) + Rational(1,3)*tan(asin(x))**3 - tan(asin(x))
expr_sympy = (x**4*asin(x) + 4*x**3*sqrt(1 - x**2)/3 - 2*x**2*asin(x) - x*sqrt(1 - x**2) + asin(x))/(x**4 - 2*x**2 + 1)

r=[]
r.append(latex(expr_sympy))
expr_sympy = expr_sympy.collect(asin(x))
r.append(latex(expr_sympy))
expr_sympy = apart(expr_sympy,asin(x))
r.append(latex(expr_sympy))

display(Math(" \\Longrightarrow ".join(r)))

display(simplify(expr_saint - expr_sympy))

输出:

enter image description here

关于sympy - 我怎样才能说服 Sympy 对 1961 年 MIT 本科生微积分问题进行同样的简化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65650999/

相关文章:

python - 如何用 sympy 简化矩阵中的分数?

python - 将符号方程解析为 Sympy 函数

c++ - 使用 csparse : cs_cholsol 求解简单的稀疏线性方程组

c# - 我可以简化这段代码吗?如果是这样的话

python:比较等效坐标

python - 将 NumPy 中定义的函数转换为 SymPy

python - Sympy:删除多项式中的高阶项

markdown - 如何获得方程中某个数字正下方的数字?

php - 有什么方法可以简化 linux 和 windows 的 php 应用程序的安装?

c++ - 模板简化