如何解决我如何说服 Sympy 对 1961 年 MIT 本科微积分问题进行 SAINT 的简化?
James R Slagle MIT 论文的程序解决大一微积分中符号积分问题的启发式程序,符号自动积分器(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
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
方程显示
解决方法
主要部分是分解 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))
输出:
Proper usage of `tf.scatter_nd` in tensorflow-r1.2
,@wsdookadr 给了我缺少的简化步骤;显示 apart()
可以很容易地自行导出 asin(x)
(这显然是一个公因子),因此创建一个非常相似但比 SAINT 输出更简化的形式。
更多地按照这些思路思考,SAINT 输出并没有像它应该的那样简单,因此在比较之前应该进一步简化(据我所知,SAINT 的设计目的不是为了在集成后继续简化)
- 首先使用
ratsimp()
将结果强制转换为单个分数会促使 Sympy 清理分母(这会合并分数) - 调用
apart()
会将它们分开,但它们仍然被简化
这给出了更预期的匹配
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。