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

Pee*_*oot 13 wolfram-mathematica

评估以下积分应该是非零的,并且mathematica正确地给出非零结果

Integrate[ Cos[ (Pi * x)/2 ]^2 * Cos[ (3*Pi*x)/2 ]^2, {x, -1, 1}]
Run Code Online (Sandbox Code Playgroud)

但是,尝试更一般的积分:

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]]
Run Code Online (Sandbox Code Playgroud)

产生零,对于m = n = 1,这肯定不正确

我期待一个条件表达式.是否有可能在评估积分之前"告诉"mathematica关于m和n的约束,以便它正确处理特殊情况?

rco*_*yer 11

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

有时,在集成之前更好地理解被积函数是有益的.考虑,

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] ] ]
Run Code Online (Sandbox Code Playgroud)

返回

(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
Run Code Online (Sandbox Code Playgroud)

其中每个术语都有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 )
Run Code Online (Sandbox Code Playgroud)

这是0除了什么时候q == 0.那时,严格意义上的函数是未定义的,但是Limit[Sin[x]/x, q -> 0] == 1.由于奇异的q == 0可移动的,积分是2时候q -> 0.因此,Mathematica不会错过它,它只是一种不能立即识别的形式.

案例q != 0:由于Cos[Pi x]是第2期的周期性,因此Cos[q Pi x]x == -1到的积分x == 1总是会超过q期间.换一种说法,

Integrate[ Cos[q Pi x], {x, -1, 1}, 
  Assumptions -> (Element[ q, Integers ] && q != 0) ] == 0
Run Code Online (Sandbox Code Playgroud)

总之,这意味着

Integrate[ Cos[q Pi x], {x, -1, 1}, Assumptions -> Element[ q, Integers ] ] == 
Piecewise[{{ q == 0, 2 }, { 0, q!=0 }}]
Run Code Online (Sandbox Code Playgroud)

使用这个,我们可以整合扩展形式的被积函数

intef = ef /. Cos[q_ Pi x] :> Piecewise[{{2, q == 0}, {0, q != 0}}] // 
 PiecewiseExpand 
Run Code Online (Sandbox Code Playgroud)

承认非完整的解决方案.为了清理它,我们需要将条件减少到只有那些具有完整解决方案的条件,我们也可以简化:

(Piecewise[{#1, 
    LogicalExpand[Reduce[#2 , {m, n}, Integers]] // 
     Simplify[#] &} & @@@ #1, #2] & @@ intef) /. C[1] -> m
Run Code Online (Sandbox Code Playgroud)

\ {开始}编辑

为了限制混淆,内部Piecewise有结构

{ { { value, condition } .. }, default }
Run Code Online (Sandbox Code Playgroud)

在using Apply(@@)中,条件列表是第一个参数,默认值是第二个参数.为了处理这个,我需要简化每个值的条件,然后我在条件列表上使用第二个简短形式的Apply(@@@),这样我得到的每个值条件对

{ value, simplified condition }
Run Code Online (Sandbox Code Playgroud)

简化过程用于Reduce将条件限制为整数,LogicalExpand以帮助消除冗余,并Simplify限制术语的数量.Reduce在内部使用它设置为的任意常量,因此我们回过头来完成简化C[1]C[1] == mC[1]m

\ {结束编辑}

这使

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}
}
Run Code Online (Sandbox Code Playgroud)

作为完整的解决方案.

另一个编辑:我应该指出,1/2和1/4情况都包括3/4情况下的值mn.似乎3/4的情况可能是另外两个的交集,因此,它们的总和.(我没有完成计算,但我强烈怀疑它是真的.)Piecewise按顺序评估条件(我认为),所以没有机会得到这个错误.

再次编辑:Piecewise对象的简化不如它有效.问题在于替换规则的放置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)
Run Code Online (Sandbox Code Playgroud)

然后产生更清洁的结果

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}
}]
Run Code Online (Sandbox Code Playgroud)

  • +1.我认为,你的答案显示了人们应该如何在Mathematica中工作的本质,并强调它是一种(非常复杂的)工具,仍然必须由人类驱动,指导和帮助才能得到最佳使用.开箱即用的解决方案往往是完整的,但是,虽然这肯定是最终的目标,但是一个有动力的人类+ Mathematica,一前一后工作,总能比单独的Mathematica更能实现.如果可以的话,会投票两次. (3认同)

Dr.*_*ius 5

并非总是零...

k = Integrate[
         Cos[(Pi x)/2]^2 Cos[((2 (n) + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/ 2], 
         {x, -1, 1}, Assumptions -> Element[{m, n}, Integers]];

(*Let's find the zeroes of the denominator *)

d = Denominator[k];
s = Solve[d == 0, {m, n}]

(*The above integral is indeterminate at those zeroes, so let's compute 
  the integral again there (a Limit[] could also do the work) *)

denZ = Integrate[
          Cos[(Pi x)/2]^2 Cos[((2 (n) + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/ 2] /.s, 
          {x, -1, 1}, Assumptions -> Element[{m, n}, Integers]];

(* All possible results are generated with m=1 *)

denZ /. m -> 1

(*
{1/4, 1/2, 1/4, 1/4, 1/2, 1/4}
*)
Run Code Online (Sandbox Code Playgroud)

可视化这些案例:

Plot[Cos[(Pi x)/2]^2 Cos[((2 (n) + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/2] 
     /. s /. m -> 1, {x, -1, 1}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

与零结果积分比较:

Plot[Cos[(Pi x)/2]^2 Cos[((2 (n) + 1) Pi x)/2] Cos[((2 m + 1) Pi x)/ 2] 
     /. {m -> 1, n -> 4}, {x, -1, 1}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述