【发布时间】:2011-11-09 18:58:36
【问题描述】:
我试图让 Mathematica 逼近一个积分,它是各种参数的函数。我不需要它非常精确 - 答案将是一个分数,5 位数会很好,但我会满足于少至 2。
问题是主积分中隐藏了一个符号积分,我不能在它上面使用 NIntegrate 因为它是符号的。
F[x_, c_] := (1 - (1 - x)^c)^c;
a[n_, c_, x_] := F[a[n - 1, c, x], c];
a[0, c_, x_] = x;
MyIntegral[n_,c_] :=
NIntegrate[Integrate[(D[a[n,c,y],y]*y)/(1-a[n,c,x]),{y,x,1}],{x,0,1}]
当n 大于 2 且 c 大于 3 左右时,Mathematica 开始挂起(通常因为 n 和 c 都高一点)。
是否有任何技巧可以重写此表达式以便更容易地对其进行评估?我在外部NIntegrate 上使用了不同的WorkingPrecision 和AccuracyGoal 和PrecisionGoal 选项,但是这些都没有帮助内部积分,这就是问题所在。事实上,对于n 和c 的较高值,我什至无法让 Mathematica 展开内导数,即
Expand[D[a[4,6,y],y]]
挂起。
我正在使用 Mathematica 8 for Students。
如果有人对我如何让 M. 近似此有任何提示,我将不胜感激。
【问题讨论】:
-
对于投票结束的个人,这是一个关于 Mathematica 编程语言和环境的有效问题。因此,它不是 stackoverflow 的主题。
-
如果单独进行内积分,会不会有时序问题?另外,
n和c应该是整数吗?如果是这样,请考虑将a的定义更改为a[n_Integer, c_Integer, x_],因为它会阻止无限递归。 -
@rcollyer:如果您的计时问题是指积分需要很长时间或有效挂起,那么可以。事实上,现在想想,我可能会把内积分放在这个问题上。或者你问的时间有什么更具体的吗? (我非常缺乏经验......谢谢你的耐心。)我正在尝试整数的东西..似乎没有解决问题,但仍在试验(这是一个很好的提示)。
-
我没想到“整数的东西”能解决这个问题,只是让代码更可靠一点。至于
NIntegrate挂起,我认为这里可能有两个问题:1.内部积分需要很长时间来评估(你现在已经说过),2.NIntegrate可能正在重新评估内部x 的每个值的积分。怀疑是问题(2),我想知道首先象征性地评估内部是否会有所帮助。但是,我想不会。回到绘图板。 -
Memoization 对计时有一点帮助,但对于大型
n和c需要很长时间,我并不感到惊讶。里面有很多嵌套的((((()^c)^c)^c...)^c)...