sympy - Symbolic definite integral expression does not yield the same result as numerical evaluation
问题描述
I resolved the definite integral of an expression using sympy in order to get the symbolic expression of the integral. However, when I use the yielded expression in a function, I do not get the same result as given by the numerical evaluation of the integral:
>> from sympy import *
>> x, y, a, b, c, d, k = symbols ('x y a b c d k', positive=True)
>> res = integrate(exp(-k*abs(x-y)), (x, a, b), (y, c, d))
>> res
(-exp(a*k) + exp(b*k))*exp(-b*k)*exp(-k*(a - d))/k**2 - (-exp(a*k) + exp(b*k))*exp(-b*k)*exp(-k*(a - c))/k**2
>> def integral_1(k1, a1, b1, c1, d1):
>> return (-exp(a1*k1) + exp(b1*k1))*exp(-b1*k1)*exp(-k1*(a1 - d1))/k1**2 - (-exp(a1*k1) + exp(b1*k1))*exp(-b1*k1)*exp(-k1*(a1 - c1))/k1**2
>> integral_1(0.6, 0, 1, 0, 1)
1.0303623235681536
>> integrate(exp(-0.6*abs(x-y)), (x, 0, 1), (y, 0, 1))
0.826731311633480
Why do I get such difference?
解决方案
由于 SymPy 错误,符号输出错误。另外:证明它的更好方法是res.subs({k: 0.6, a: 0, b: 1, c: 0, d: 1})
返回 1.03...,这对于以 1 为界的函数在单位平方上的积分显然是不可能的。
abs
问题是 SymPy(从 1.3 版开始)在这个积分中不能正确处理。如果您根本不包含它,它的输出res
将是相同abs
的。一个更简单的例子:
>>> integrate(exp(abs(x-y)), (x, a, b))
-exp(a - y) + exp(b - y)
这不可能是正确的,因为积分必须取决于 y 相对于 a 和 b 的放置方式。
一种补救措施(直到修复错误)是应用于rewrite(Piecewise)
被积函数,替换abs
为分段函数。例如,正确集成的exp(abs(x-y)).rewrite(Piecewise)
返回。exp(Piecewise((x - y, x - y >= 0), (-x + y, True)))
后
res = integrate(exp(-k*abs(x-y)).rewrite(Piecewise), (x, a, b), (y, c, d))
结果又长又丑,但正确:
>>> res.subs({k: 0.6, a: 0, b: 1, c: 0, d: 1})
0.826731311633481
如果你告诉 SymPy a < b,结果将不会那么长和丑陋,就像这样:
>>> res.subs({a < b: True})
-2*Min(d, Max(a, c))/k + 2*Min(d, Max(a, b, c))/k + (-exp(a*k) + exp(b*k))*exp(-b*k)*exp(-k*(a - Min(d, Max(a, c))))/k**2 - (-exp(a*k) + exp(b*k))*exp(-b*k)*exp(-k*(a - Min(c, d)))/k**2 - (exp(a*k) - exp(b*k))*exp(-a*k)*exp(-k*(-a + Min(d, Max(a, b, c))))/k**2 + (exp(a*k) - exp(b*k))*exp(-a*k)*exp(-k*(-a + d))/k**2 - (-k**2*exp(a*k)*exp(k*(-a + Min(d, Max(a, c)))) + k**2*exp(b*k)*exp(-k*(-a + Min(d, Max(a, c)))))*exp(-b*k)/k**4 + (-k**2*exp(a*k)*exp(k*(-a + Min(d, Max(a, b, c)))) + k**2*exp(b*k)*exp(-k*(-a + Min(d, Max(a, b, c)))))*exp(-b*k)/k**4
推荐阅读
- javascript - 如何在 VueJs 中显示我的 url 参数的详细信息?
- javascript - 如何修复else语句未激活
- javascript - 如何从 NodeJs http 代理读取响应正文
- php - Codeigniter - 当您提交的 URI 包含不允许的字符时重定向
- multithreading - 调试器扩展发送线程事件无法更新线程 UI
- javascript - 选择使用特定字体的字符串
- javascript - 是否可以用曲线(S曲线)做范围条形图
- javascript - 是否可以将 HTML5 音频数据读入浏览器 blob?
- amazon-web-services - AWS-ECS - 使用 awsvpc 模式进行自动扩展
- ios - SwiftUI List NavigationLink 框架的问题(高度:CGFloat)