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 == 0和q != 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情况下的值m和n.似乎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)
并非总是零...
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)
