近段时间我逐步增加了使用版本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[…] 的微分方程求解方法的报废。
暂时就想起来这些……大部分都是关于微分方程的,毕竟我比较关心这个嘛。大家也说说自己的发现吧。
先说我发现的几个好的改变:
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[…] 的微分方程求解方法的报废。
暂时就想起来这些……大部分都是关于微分方程的,毕竟我比较关心这个嘛。大家也说说自己的发现吧。
