积分使用GenerateConditions -> False是何意义?
mathematica吧
全部回复
仅看楼主
level 3
龙泽隆一 楼主
给出五个积分。
Integrate[p*BesselK[2, p] BesselK[2, p], {p, 0, Infinity}]
Integrate[p*BesselK[2, p] BesselK[2, p], {p, 0, Infinity}, GenerateConditions -> False]
Integrate[p^2*BesselK[2, p] BesselK[2, p], {p, 0, Infinity}, GenerateConditions -> False]
Integrate[p^3*BesselK[2, p] BesselK[2, p], {p, 0, Infinity}, GenerateConditions -> False]
Integrate[ p*BesselK[2, p] BesselK[2, p] + p^2*BesselK[2, p] BesselK[2, p] +
p^3*BesselK[2, p] BesselK[2, p], {p, 0, Infinity}, GenerateConditions -> False]
第一个积分,发散,所以没有数值结果。
第二个积分,添加了GenerateConditions -> False,可以得到数值结果。
第一个问题。请问,添加这个条件的目的是什么?添加的这个条件是如何运作的?
第二、三、四个积分,都可以得到数值结果。
第五个积分相当于把第二、三、四个积分相加,但是得不到数值结果。
第二个问题。如何使第五个积分得到数值结果?
目前,我对第二个问题的思考是:首先让计算机读出表达式含有n项相加,每项记为x[i],然后每项分别积分最后求和即可。问题转化为:若表达式为a+b+c+d,如何转化为x[1]=a,x[2]=b,x[3]=c,x[4]=d?
2015年02月01日 09点02分 1
level 8
GenerateConditions的说明是这么写的
Generate a result without conditions that is valid only for some values of parameter
也就是只在某些参数情况下才能得出,省去了是否收敛的检验
既然不能收敛,也不必计算出数值解了。
另外用数值积分指令
NIntegrate[p*BesselK[2,p] BesselK[2,p]+p^2*BesselK[2,p] BesselK[2,p]+p^3*BesselK[2,p] BesselK[2,p],{p,0,Infinity}]
这会得到一个很大的值,会出现收敛太慢,超过递归步数等等情况
2015年02月01日 13点02分 2
第一个积分是发散的。第二个积分就是在第一个积分后面加了个条件,却可以得到有限的数值结果,大小为-0.731863。这个条件是怎么做到的? 我试了数值积分,因为发散,所以确实是很大的结果。
2015年02月02日 17点02分
我认为你对这句英文的理解有误。这句话应该只是单纯地表示GenerateConditions的功能就是“是否给出积分成立的条件”。参考5楼。
2015年02月06日 13点02分
level 3
龙泽隆一 楼主
Integrate[p^3*BesselK[2, p] BesselK[2, p], {p, m, Infinity}]+4 Log[m] /. m -> 10^-64 // N
Integrate[p^3*BesselK[2, p] BesselK[2, p],{p, 0, Infinity},GenerateConditions -> False] // N
以上两个计算的结果都是0.797059。
第一个计算中,两项相加,两项在m=0时都是发散的,但是可以恰好抵消,得到有限的结果。(我是通过寻找同阶无穷大的方法找到了该抵消项)
第二个计算中,同样的发散的积分,添加了 GenerateConditions -> False,却给出了相同的结果。
表面看来, GenerateConditions -> False似乎可以自动消除发散项。
请问,这个条件是否真的有这个功能?
补充:下面这个积分,明显是发散的,积分结果却为零。
Integrate[Log[p] + 1/p^2 + 1/p + 1 + p + p^2 + p^3, {p, 0, Infinity},
GenerateConditions -> False]
2015年02月03日 03点02分 3
单单对Log[p]就得到错误结果了
2015年02月07日 10点02分
level 8
我觉得是这样的,GenerateCondtions加上,就不再进行收敛性检验了,而是直接用NL公式了。之后带入数值根据简单的,诸如0*Inf=0等等的规则得出结果。
所以我不认为它有消解发散项的功能。
而我用的NIntegrate使用的是数值方法,显然数值方法和不加检验的公式算出的会很不一样。
2015年02月04日 15点02分 4
有人这样回复我:With the setting GenerateConditions -> False, Integrate gives a regularized result (a result with a "singular part" removed).他的回复正是我说的自动消除发散项。我正在进一步询问他是如何知道。谢谢你的回复!
2015年02月04日 18点02分
回复
����¡һ
:此人回复止于“doubt”,我在想是否有追问的必要。
2015年02月05日 02点02分
回复
����¡һ
:知道了记得告诉我啊[呵呵]
2015年02月05日 07点02分
@flumer 你可以看看吧主回复的网页。
2015年02月06日 16点02分
吧务
level 15
我的感觉是,这似乎是一个本该写入“可能存在的问题”的东西。简单地说就是GenerateConditions -> False 时可能会因为某些原因(某种检验不足?)导致给出错误的结果。关于这个可以参考这里:
http://mathematica.stackexchange.com/q/46453/1871
http://mathematica.stackexchange.com/q/13275/1871
2015年02月06日 13点02分 5
感谢吧主回复。看了网页,我的问题已经得到解决。@flumer 也可以看看这两个网页。
2015年02月06日 16点02分
吧务
level 12
我居然漏看了这个问题。。。就说楼猪最后的想法 显然是不现实的 否则Wolfram不会这么傻把积分的线性性这个条件去掉
2015年02月07日 01点02分 6
你“否则”后面的表述我不是太理解。我会把我各处收集到的精华回复汇总在下面。然后你可以再评判一下。
2015年02月07日 10点02分
level 3
龙泽隆一 楼主
我也许找到了这个选项的运作方法了。
请尝试下面的两个积分。复制了直接运行即可。
FullSimplify[Series[Integrate[x^1 BesselK[2, x] BesselK[2, x], {x, a, Infinity},Assumptions -> a > 0 && Element[a, Reals]], {a, 0, 1}], Element[a, Reals] && a > 0]
Integrate[x^1 BesselK[2, x] BesselK[2, x], {x, 0, Infinity}, GenerateConditions -> False]
首先说明的是,这个积分只有在零点处是发散的。
第一个积分,先把积分下限改为a;完成积分后,按a在零点进行级数展开;最后令a等于零,并去掉那些显然发散的项或显然为零的项,即只保留常数项。
你会发现第二个积分的结果就是上面那个常数项。
再补充一个简单的例子,对1/x^2在0到无穷大积分,去除显然发散或为零的项,结果为零。
FullSimplify[ Series[Integrate[1/x^2, {x, a, Infinity}, Assumptions -> a > 0 && Element[a, Reals]], {a, 0, 1}], Element[a, Reals] && a > 0]
Integrate[1/x^2, {x, 0, Infinity}, GenerateConditions -> False]
2015年02月08日 12点02分 8
1