Проблема в том, что вы ничего не возвращаете с Module
. Чтобы исправить ваш код, как написано, я бы использовал
R[f_[x___], a_, b_, n_, x0_] :=
Module[{i, y = x0},
Catch[
For[i = 0, i <= n, i++, Print["i= ", i];
If[
a < f[{x}[[1]], y] < b,
y= f[{x}[[1]], y]; Throw[y],
y = f[{x}[[1]], y]
](*If*)
](*For*)
];(*Catch*)
y (* returns y *)
](*Module*)
Однако это можно переписать более кратко, как
g[c_][x_] := c x(1 - x)
(* I used Q to differentiate it from R, above. *)
Q[f_, a_, b_, n_, x0_] :=
Module[{i},
(* -- FIXED THIS, See below. -- *)
NestWhile[f, f[x0], Not[a < # < b]&, 1, n]
](*Module*)
Обратите внимание, я изменил метод вызова f
с f[c,x]
на g[c][x]
. Основным преимуществом является возможность передачи g[c]
в Q
вместо f[c,t]
, где t
- фиктивная переменная. Тогда он вызывается как
Q[g[3.5], 0.4, 0.7, 100, 0.2]
, который работает так же, как R
.
Редактировать : Я смотрел на расширение вышеприведенного кода и заметил недостаток. У меня было условие a < f[#] < b&
, которое говорит, что цикл будет продолжаться только в том случае, если значение значения следующей итерации находится в границах. Вместо этого мы хотим продолжить, только если текущая итерация выходит за пределы диапазона, поэтому я изменил ее на Not[ a < # < b ]&
.
Что касается изменений, которые я рассматривал, то иногда с таким расчетом приятно иметь возможность просматривать полный список итераций. Для этого нам нужно внести несколько небольших изменений в приведенный выше код.
Clear[Q]
Options[Q] = {FullList -> False};
Q[f_, a_, b_, n_, x0_, opts : OptionsPattern[]] :=
Module[{i, nst},
nst = If[OptionValue[FullList],
NestWhileList, NestWhile];
nst[f, f[x0], Not[a < # < b] &, 1, n]
](*Module*)
, который вводит Option
FullList
, который при значении True
, Q
будет использовать NestWhileList
вместо NestWhile
.