求解:先积分后赋值,积分后化简结果不一样
mathematica吧
全部回复
仅看楼主
level 1
矢量△ 楼主
2020年07月18日 05点07分 1
level 1
矢量△ 楼主
代码如下
Clear["Global`*"]
gA[x] := Sqrt[h]*Exp[-h*Abs[x]]
s = 1/Sqrt[2]/h
2*Integrate[gA[x]^2, {x, s, Infinity}]
2*Integrate[gA[x]^2, {x, s, Infinity}] /. h -> Range[1, 5]
2*Simplify[Integrate[gA[x]^2, {x, s, Infinity}], h > 0]
2020年07月18日 05点07分 2
level 1
矢量△ 楼主
最后一个积分结果是
正确的
(积分结果与参数h无关了)
前一个积分为啥我赋了几个值反而错误了?
2020年07月18日 05点07分 3
level 7
然而分开算又是对的,建议去排查每一次迭代里h和s的值。感觉是在list计算里被之前的结果干扰了。这一串代码应该是没问题的:
gA[x_, h_] := Sqrt[h]*Exp[-h*Abs[x]]
2*Integrate[gA[x,
#]^2, {x, 1/Sqrt[2]/#
, Infinity}] & /@ Range[1, 5]
能保证s和h每次都是一致的。
2020年07月18日 08点07分 4
多谢老哥解答。
2020年07月18日 11点07分
我用你这个双变量函数,写的代码还是存在这个问题,可能是没太理解这个赋值的顺序,按你写的换#号就对了。2*Integrate[gA[x, z]^2, {x, 1/Sqrt[2]/z, Infinity}] /. z -> Range[1, 5]
2020年07月18日 11点07分
大概明白了,我这样赋值可以分别赋到积分号里头去,但对积分区间的赋值,程序只选取了第一个Range的值之后就没改动过了。也是醉了。
2020年07月18日 11点07分
level 7
问题大概出在你给一个表达式中的变量赋值为一个列表,想要计算这个变量分别取列表里每个值对应的结果,但是这就涉及到Listable属性,一般的初等函数是没有问题的,但这里具体到积分上下限就会出问题,楼上提到的Map是一种方法,另一种仍然从替换的角度出发的写法是:
2*Integrate[gA[x]^2, {x, s, Infinity}]/. Evaluate[List /@ Thread[h -> Range[1, 5]]]
(非常难看的写法,但是可以保证替换是按你的想法进行的,看看后面有没有人能改进一下)不明白的话把 /. 后面的拿出来运行一下应该就懂了。
2020年07月18日 15点07分 5
非要用替换的话感觉也还要用上map,thread之类的用法。这里有个尝试: Outer[ReplaceAll[h -> #][2*Integrate[gA[x]^2, {x, s, Infinity}]] &, Range[1, 5]]
2020年07月18日 16点07分
吧务
level 15
版本9的输出是:
说到底Integrate这函数并没有Listable属性,会产生奇怪的输出并不十分奇怪……
2020年08月01日 03点08分 6
1