Can*_*tor 3 wolfram-mathematica
假设:
f[c_,x_]:= c x (1-x)
Run Code Online (Sandbox Code Playgroud)
修复[0,1]中的间隔(a,b).庞加莱返回(到区间(a,b))f的图是一个函数
[R [C,X] = F ^ K [C,X],
其中k是第一个迭代,这样a<f^k[c,x]<b(这里f^k[c,x]表示与自身的k时间组成f,即f[c,f[c,...f[c,x]...]])
所以,我想写一个函数(或模块)
R[f_,a_,b_,n_,x_]
Run Code Online (Sandbox Code Playgroud)
它考虑f的前n次迭代并返回第一次迭代的值f[c,x]落入区间[a,b].
这是我尝试的:
R[f_[x___ ], a_,b_, n_, x0_] :=
Module[{i, y=x0},
Catch[
For[i = 0, i <= n, i++,
If[a < f[{x}[[1]], y] < b,
Throw[f[{x}[[1]], y]], y = f[{x}[[1]], y]
]
]
]
]
Run Code Online (Sandbox Code Playgroud)
代码不起作用,因为f[{x}[[1]], y]写入的位置f被理解为乘以数字{x}[[1]]而不是上面定义的逻辑函数.
请注意,我正在寻找一段简单的代码,如果可能的话,请不要在答案中更改函数R的输入数量.
编辑:我想打电话给R如下.
R[f[3.5, t], 0.4, 0.7, 100, 0.2]
Run Code Online (Sandbox Code Playgroud)
这应该返回应用函数时x0=0.2第一次落入区间的迭代值 .只是我们在放弃之前尝试的最大迭代次数.(0.4,0.7)f[3.5,x]=3.5x(1-x)n
你遇到的问题是你实际上没有从中返回任何东西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*)
Run Code Online (Sandbox Code Playgroud)
但是,这可以更简洁地重写
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*)
Run Code Online (Sandbox Code Playgroud)
请注意,我改变的调用方法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]
Run Code Online (Sandbox Code Playgroud)
它的工作方式就像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*)
Run Code Online (Sandbox Code Playgroud)
其中介绍了Option FullList,当设置为时True,Q将使用NestWhileList而不是NestWhile.