【交流】Mathematica版本10以来的某些悄悄改变
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
近段时间我逐步增加了使用版本11.3和版本12的时间,结果发现,Mathematica近几版以来的某些改变(有的好有的坏)其实并没有写在文档里,故开此帖与大家交流。
先说我发现的几个好的改变:
1. 并行能力比过去强了。比如NDSolve在解偏微分方程时,如果调用的是TensorProductGrid方法,多核机器的CPU会跑满。(版本9时代其实也不是完全没并行,但不会像现在这么高效。)NonlinearModelFit也出现了CPU跑满的情况,不过我在版本9时代对NonlinearModelFit的使用有限,所以不太确定那时候的并行情况如何。
2. NDSolve可以只存储时间终点处的数据了。比如:
NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 30, 30}]
通过观察内存变化可以发现,在版本9时代,NDSolve会先将0至30的数据全部记录下来,在最后生成插值函数时再抛弃多余数据,而至少自11.3起,NDSolve转而采用了实时抛弃“无用”数据的策略——这个特性在求解某些大型方程(组)时很有用。
再说几个“坏”的改变:
3. Plot系函数生成的图形的语法在版本12又悄悄地改了一次,这直接导致某些靠“精确定位”Graphics内部元素来实现图形修改的代码在版本12出现了不兼容。目前来看,用模式匹配实现图形修改的代码受的影响会小些——但愿后续版本不会出现当年版本5->6那般的大改动吧。
4. NDSolve`StateData[…]变成了原子表达式,并且Mathematica没有为之配备相应的修改方法。这导致某些依赖于修改 NDSolve`StateData[…] 的微分方程求解方法的报废。
暂时就想起来这些……大部分都是关于微分方程的,毕竟我比较关心这个嘛。大家也说说自己的发现吧。
2019年09月07日 12点09分 1
吧务
level 15
xzcyr 楼主
忘了一个:
5. Join在版本10的时候悄悄地改了一次。被改的部分用的人不多,但它在某些极端情况下会导致非常〇疼的麻烦。具体参看Stackexchange帖子《Silent change (bug?) of Join after v9》。顺便说一句,Total等函数在版本12又有小改动,这个改动是文档里明确解释了的,但多少有些搞笑的是,这个改动和Join在版本10的改动在方向上其实是相反的:Join是放宽了使用限制,而Total则是收紧了……也许WRI觉得“限制”的平衡点是在中间的某处吧……
2019年09月07日 14点09分 2
吧务
level 9
感觉Windows版的前端从10.0开始变卡了,Linux版前端还算流畅。
导出gif的速度快了很多,AnimationRepetitions默认改为1了,以前是Infinity。导出gif时最好用Image列表而不是Graphics进行比较,因为这又涉及到了Rasterize的速度。
frames=Flatten@ParallelTable[Rasterize[Plot[Sin[a x+b],{x,0,6}],"Image"],{a,1,4},{b,0,10}];//AbsoluteTiming
Export["test.gif",frames]//AbsoluteTiming
2019年09月09日 03点09分 3
Rasterize从11.1开始默认返回的是Image,以前是Graphics Raster
2019年09月09日 07点09分
GIF导入变快是说过的。刚查了下,new in 11.1里说了GIF有“speed, quality and scope enhancements”,此外new in 11.2和11.3里GIF都标了Updated,但具体更新了啥不知道……
2019年10月05日 06点10分
吧务
level 9
一些图形基元通过几何变换函数得到的结果更有价值了,返回的是经过变换后的图形基元,10.0之前的版本很多都是原样返回,用Normal能转换的也很有限
比如
Rectangle[]//TranslationTransform[{u,v}]//ScalingTransform[{s1,s2}]
2019年09月09日 03点09分 4
吧务
level 9
Solve和Reduce支持这样的写法,可以不用Thread了,不清楚具体是哪个版本开始的,至少9.0不行
Solve[1 <= {a, b, c} <= 3, {a, b, c}, Integers]
Minimize Maximize对含三角函数的式子支持更好了,比如9.0算不了这个
Maximize[Norm[{Cos[t1]+Cos[t2]+2 Sin[(t1-t2)/2] Cos[u],Sin[t1]+Sin[t2]+2 Sin[(t1-t2)/2] Sin[u]}],{u,t1,t2}]
2019年09月09日 06点09分 5
吧务
level 9
一些矢量化的操作变快了
With[{a = RandomReal[1, 10^8]},
First /@ {AbsoluteTiming[a + 1], AbsoluteTiming[a^2], AbsoluteTiming[0.5 - a]}]
某些情况下导入和导出文本,9.0之后反而比原来慢了很多
data = RandomReal[{-10, 10}, {1000, 1000}];
Export["test1.txt", data, "Table"] // AbsoluteTiming
ReadList["test1.txt", Table[Number, {1000}]]; // AbsoluteTiming
2019年09月09日 07点09分 6
Row[RandomReal[1, 5], "\t"] // ToString 这个版本9和12返回的也不一样
2019年09月09日 07点09分
吧务
level 15
xzcyr 楼主
补一句:
1.1 经实验,目前NDSolve求解常微分方程组时也会高效并行。(对方程组的规模是否有要求暂不明确,我测试时用的方程组规模较大。)
2019年10月05日 06点10分 7
补充,关于并行的问题基本搞清楚了。应该是源自12版本对代数运算的设置的改变。(也就是说这并不限于NDSolve)具体参看SE帖子《When does NDSolve parallelize ODE system solving?》(编号208784)
2019年12月07日 15点12分
吧务
level 15
xzcyr 楼主
6. NDSolve的微分代数方程(DAE)求解器在越变越强。近期的一个例子是stackexchange帖子《Testing Turbulence Models》(问题编号217201)的提问部分的Update 2中的代码。该代码在版本9时代会导致内核崩溃,但在版本12(甚至更早)已可以正确求解。
DAE求解器的增强也体现在了警告信息的变化上:警告ndsdtc在版本10之后的某个时间点被ntdv给取代了。(前一个警告提示用户可以使用常微分方程求解器,而后一个却只提了微分代数求解器。)关于这个可以参考Stackexchange的帖子《What's behind Method -> {“EquationSimplification” -> “Residual”}》(问题编号136114)。
2020年05月02日 07点05分 8
吧务
level 15
xzcyr 楼主
7. 刚又发现了一个,Mathematica 的“图片直接粘贴到Word”的功能更新了(或许我该说修复了),具体引入时间不确定,反正不晚于12.3。
具体解释一下:Mathematica的图片是可以直接复制进Word里的,但是这个功能在很长一段时间里并不十分好使,因为,样式会变。下图是版本8的图片及其贴入Word后的效果,可以明显看出不一样:
用过Mathematica早期版本的朋友大概会发现,右边这个样式其实是Mathematica版本5时代的样式——是的,Mathematica图形功能在版本6时代大改后,它与Word的接口在很长一段时间里没有“与时俱进”,具体理由不明……
但是,这个问题如今已经不存在了:
2021年09月04日 03点09分 9
吧务
level 15
xzcyr 楼主
8. 现在(我只测了12.3版本)Mathematica中的公式在被贴进Word时会被识别为
Word公式。(版本9时候只会被认成文本——当然,你也可以在粘贴选项里选择让它粘贴为“图片”。)性能似乎还不错,试了下,Grid和Column都能认,而且Grid里的对齐环境都能正确识别。
顺便,一个“便民”函数:
grid[m_, n_ : 1] := Grid[Table[\[Placeholder], m, n], Alignment -> "\[AlignmentMarker]"]
2022年03月05日 04点03分 10
补充:版本9时代如果在复制公式时选择 复制为 -> MathML 也可以实现相同效果。
2022年03月05日 04点03分
吧务
level 15
xzcyr 楼主
9. 前端的自动补全能力在越变越强。比如,如今在键入Import/Export的第一个参数时,输入 " 号后会自动弹出文件浏览器:
但话说回来,路径导入在早期版本其实做得就不赖,比如吧里精品帖《导入导出杂谈》(https://tieba.baidu.com/p/5966156986)里提过的基于Ctrl+C,Ctrl+V的复制,又比如顶部菜单 插入 -> 文件路径:
只是很多人都不知道。(当然,文档里对此的介绍不足是一方面的原因。)
此外,FontFamily选项也引入了自动补全机制(不过这个自动补全只会在选项位置正确时被激活):
当然了,在早期版本要自己做个面板也不难,具体参看精品区
《来来来,让我们做一个快速输入字体的面板》:
https://tieba.baidu.com/p/4966055510
2022年03月05日 11点03分 11
吧务
level 15
xzcyr 楼主
10. 多边形区域上的符号积分在越变越强。这里举两个例子。
a. Wolfram Community帖子《YouTube quizzes: Share your Wolfram Language solution!》(看看贴不贴得出来: community.wolfram.com/groups/-/m/t/1396914 )的第一个问题。在4年前的时候,Area函数(居然)没法直接算不规则四边形的面积,必须手动分割,而至少自12.3.1起,这个面积已经能直接算了。
b. Mma.se帖子《How do I solve a PDE with a strange boundary condition?》( mathematica.stackexchange.com/a/44085/1871 )涉及的一个三角区域符号积分,版本8、9时代Integrate的Boole语法解不了,现在用Integrate区域语法秒出。(顺便我由此发现我当年算出来的积分结果其实撞上了Integrate的bug,是错的囧。)
2022年07月02日 07点07分 12
吧务
level 15
xzcyr 楼主
11. Transpose对一维表的行为在
12.2版发生了改变:
这个改变好不好那就见仁见智了。
2022年07月02日 15点07分 13
吧务
level 15
xzcyr 楼主
*Plot系函数引入了一个奇怪的试探机制(具体引入时间不明,反正是版本9之后):
Plot[Sin[Echo@x], {x, 123/457, 7}, MaxRecursion -> 0, PlotPoints -> 2]
这一机制在极端情形下会导致严重的性能问题,参看下帖的 9 楼:
https://tieba.baidu.com/p/8000797343
2022年09月03日 12点09分 14
此试探机制的意义暂不明。
2022年09月03日 12点09分
本楼编号12.
2025年03月29日 04点03分
吧务
level 15
xzcyr 楼主
13. 不知道从哪一版开始(就是14.2?),Canvas终于变成了默认的绘图工具,现在在图(Graphics)上右键,显示的选项是“从画布转换/转换为画布”。
但是,14.2版的多段线绘制(Draw Multi-segment Line)功能疑似又出了bug,曲线(Curve)和移动(Move)按钮始终是灰的,这不就只能画多段直线了嘛:
测试环境是版本14.2,Win11。
2025年03月29日 04点03分 16
1 2 尾页