winner245 发表于 2013-11-2 03:11:34

Maple能解高震荡函数积分吗?

本帖最后由 winner245 于 2013-11-2 03:14 编辑

请问Maple能解下面这个高震荡函数积分吗?

evalf(Int(cos(log(x)/x)/x, x = 0..1));我试了 int、Int、evalf/Int 都没求出来。另外,Matlab数值积分函数束手无策

TBE_Legend 发表于 2013-11-6 14:59:18

mma 直接给出答案。

你为什么matlab问了,这里又要问呢?是两个结合着用吗?

winner245 发表于 2013-11-7 04:44:47

TBE_Legend 发表于 2013-11-6 14:59
mma 直接给出答案。

你为什么matlab问了,这里又要问呢?是两个结合着用吗?

mathematica 我知道可以求解,我想看看 maple 是否可以求解。我自己试过了,找不到 maple 求解的办法,所以,就发到专门的 maple 版块了。Matlab 的求解方法,我还在尝试中。如果有违版规,还请版主见谅

feiyuzhen 发表于 2013-11-30 13:20:54

本帖最后由 feiyuzhen 于 2013-11-30 13:23 编辑

画了个图,大概十分钟

winner245 发表于 2013-12-1 04:32:27

feiyuzhen 发表于 2013-11-30 13:20
画了个图,大概十分钟

看来Maple并没有用专门的方法计算震荡积分,还是使用经典的积分办法,所以时间会这么久,越接近0点,震荡性越大,所需点越多,maple计算时长就越长

windflag 发表于 2014-1-9 02:43:32

本帖最后由 windflag 于 2014-1-9 03:16 编辑

对于这种高度震荡的函数,建议用软件处理前,还是先做必要的数学处理。用maple和mathematica曾经做过类似情况的问题,但涉及很少,经验有限,貌似好像mathematica的能力强些(不一定,可能跟函数默认的参数设置有关)。但是,不做相应的处理直接调用这两个软件的函数进行积分,所得到的的结果是否正确个人还不能确定(软件的结果有可能不对,这个并非是软件自身问题,因为软件的函数积分时,对所处理的函数会有一些默认的参数设置,例如取样点的密度以及精度判断等,数值积分中会出现“假收敛”现象即是一例)。但个人对此问题并无研究,故只是怀疑罢了。

推荐一本书,《数值积分方法》(Philip J.Davis, Philip Rabinowitz 著;冯振兴,伍富良译),里面有相关情况处理。

winner245 发表于 2014-1-12 01:43:36

windflag 发表于 2014-1-9 02:43
对于这种高度震荡的函数,建议用软件处理前,还是先做必要的数学处理。用maple和mathematica曾经做过类似情 ...
你好,非常感谢你的建议与参与!对于以上这个高震荡积分,maple确实没法精确计算。mathematica我试过了,直接用NIntegrate函数可以精确计算。数值积分这一块,mathematica要强一些,它使用了专门针对高震荡积分的原理。

这本数值积分的书我有英文版,里面其实主要是涉及了经典的积分算法,对于高震荡积分算法描述很少。后来,我读了一些专门针对高震荡积分的数学论文,采用 Levin 算法解决了这个积分,代码我在这里给出了:http://forum.simwe.com/thread-1090647-1-1.html

feiyuzhen 发表于 2014-6-22 21:20:01

本帖最后由 feiyuzhen 于 2014-6-22 21:24 编辑

winner245 发表于 2014-1-12 01:43
你好,非常感谢你的建议与参与!对于以上这个高震荡积分,maple确实没法精确计算。mathematica我试过了, ...
基于Maple的国外高手解答方案(见第一题)
补充一下,我用的是maple12,下述命令可以算
evalf(Int(cos(log(x)/x)/x, x = 0.1e-2 .. 1, method = _d01akc))
如果你的版本较高,可以添加maxintervals选项同时减小积分下限来进行更高精度的计算

winner245 发表于 2014-6-22 22:55:26

feiyuzhen 发表于 2014-6-22 21:20
基于Maple的国外高手解答方案(见第一题)
补充一下,我用的是maple12,下述命令可以算



通过设置一个 “比较小” 的积分下限,确实是可以计算的,但是这只是近似计算,因为无论你给多么小的积分下限,你都不知道这个下限是否足够小。因为被积函数在 0 点高度震荡,这种近似误差可能会很大。总之,在真实结果没有得到之前,任何通过设置一个 “比较小” 的积分下限的方法,都是不可靠的

feiyuzhen 发表于 2014-6-23 13:12:18

如果只是尝试一次计算,那所得到的结果可靠性确实很差,
我想是通过一系列的积分下限值来进行计算,根据所得结果来判断是不是收敛,
本例中上面的命令得到的数字可以继续往下进行,直到满足需要的精度为止,
d01akc是nag提供给maple的求解震荡积分的算法,这个是maple里面最适合这类问题的命令,
我用的maple版本较老,无法添加maxintervals选项,你可以在高版本的maple里试试这种方法,
如果可以的话,欢迎贴出结果。

winner245 发表于 2014-6-23 22:19:44

本帖最后由 winner245 于 2014-6-23 22:22 编辑

feiyuzhen 发表于 2014-6-23 13:12
如果只是尝试一次计算,那所得到的结果可靠性确实很差,
我想是通过一系列的积分下限值来进行计算,根据所 ...
多谢你的建议!我用 Maple 17 试了一下,Maple 17 里是通过修改 maxintervals 参数 (默认是500)来实现更高精度的计算。我分别设置了几组很大的 maxintervals参数,同时积分下限也相应的减小了。截图所示:



当我将下限设置为1e-6,maxintervals设置为300000000时,提示:Memory allocation failed. 这应该算是达到Maple的计算极限了吧

feiyuzhen 发表于 2014-6-24 12:48:40

恩,应该是maple的极限了,
如果精度不足,只能换方法了

winner245 发表于 2014-6-24 21:30:14

feiyuzhen 发表于 2014-6-24 12:48
恩,应该是maple的极限了,
如果精度不足,只能换方法了

另外,请教一下版主:
为什么我将 maxintervals = 5000 改成 maxintervals = 5e3 就报错:Error, (in evalf/int) invalid optional argument maxintervals = 0.5e4
可我前面的 x = 1e-4 .. 1 的 1e-4 的写法就没问题


feiyuzhen 发表于 2014-6-24 21:59:07

我猜测是参数传递的时候指定了数据类型,
如果你有其他版本的maple,可以试一试看看什么情况,
手头是低版本的,没法验证

winner245 发表于 2014-6-24 22:21:08

feiyuzhen 发表于 2014-6-24 21:59
我猜测是参数传递的时候指定了数据类型,
如果你有其他版本的maple,可以试一试看看什么情况,
手头是低版 ...
没有其他版本了。。。
这似乎是Maple做得不太好的地方,Maple本身是接受这类科学计数法的,而且单独的表达式里写 5e3 和 5000 是等效的,到了这里就不行。即便maple规定了数据类型,也不至于到了这里就不允许用户使用科学计数法了吧,这显得很不方便,尤其是我需要很大的迭代参数时,我需要留意我后面到底输了几个0
页: [1]
查看完整版本: Maple能解高震荡函数积分吗?