You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CAS Maxima中函数定义的关系运算符问题:帐篷映射迭代异常

帐篷映射迭代中的CAS Maxima判断异常问题

定义与初始设置

我在CAS Maxima中定义帐篷映射如下:

TMm2(x):=2*if x>1/2 then 1-x else x

初始值设置为:

TM:1/%pi

迭代循环代码

随后执行以下迭代循环:

for i:0 thru 60 do 
  (
    TMC1oPI:coeff(TM,1/%pi,1), TMCconst:coeff(TM,1/%pi,0),
    TMstr:sconcat(i,";",TMC1oPI,";",TMCconst),
    print(TMstr),
    TM:(expand(TMm2(TM))), 
    if TM = 0 then return("Iterating the Tent Map ended at its fixed point zero!")
  )

异常迭代输出

迭代输出从第56行开始出现异常:

55;-36028797018963968;11468322278445318
56;-72057594037927936;22936644556890636
57;-144115188075855872;45873289113781272
58;-288230376151711744;91746578227562544
59;-576460752303423488;183493156455125088
60;-1152921504606846976;366986312910250176

问题点

第55次迭代的结果为-36028797018963968/%pi+11468322278445318,数值约为0.71,本应触发x>1/2的分支,但关系运算符判断为false,导致第56次迭代结果为-72057594037927936/%pi+22936644556890636,数值约为1.42,明显错误。


原因与解决方法

核心原因

Maxima默认对符号表达式的比较会保留符号逻辑,不会自动求值为数值判断。你的TM始终是符号形式(a/%pi + b),直接用x>1/2比较的是符号关系,而非实际数值大小,导致判断错误。

解决方法

  1. 强制数值求值后比较:修改帐篷映射的定义,先将输入转为浮点数值再判断分支:
TMm2(x):=2*if float(x) > 1/2 then 1-x else x

这样每次判断时都会先计算x的浮点近似值,再进行大小比较,符合帐篷映射的数值逻辑。

  1. 分离数值判断与符号运算:如果需要同时保留符号记录和正确的分支判断,可以在迭代时先计算TM的数值版本来决定分支,再对符号表达式应用对应的变换:
for i:0 thru 60 do 
  (
    TMC1oPI:coeff(TM,1/%pi,1), TMCconst:coeff(TM,1/%pi,0),
    TMstr:sconcat(i,";",TMC1oPI,";",TMCconst),
    print(TMstr),
    if float(TM) > 1/2 then
      TM:expand(2*(1-TM))
    else
      TM:expand(2*TM),
    if TM = 0 then return("Iterating the Tent Map ended at its fixed point zero!")
  )
  1. 结合is()函数判断:如果需要保留符号运算的精确性,可使用is()函数强制Maxima判断关系真假,但对于包含无理数的表达式,仍需结合float()确保判断有效:
TMm2(x):=2*if is(float(x) > 1/2) then 1-x else x

内容的提问来源于stack exchange,提问作者Der Schorsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:45:30