后勤地图的庞加莱返回地图f_c(x)= cx(1-x)

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

rco*_*yer 6

你遇到的问题是你实际上没有从中返回任何东西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.