Question:

例、设某函数为一分段常值函数,试根据其特点,构造适当的算法,在指定精度要求下,搜索其间断点。不妨取


精度要求分别取0.1、0.01、0.001、0.0001、0.00000001,在区间[-1,4]内搜索函数的间断点。

Answer analysis

hh[x_] := Which[x <= 0, -1, (x > 0) && (x <= 1), 0, (x > 1) && (x <= 1.0001), 1, (x > 1.0001) && (x <= 1.002), 2, x > 1.002, 3];
Plot[hh[x], {x, -1, 4}, PlotStyle -> Hue[0.1]]

slu = {};   (*设置答案集合*)
HH[AA_, BB_, jd_] := (If[hh[AA] != hh[BB],If[Abs[AA - BB] < jd, slu = slu \[Union] {(AA + BB)/2},slu = slu \[Union] HH[AA, (AA + BB)/2, jd] \[Union] HH[(AA + BB)/2, BB, jd]]];     (*采用递归算法不断嵌套*)
   Return[N[slu]]
   );
HH[-1, 4, 10^(-3)]
slu = {};   (*清空答案集合,否则会出现之前的答案*)
HH[-1, 4, 0.000001]

Output:

{0.0000610352, 0.999817, 1.00226}
{-5.96046*10^-8, 1., 1.0001, 1.002}
/[Union]表明取并集

主要偏重于Mathematica语法讲解

Which[test1,value1,test2,value2...]
依次计算每个 test_i ,返回相应于产生 True 的第一个value_i=的值

If[condition,t,f]
如果 condition 计算为 True 则给出 t,若计算为 False 则给出 f

(*Some Text*)
Mathematica注释

hh[x_]=;
设置单自变量函数,自变量为x

HH[AA_, BB_, jd_]:=();
设置多自变量函数,本题中AA为下限,BB为上线,jd为要求精度

本题中关键算法语句即为H[AA_, BB_, jd_]的定义逻辑。
如果上下值的取值不同且相差在精度范围之内,则直接添加答案到slu集合;如果不在精度范围之内则改变上下限再次进行HH函数运算并将符合if条件的答案添加至slu中,最后返回集合。调用此函数调整精度进行计算。

(烦请大佬将HH函数的上下限改变原理讲得更精确一些,我可做更新)

Comments


做一只有梦想的咸鱼