【问题标题】:How to avoid useless piecewised solutions from sympy如何避免来自 sympy 的无用分段解决方案
【发布时间】:2017-08-09 16:44:32
【问题描述】:

来自

from sympy import *
t,r = symbols('t r', real=True, nonnegative=True)
c_x,c_y,a1,a2 = symbols('c_x c_y a1 a2', real=True)
integrate(-r*(a1 - a2)*(c_x*cos(-a1*t + a1 + a2*t) + c_y*sin(-a1*t + a1 + a2*t) + r)/2,(t,0,1))

我得到分段解

Piecewise((-a1*c_x*r*cos(a2)/2 - a1*c_y*r*sin(a2)/2 - a1*r**2/2 + a2*c_x*r*cos(a2)/2 + a2*c_y*r*sin(a2)/2 + a2*r**2/2, Eq(a1, a2)), (-a1*r**2/2 + a2*r**2/2 - c_x*r*sin(a1)/2 + c_x*r*sin(a2)/2 + c_y*r*cos(a1)/2 - c_y*r*cos(a2)/2, True))

不需要分段,因为如果a1=a2两个表达式都是0,那么第二个表达式实际上是一个全局非分段解。

所以我的第一个问题是:我可以让 sympy 给我非分段解决方案吗? (通过设置一些选项或其他任何东西)

不管上述可能性如何,既然我可以接受a1 不等于a2(这是一个不感兴趣的极限情况),有没有办法告诉同情这种假设? (再次为了获得非分段解)

在此先感谢一位同情的新手。

附:对于同样的问题,Maxima 直接给出了非分段解。

【问题讨论】:

  • 有一个关键字conds,默认为“分段”。它也可以设置为“分离”或“无”。后者可能是正确的方向。但是,由于它是一个定积分,也许您也可以尝试关键字manual=True ..
  • @Uvar 谢谢,在这种情况下,所有 3 个选项都有效,尽管我不完全了解它们的作用,并且文档没有太大帮助。例如,选项conds='separate' 应该将解决方案作为元组而不是分段给出,但会给出唯一(但正确)的解决方案。
  • 移至答案,因为它似乎已经成功了。我和你一样对conds='separate' 感到困惑

标签: python sympy


【解决方案1】:

有一个默认为“分段”的关键字 conds。它也可以设置为“分离”或“无”。但是,由于它是一个定积分,可能您也可以尝试关键字 manual=True ..

如果您将关键字设置为conds='separate',它应该返回一个具有收敛条件的不同元组。我试过了,只给出了一个解决方案。我还不知道为什么这种行为不像预期的那样。 conds='none' 关键字不应该返回收敛条件,只返回解决方案。这就是我认为您正在寻找的东西。

另一个仅在定积分上下文中有效的选项是另一个关键字manual=True。这模拟了手动积分,方便地“忘记”检查收敛条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多