我如何说服 Sympy 对 1961 年 MIT 本科微积分问题进行 SAINT 的简化?

如何解决我如何说服 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

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))

输出:

Proper usage of `tf.scatter_nd` in tensorflow-r1.2

,

@wsdookadr 给了我缺少的简化步骤;显示 apart() 可以很容易地自行导出 asin(x)(这显然是一个公因子),因此创建一个非常相似但比 SAINT 输出更简化的形式。

更多地按照这些思路思考,SAINT 输出并没有像它应该的那样简单,因此在比较之前应该进一步简化(据我所知,SAINT 的设计目的不是为了在集成后继续简化)

  • 首先使用 ratsimp() 将结果强制转换为单个分数会促使 Sympy 清理分母(这会合并分数)
  • 调用 apart() 会将它们分开,但它们仍然被简化

这给出了更预期的匹配

ratsimp

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?