Чтобы систематизировать комментарии, я бы попробовал следующее. Во-первых, чтобы исключить бесконечную рекурсию в отношении переменной n
, я бы переписал ваши функции как
F[x_, c_] := (1 - (1-x)^c)^c;
(* see note below *)
a[n_Integer?Positive, c_, x_] := F[a[n - 1, c, x], c];
a[0, c_, x_] = x;
таким образом n==0
будет фактически точкой остановки. Форма ?Positive
является PatternTest и полезна для применения дополнительных условий к параметрам. Я подозреваю, что проблема в том, что NIntegrate
переоценивает внутреннюю Integrate
для каждого значения x
, поэтому я бы извлек эту оценку, как
MyIntegral[n_,c_] :=
With[{ int = Integrate[(D[a[n,c,y],y]*y)/(1-a[n,c,x]),{y,x,1}] },
NIntegrate[int,{x,0,1}]
]
где With
- одна из нескольких областей видимости, специально предназначенных для создания локальных констант.
Ваши комментарии указывают на то, что внутренний интеграл занимает много времени, пытались ли вы упростить подынтегральное выражение, поскольку оно является производной от a
от функции a
? Мне кажется, это результат расширения правила цепочки.
Примечание : согласно предложению Йоды в комментариях, вы можете добавить механизм кэширования или запоминания к a
. Измените его определение на
d:a[n_Integer?Positive, c_, x_] := d = F[a[n - 1, c, x], c];
Хитрость в том, что в d:a[ ... ]
, d
является именованным шаблоном, который снова используется в d = F[...]
для кэширования значения a
для этих конкретных значений параметров.