公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
737 浏览

我本想让积分-黎曼求和保持三位精度,运行后确实是3位,可是一拖动滑块立马就失效了

我用的这句代码控制精度的

N[((v0 t0 - v0^2/(2 aa)) - 
   Total[Area /@ 
     Cases[rectangles, Rectangle[{_, _}, {_, _?(# > 1 &)}], Infinity]
    ]), 3]

看了半天SE帮助还是束手无策,请大家看看

Manipulate[
 rectangles = 
  Select[Table[{Opacity[0.05], EdgeForm[Gray], 
     Rectangle[{i (t0 - v0/aa)/n, 0}, {(i + 1) (t0 - v0/aa)/n, 
       heightfunction[i]}]}, {i, 0, n - 1, 1}], #[[3, 2, 2]] > 1 &];
 Show[{Plot[
    Which[0 <= x <= t0, v0, x > t0, v0 + aa (x - t0)], {x, 0, s}, 
    PlotStyle -> Thick, AxesOrigin -> {0, 0}, 
    PlotRange -> {0, v0 + 5}, 
    PlotLabel -> Style["黎曼积分求和演示", 18, Blue], 
    AxesLabel -> {Style["s", 16, Red], Style["m/s", 16, Red]}], 
   Graphics[{rectangles, 
     Text[Style[
       "显示的矩形面积之和为" <> 
        ToString[
         Total[Area /@ 
            Cases[rectangles, Rectangle[{_, _}, {_, _?(# > 1 &)}], 
             Infinity]
           ] // N], 14], {0.7 s, 0.9 ( v0 + 5)}], 
     Text[Style["积分得到的函数面积为" <> ToString[v0 t0 - v0^2/(2 aa) // N], 
       14], {0.7 s, 0.85 ( v0 + 5)}], 
     Text[Style[
       "积分-黎曼求和为" <> 
        ToString[
         N[((v0 t0 - v0^2/(2 aa)) - 
            Total[Area /@ 
              Cases[rectangles, Rectangle[{_, _}, {_, _?(# > 1 &)}], 
               Infinity]
             ]), 3]], 14], {0.7 s, 0.8 ( v0 + 5)}]}]}, 
  ImageSize -> Large], {{s, 6}, 1, 20}, {{n, 15}, 1, 80, 1}, {{t0, 1},
   0, 2, 0.1}, {{v0, 25}, 0, 50, 1}, {{aa, -2}, -10, -1, 
  0.1}, {{heightfunction, (Mean[{f[# (t0 - v0/aa)/n], 
       f[(# + 1) (t0 - v0/aa)/n]}] &)}, {(f[# (t0 - v0/aa)/n] &) -> 
    "left", (Mean[{f[# (t0 - v0/aa)/n], 
        f[(# + 1) (t0 - v0/aa)/n]}] &) -> 
    "midpoint", (f[
       RandomVariate[
        UniformDistribution[{# (t0 - v0/aa)/n, (# + 1) (t0 - v0/aa)/
            n}]]] &) -> 
    "Uniform random", (f[(# + 1) (t0 - v0/aa)/n] &) -> "right"}, 
  ControlType -> SetterBar}, 
 Initialization :> {f[x_] := 
    Which[0 <= x <= t0, v0, x > t0, v0 + aa (x - t0)]}
 ]

分类:函数 | 用户: mma-2-2-2 (1.3k 分)
修改于 用户:mma-2-2-2

1个回答

+3 投票
 
已采纳

这个问题和Manipulate无关。是因为N对于MachinePrecision的数字不起作用,只能用于ArbitraryPrecision的数字。你看这个运行结果:

N[RandomReal[], 2]

就不是保留了两位有效数字。

现在你可能想到把Manipulate里面的数字都改成分数,然而也是没用的,观察这个运行结果:

Manipulate[Precision@x, {x, 0, 10}]

说明那个拖动的条产生的数字就是MachinePrecision。

这个时候你要是想要固定精度的话,就用SetPrecision[expr, 3],想round到小数点后几位就用Round[expr, 0.001],看你题目需求把那个N改成SetPrecision就行了

用户: happyfish (1.8k 分)
采纳于 用户:mma-2-2-2
好的 学习了 谢谢happyfish
...