wolfram-mathematica - 给定整数约束在 Mathematica 中简化积分结果的正确方法

标签 wolfram-mathematica

计算以下积分应为非零,并且 mathematica 正确给出非零结果

Integrate[ Cos[ (Pi * x)/2 ]^2 * Cos[ (3*Pi*x)/2 ]^2, {x, -1, 1}]

但是,尝试更一般的积分:
FullSimplify[
    Integrate[Cos[(Pi x)/2]^2 Cos[((2 n + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/2], 
              {x, -1, 1}], 
    Element[{m, n}, Integers]]

产生零,这对于 m = n = 1 绝对不是真的

我期待一个条件表达式。是否可以在计算积分之前“告诉”mathematica 关于我对 m 和 n 的约束,以便它正确处理特殊情况?

最佳答案

虽然我迟到了,但到目前为止,没有人给出完整的解决方案。

有时,在积分之前更好地了解被积函数是值得的。考虑,

ef = TrigReduce[
    Cos[(Pi x)/2]^2 Cos[((2 n + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/2]]/.
  Cos[a_] :> Cos[ Simplify[a, Element[{m,n}, Integers] ] ]

返回
(2 Cos[(m - n) Pi x] + Cos[(1 + m - n) Pi x] + Cos[(1 - m + n) Pi x] + 
 Cos[(m + n) Pi x] + 2 Cos[(1 + m + n) Pi x] + Cos[(2 + m + n) Pi x] )/8

其中每个术语的形式为 Cos[q Pi x]带积分q .现在,在集成 Cos[q Pi x] 时需要考虑两种情况。超过 -1 到 1(其中 q 是整数):q == 0q != 0 .

案例 q = 0 :这是 Mathematica 在一般结果中遗漏的一个特殊情况,因为它意味着一个常数被积函数。 (我也经常会错过它,在手动执行此操作时,因此 Mathematica 不完全是罪魁祸首。)因此,在这种情况下,积分为 2。

严格来说,这不是真的。当被告知集成时 Cos[ q Pi x ]-1 < x < 1 , Mathematica 返回
2 Sin[ Pi q ]/( Pi q )

这是 0除非 q == 0 .此时,严格意义上的函数是未定义的,但是 Limit[Sin[x]/x, q -> 0] == 1 .作为奇点在q == 0removable ,积分为 2q -> 0 .所以,Mathematica 不会错过它,它只是以一种不能立即识别的形式存在。

案例 q != 0 : 自 Cos[Pi x]是周期为 2 的周期,是 Cos[q Pi x] 的积分来自 x == -1x == 1永远结束q期间。换句话说,
Integrate[ Cos[q Pi x], {x, -1, 1}, 
  Assumptions -> (Element[ q, Integers ] && q != 0) ] == 0

综合起来,这意味着
Integrate[ Cos[q Pi x], {x, -1, 1}, Assumptions -> Element[ q, Integers ] ] == 
Piecewise[{{ q == 0, 2 }, { 0, q!=0 }}]

使用这个,我们可以通过以下方式整合被积函数的扩展形式
intef = ef /. Cos[q_ Pi x] :> Piecewise[{{2, q == 0}, {0, q != 0}}] // 
 PiecewiseExpand 

它承认非积分解决方案。为了解决这个问题,我们需要将条件减少到只有那些具有完整解决方案的条件,我们不妨简化一下:
(Piecewise[{#1, 
    LogicalExpand[Reduce[#2 , {m, n}, Integers]] // 
     Simplify[#] &} & @@@ #1, #2] & @@ intef) /. C[1] -> m

\begin{编辑}

为了限制混淆,内部 Piecewise有结构
{ { { value, condition } .. }, default }

使用中Apply ( @@ ),条件列表是第一个参数,默认是第二个。为了处理这个,我需要简化每个值的条件,所以我使用第二个缩写形式 Apply ( @@@ ) 在条件列表中,以便对于每个值条件对我得到
{ value, simplified condition }

简化过程使用Reduce将条件限制为整数,LogicalExpand帮助消除冗余,以及 Simplify来限制条款的数量。 Reduce内部使用 arbitrary constant , C[1] ,它设置为 C[1] == m ,所以我们设置 C[1]返回 m完成简化

\end{编辑}

这使
Piecewise[{
 {3/4, (1 + n == 0 || n == 0) && (1 + m == 0 || m == 0)},
 {1/2, Element[m, Integers] && 
       (n == m || (1 + m + n == 0 && (m <= -2 || m >= 1)))},
 {1/4, (n == 1 + m || (1 + n == m && (m <= -1 || m >= 1)) || 
       (m + n == 0 && (m >= 1 || m <= 0)) || 
       (2 + m + n == 0 && (m <= -1 || m >= 0))) && 
       Element[m, Integers]},
 {0, True}
}

作为完整的解决方案。

另一个编辑 :我应该指出 1/2 和 1/4 的情况都包含 m 的值和 n在 3/4 的情况下。似乎 3/4 的情况可能是其他两个的交集,因此是它们的总和。 (我没有做过计算,但我强烈怀疑它是真的。)Piecewise按顺序评估条件(我认为),所以没有机会得到这个不正确。

再次编辑 :Piecewise的简化object 并不像它应有的那样有效。问题在于替换规则的位置 C[1] -> m .碰巧在 Simplify 的过程中迟到了来利用它。但是,如果将其带入 LogicalExpand和假设被添加到 Simplify
(Piecewise[{#1, 
    LogicalExpand[Reduce[#2 , {m, n}, Integers] /. C[1] -> m] // 
     Simplify[#, {m, n} \[Element] Integers] &} & @@@ #1, #2] & @@ intef)

然后产生更清洁的结果
Piecewise[{
 {3/4, -2 < m < 1 && -2 < n < 1}, 
 {1/2, (1 + m + n == 0 && (m >= 1 || m <= -2)) || m == n}, 
 {1/4, 2 + m + n == 0 || (m == 1 + n && m != 0) || m + n == 0 || 1 + m == n},
 {0, True}
}]

关于wolfram-mathematica - 给定整数约束在 Mathematica 中简化积分结果的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743774/

相关文章:

image - 锥体图像细化

wolfram-mathematica - 结合使用 `With`和 `Rules`列表-但不影响 `With`的正常行为

wolfram-mathematica - Mathematica 未评估 #1

wolfram-mathematica - 如何从Mathematica中的SQLDateTime对象提取日期

wolfram-mathematica - Wolfram Workbench 和 Mathematica 帮助系统

wolfram-mathematica - Mathematica,FrameTicks 在不同类型的图中不一致

wolfram-mathematica - 有没有更快的方法来找到最小值和最大值?

math - 求第一象限中圆和两条直线的切点

wolfram-mathematica - 如何查询计划任务的状态(事件与否)?

matlab - 从 Mathematica 调用 Matlab 的非 Windows 方式