仿真结果共享在Mathematica中的实现
2016年03月13日 仿真 Mathematica 行 添加评论该文不包含实现过程,仅介绍Mathematica中的仿真结果共享的方案,作为这篇文章的一个辅助材料。
Mathematica在仿真数据上的处理方法是相当优雅的,这个解决方案是InterpolatingFunction
。这种函数的表现方式和正常的函数几乎相同,你可以对它求值、求导、求积分等等等等。可能不是对于所有问题,这个方案都能获得最好的结果,但是应该说对于大部分问题这个函数的表现还是比较不错的。Mathematica中有不少函数可以返回InterpolatingFunction
,诸如Interpolation
, FunctionInterpolation
, NDSolve
等等。这里举个NDSolve
的例子吧!
考虑单自由度弹簧质量系统的自由振动问题,其控制方程为:
\begin{equation}
m \ddot{x} + c\dot{x} + k x = 0
\end{equation}
假设初值条件为:
\begin{equation}
x(0)=1
\end{equation}
\begin{equation}
\dot{x} (0)=0
\end{equation}
假设上述问题的$m=1$, $k=100$, $c=0.1$, 那么求解这个方程的标准Mathematica代码应该是:
这样你就得到了一个InterpolatingFunction
disp[t]
,对于这个函数你可以求值,可以绘图,可以求导,可以积分,比如:
可以看到除了起始点边界处加速度稍有跳跃,其他位置都比较理想。
如果你到这还要问这和仿真结果有什么关系呢,那好吧,就看看仿真结果吧。
首先仿真出点数据:
然后插值,这里直接用默认插值方法了
可以看到,数据中的随机误差同样被表示出来了,所以这个函数是有能力表现出一些仿真中的细节变化的。下面展示一下对于这个函数的积分,可以预想对于高斯噪声的积分将会被抵消,所以积分曲线应该比原曲线光滑得多。
下面给一个跟我研究有关系的例子吧,假设我们仿真获得的数据是这样的:
也即认为这个函数在x从20到40有一个小的随机扰动,我们试图使用曲率的方式把它识别出来。
首先,函数的曲线本身看起来还是比较光滑的
求函数的二阶导,可以看到二阶导数在添加噪声的区段有很明显的提高,这就是曲率模态检测损伤的基本想法。
综上所述,共享InterpolatingFunction
完全可以高精度的分享仿真的结果,没有必要通过拟合公式的方法,而且InterpolatingFunction
可以提供几乎所有拟合公式可以提供的功能。当然,这只是分享仿真数据的一种方法,而且要在其他环境下实现这个功能并没有太大的困难,所以我还是认为没有必要再为了获得所谓的“公式”去拟合仿真结果。