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比较的是符号关系,而非实际数值大小,导致判断错误。
解决方法
- 强制数值求值后比较:修改帐篷映射的定义,先将输入转为浮点数值再判断分支:
TMm2(x):=2*if float(x) > 1/2 then 1-x else x
这样每次判断时都会先计算x的浮点近似值,再进行大小比较,符合帐篷映射的数值逻辑。
- 分离数值判断与符号运算:如果需要同时保留符号记录和正确的分支判断,可以在迭代时先计算
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!") )
- 结合
is()函数判断:如果需要保留符号运算的精确性,可使用is()函数强制Maxima判断关系真假,但对于包含无理数的表达式,仍需结合float()确保判断有效:
TMm2(x):=2*if is(float(x) > 1/2) then 1-x else x
内容的提问来源于stack exchange,提问作者Der Schorsch
相关产品推荐
相关产品推荐

