实验仪器参数关系表达与传递
原理性描述:
在不同实验仪器之间,实现信号的传递,其实都可以转化为信号参数的传递。因此,各个实验参数的同步与刷新是表述仪器逻辑关系的关键。仪器需要传递的参数可以是string、double、list、bitmap以及自定义的类等等。在这些关系,除了自定义的类、枚举这类信息属于仪器自有特殊类型外(定义在仪器类库中,而不是指公共库),其他参数都具有通用的数据类型,而特殊类型也可以通过公共类型参数进行简介表达,通用数据类型的传递可以通过C#泛型和反射完成接口对接。
由于能量守恒,实验中的任意一个信号不会凭空产生或消失,那么所有的信号都会有起源和终止位置。而我们要研究的信号都是有传递方向的,仿真就是把一个仪器状态的变化引起其他仪器状态变化的过程用计算机表现出来。这种逻辑关系在数学上可以对应于“有向图”,引号表明有区别,因为数学研究的有向图是针对图的路径、权重、拓扑关系,对于图的有向性表达的含义在物理上可以对应到信号传递的方向性上,我们把数学研究的有向图算法当作骨骼,物理信号传递当作血肉,图中的每一个节点都当成一个输入与输出。
信号传递示意图
上图中,这样的关系有些类似于神经网络结构,只是神经网络是通过训练得到参数关系,而我们的节点是直接以物理模型得到参数关系。每一个节点都是一个输入输出模型,对应实际实验仪器,黑色的线表示仪器之间的参数传递关系,箭头表示传递方向。信号的传递可以是单向、双向、环形回路;实验中也会有多个信号源;仪器构成的图,可以是连同图,也可以不连通。为了提高参数刷新效率,我们不需要建立一个实验所有参数的完备集合,每个仪器只要获取到自身完备参数集合即可,即不相关参数不获取。
算法设计思路:
如果仪器的某一个参数由其他仪器获得,则该仪器在使用时,必须在此仪器内部进行该参数的定义,内部定义的这个参数相当于代理参数,由此参数进行实际运算。仪器与场景之间定义的参数接口,目的就是要从源仪器获得数据,用来更新目标仪器的代理参数值,而源仪器需要公开自身对其他仪器的影响参数。我们可以想象在两个节点之间,它们的连接边线就相当于打开一个数据通道,源仪器把参数加入通道,目标仪器从通道中获取参数并加工成新参数,并将加工后的结果按要求进行继续传递。
在算法设计时,首先查出所有的源仪器,然后循环源仪器的目标仪器列表,并将源仪器公开参数列表刷新给目标仪器。需要注意的是源仪器的目标仪器列表是一个动态列表,比如电路中电流的流动方向可看作有向性信号,那么源和目标就取决于仪器的电路连接;光路中光的传播也是有向性信号,源和目标取决于光路的摆放;热力学中的热量传播也是有向性信号,源和目标取决于温度的高低。此外,比如温度计,只能作为目标仪器测量温度,要确定的就是测量的是哪个仪器的温度。根据这些物理规律,我们基本上可以确定仪器之间的参数传递方向。
当然为了模型更加通用,我们可以把源仪器和目标仪器抽象成触发和被触发对象,并且要求传递的参数必须满足一定的触发条件,只有满足触发条件,仪器参数才可以从源传递到目标仪器。在仿真实验中,这种触发条件,通常是仪器的坐标位置关系、连接关系、计时器设置。为了简化算法,我们只考虑坐标位置关系和连接关系两种情况:一、坐标位置关系,两个仪器满足特定的位置坐标时,触发刷新条件。例如,物品放置到载物台上,温度计放置到待测液体中,光学元件放置到光路中等等。 这其中包括:包含关系、并列关系、串联关系;二、连接关系,两个仪器通过一定方式连接起来,表明这两个仪器具有特定的连接关系。这种连接可以是用户用鼠标交互建立的连接,也可以是通过配置文件设定建立的连接。连接关系应用最多的是电路导线,此外,还有一些未被等效为电路的仪器,但是也需要连线才能确定状态的仪器,例如热敏实验中的电炉、连一根线就直接传递信号的示波器等等。