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

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

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

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

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

社区建议QQ群:365716997

分类

+1 投票
3.0k 浏览

最近在做一个黎曼积分演示动画,在选中插值选项Uniform random后,矩形的插值位置一直在变动导致矩形面积也一直在变化,求高手处理一下

Manipulate[f[x_] := Which[0 <= x <= t0, v0, x > t0, v0 + aa (x - t0)];
 rectangles = 
  Select[Table[{Opacity[0.05], EdgeForm[Gray], 
     Rectangle[{i (s)/n, 0}, {(i + 1) (s)/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.75 s, 0.9 ( 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, -1}, -10, 0, 
  0.1}, {{heightfunction, (Mean[{f[# s/n], 
       f[(# + 1) s/n]}] &)}, {(f[# (s)/n] &) -> 
    "left", (Mean[{f[# (s)/n], f[(# + 1) s/n]}] &) -> 
    "midpoint", (f[
       RandomVariate[UniformDistribution[{# s/n, (# + 1) s/n}]]] &) ->
     "Uniform random", (f[(# + 1) s/n] &) -> "right"}, 
  ControlType -> SetterBar}]

分类:函数 | 用户: mma-2-2-2 (1.3k 分)
把f[x_]的定义放在Initialization里面
什么意思 能否详细说明一下,或者在我的问题里直接修改
最后加上Initialization :> {f[x_] := Which[0 <= x <= t0, v0, x > t0, v0 + aa (x - t0)]},把第一行定义去掉
好的 话说管理员怎么把采纳答案功能取消了 想采纳为最佳答案的
这个只是评论..因为改完之后还是会变动所以感觉不是很好
谢谢 十分有效,能简单说一下这样做的原因吗?
好的 总之这个问题解决的很好 谢谢happyfish
这个我说不太清楚,别再弄错了,希望xzczd和苹果这样的大神能来讲解一下
然而还是没有解决改完之后也会变动一下的原因。。

2 个回答

+1 投票
 
已采纳
 Manipulate[expr,{u,min,max}]

是这样的,当Manipulate的主体expr里有函数定义式(f[x_] :=......)的时候,Manipulate会不停地刷新计算expr。我这儿只说现象了。

不论再简单的Manipulate代码,只要里面有函数定义式,CPU占用率都会奇高,而且此状态是持续保持的,因为它在高频率地刷上面说的那项。我这里CPU占用率为50%。有兴趣的话可以用下面的代码测试一下:

 Manipulate[g[x_]:=0,{t,0,1}]

而你程序里选中某一项时图形和面积一直在变化,就是因为Manipulate在刷新函数定义时遇到了RandomVariate,这个函数每刷一次就有新的取值,所以导致你的expr每次刷新结果都不一样,即图形和面积值每次刷新都不同。当然它刷的频率相当高了,所以才看到图形和面积数值这些东西一直在抖动。

用下面这个代码看看就一目了然了:

 Manipulate[g[x_]:=RandomReal[];g[t],{t,0,1}]

所以,综上所述,通常情况下,函数定义要么写在Initialization里面,要么写在Manipulate外面,否则Manipulate会非常低效。

 

用户: wonderlands0 (451 分)
修改于 用户:wonderlands0
另外我也有个问题:谁能麻烦写段代码测试一下Manipulate在上述情况下对expr的刷新频率?(比如上面 Manipulate[g[x_]:=RandomReal[];g[t],{t,0,1}] 中的刷新频率。)我对怎么写它一点概念都没有。
我第一次知道!!
+3 投票

这种情况需要调TrackedSymbols选项:

Manipulate[g[x_] := 0, {t, 0, 1}, TrackedSymbols -> True]

更多内容可参看自带帮助。SE上也有很多答案可以参考,顺便这个问题当年我也问过:http://mathematica.stackexchange.com/q/10753/1871

用户: xzczd (2.2k 分)
嗯,TrackedSymbols,没想起这个来。
谢谢xzczd 我认真看看SE的答案
...