首页 > 其他分享 >学习笔记:透明电子纸的粒子运动仿真模型

学习笔记:透明电子纸的粒子运动仿真模型

时间:2024-06-04 22:29:52浏览次数:13  
标签:仿真 粒子 epsilon self 笔记 other 运动

学习笔记:透明电子纸的粒子运动仿真模型

文章目录


前言

透明电子纸,又称透明墨水屏,其显示机理是通过TFT的电场调控实现墨水颜色颗粒的移动,进而产生显示画面或透明区域。在国内外研究进展中,透明电子纸技术相关的仿真模型的研究较少,这主要是因为目前还没有较完整以及较精确的粒子运动仿真模型。而构建一个符合实际情况的仿真模型,对于深入研究电泳电子纸技术,或者是电泳、电渗流等物理现象具有很强的实际意义。因此本文将根据所学知识以及相关经验,提出了一种基于Python编写的透明电子纸的粒子运动模型。本人水平有限,请看官们多多包涵。


一、粒子运动模型的基本物理背景

电子纸墨水中的颜色颗粒的粒径一般在百纳米级别,根据界面与胶体学相关知识,其颗粒表面会形成“电双层(electric double layer)”结构。该结构的作用是:稳定了颜色粒子在墨水溶剂中的稳定性及分散性,使其不会轻易发生颗粒之间的团聚及吸附现象。“电双层”这一物理结构对于颜色颗粒的运动行为有着至关重要的影响,因此透明电子纸的粒子运动仿真模型也主要是围绕“电双层”这一结构而展开。

根据Peter Debye 和 Erich Hückel等人的相关研究,电子墨水中颜色颗粒的“电双层”结构可由如下表达式表达:
κ − 1 = ε 0 ε r k B T 2 e 2 I \kappa^{-1}=\sqrt{\frac{\varepsilon_0\varepsilon_rk_BT}{2e^2I}} κ−1=2e2Iε0​εr​kB​T​
其中 ε 0 ε r \varepsilon_0\varepsilon_r ε0​εr​为溶剂的介电常数, k B k_B kB​是玻尔兹曼常数, T T T是绝对温度, e e e是基本电荷, I I I是以量纲 m − 3 m^{-3} m−3为单位的离子浓度。颜色颗粒的电泳迁移率和其移动速度由如下表达式表述:

μ e = 2 ε 0 ε r ζ 3 η f 1 ( κ a ) \mu_e=\frac{{2\varepsilon}_0\varepsilon_r\zeta}{3\eta}f_1\left(\kappa a\right) μe​=3η2ε0​εr​ζ​f1​(κa)
v ⃗ = μ e E ⃗ \vec{v}=\mu_e\vec{E} v =μe​E
其中 a a a为粒子半径, ζ \zeta ζ为粒子的Zeta电势, η \eta η是溶液的黏度系数, f 1 ( k a ) f_1\left(ka\right) f1​(ka)是一个在1至1.5之间变化的系数,相关的知识及资料均可以在谷歌学术或者专业书籍中找到,这里不再赘述。

二、粒子运动仿真模型

我是用 Python 构建透明电子纸的粒子运动模型,原因是 Python 代码编写自由度大,并且社区里有很多的开源代码及拓展包。同时,用 Python 进行仿真计算所占用的资源少,计算速度快(相对于某些专业多物理场仿真软件而言)。当然,用 Python 建模仿真对使用者的代码能力要求较高,并且还要对电子纸的物理模型有深入了解。那么,接下来本文将详细介绍使用 Python 构建电子纸粒子运动模型的思路及步骤。

1. 导入Python库

导入的Python库大致如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import animation
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from parameters import *
import matplotlib.pylab as py
from mpl_toolkits.mplot3d import Axes3D
import time

当然,后续如果有其他的需求,如:图形化界面设计、神经网络搭建等,也可以导入相关的包。

2. 修改相关参数及输入仿真文件

在上一篇博客:“学习心得:使用 Comsol 5.6 with Matlab 构建自动仿真模型”中,我介绍了如何自动化批量生成大量电场仿真数据。在这一步骤,我们将这些电场仿真数据(csv格式)导入模型之中,相关代码如下:

df_1 = pd.read_csv('15um方块空间电场0321.csv')
df_2 = pd.read_csv('15um方块空间电场电场翻转.csv')
df = df_1

对 csv 文件中的 x,y,z 电场模分量进行检索:

        self.idx = np.argmin((df[['x', 'y', 'z']] - [x0, y0, z0]).pow(2).sum(1))
        self.E_x = df.loc[self.idx, 'es.Ex (V/m)']
        self.E_y = df.loc[self.idx, 'es.Ey (V/m)']
        self.E_z = df.loc[self.idx, 'es.Ez (V/m)']

同时,下列代码中列举了典型的电子纸墨水的器件材料参数,后续所有的粒子运动计算都将基于这里给出的参数而开展。使用者可以根据自己的需求修改其中的参数。相关参数如下:

import pandas as pd
import numpy as np

# Parameters (All SI units)
# =============================================================================
k_B = 1.38e-23  # Boltzmann constant
T = 300  # Temperature (K)
epsilon_0 = 8.854187817e-12  # 真空介电常数F/m
epsilon_r = 2.01  # 溶剂介电常数
e = 1.6e-19
k_electricity = 9.0e9
I = 0.41153e18  # 分散液电荷浓度
g = 9.8  # m/s2

eta = 1.4e-3  # Dynamic viscosity of water (PaS)
rou_m = 750  # 溶剂密度 kg/m3

# 电泳粒子参数:
a = 400e-9  # 粒子直径
zeta_p = -60e-3  # 白粒子zeta 电位
rou_p = 1120  # 粒子密度 kg/m3
m_p = 4 / 3 * np.pi * (a / 2) ** 3 * rou_p

# 带电反胶束CIMs参数:
a_c = 10e-9  # 粒子直径
q_c = e
zeta_c = q_c / (6 * np.pi * a_c / 2 * epsilon_0 * epsilon_r)

# 非极性溶剂粒子带电量公式
q = 6 * np.pi * epsilon_0 * epsilon_r * a/2 * zeta_p

k = np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T))
debye_length = 1/k
print(f'德拜长度为:{debye_length}')

fH_ka = 1/(3*(1+2.5/k*a*(1+2*np.exp(-k*a))))
print(f'亨利修正系数为:{fH_ka}')

mu_e = ((2 * epsilon_0 * epsilon_r * zeta_p)/(3 * eta)) * fH_ka
print(f'电泳迁移率为:{mu_e}')

rho = 1055  # density of polystyrene beads in kg/m3

3. 粒子三维运动速度计算

在透明电子纸的像素单元中,颜色颗粒的运动是沿各个方向的(三维方向),因此需要对粒子的三维方向的运动速度进行分别计算,计算基于了 Debye–Hückel 电泳迁移公式。如下是相关的计算代码:

 # Debye–Hückel迁移率公式,v_x,v_y,v_z的 随着当前坐标的空间电场分量进行变化,
        self.v_x = -self.E_x * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)
        self.v_y = -self.E_y * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)
        self.v_z = -self.E_z * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)

然后,再根据以上计算结果对每颗粒子的空间位置进行更新:

        self.x += self.v_x * dt
        self.y += self.v_y * dt
        self.z += self.v_z * dt

4. 其它物理模块的添加

以上三个步骤仅仅是满足了基本的粒子运动的仿真,但是这样离符合真实情况的粒子运动仿真模型还相距甚远。差距主要在于:

  1. 颜色粒子运动至靠近电极界面的时候,会受到来自其它带电物质的“电场屏蔽”作用;
  2. 当粒子数量众多(紧密堆积)时,粒子与粒子间会存在库伦排斥等作用,影响粒子的运动轨迹;
  3. 颜色粒子的粒径大小不一,其运动速度及运动轨迹也有差别;
  4. 电子墨水中的其它带电物质的影响;

本文根据上述第2点,添加了一个粒子间距离判定的模块,其基本思路就是强行让各个粒子间距离保持在两者半径之和之外,倘若发生距离小于两者半径之和,则发生粘弹性碰撞反弹。相关代码演示如下:

    # # 增加电泳粒子间的碰撞检测,0.9为碰撞衰减系数
    def collision_detect(self, other):
        for other in particles:
            if other is not self:
                distance = np.sqrt((self.x - other.x) ** 2 +
                                   (self.y - other.y) ** 2 +
                                   (self.z - other.z) ** 2)

                if distance < (self.r + other.r) * 1:
                    overlap_distance = (other.r + self.r) * 2
                    overlap_direction_x = (other.x - self.x) / distance
                    overlap_direction_y = (other.y - self.y) / distance
                    overlap_direction_z = (other.z - self.z) / distance
                    self.v_x, other.v_x = -self.v_x * 0.9, -other.v_x * 0.9
                    self.v_y, other.v_y = -self.v_y * 0.9, -other.v_y * 0.9
                    self.v_z, other.v_z = -self.v_z * 0.9, -other.v_z * 0.9
                    other.x += overlap_distance * overlap_direction_x
                    other.y += overlap_distance * overlap_direction_y
                    other.z += overlap_distance * overlap_direction_z

以上仅做了一个复杂物理模块的展示,针对上述其余几点的物理现象,使用者可以根据自己的需求进行修改。

5. 粒子运动轨迹动画展示

下列代码展示了使用 python 自带的动画模块 animation 绘制粒子的运动轨迹。使用者亦可根据自己的需求,调整绘图框的格式以及动画的相应参数。

def animate(t):
    ax.clear()
    ax.set_xlim(0, 100e-6)
    ax.set_ylim(0, 100e-6)
    ax.set_zlim(0, 40e-6)
    ax.ticklabel_format(style='sci', axis='both', scilimits=(0, 0))

    for p in particles:
        p.move_p(0.005)  # 更新时间
        for i in range(len(particles)):
            particles[i].move_p(dt)

            for j in range(i + 1, len(particles)):
                particles[i].collision_detect(particles[j])
        ax.scatter(p.x, p.y, p.z, s=100, c='r', marker='o')
         # 时间步长显示
    time_string = ax.text(0.2e-3, 0.5e-3, 0.4e-3, f'Time = {t * 0.005}s', size=20, transform=ax.transAxes)

    # 电极图形:顺时针的四个顶点
    verts = [
        [0.0425e-3, 0.0425e-3, 0.000],
        [0.0425e-3, 0.0575e-3, 0.000],
        [0.0575e-3, 0.0575e-3, 0.000],
        [0.0575e-3, 0.0425e-3, 0.000]]

    collection = Poly3DCollection([verts], alpha=.25)
    collection.set_facecolor('#9400D3')
    ax.add_collection(collection)

    return ax, time_string
ni = animation.FuncAnimation(fig, animate, frames=100)  # 动画总共有100帧

# ani.save('15um方块电极.gif', writer='Pillow', dpi=100)  # 默认和代码存在一个路径下
plt.show()

6. 粒子运动仿真结果展示

最后,经过以上步骤,我们得到了透明电子纸三维的粒子运动仿真结果,粒子运动仿真示意图如下图所示:
在这里插入图片描述
通过对上述仿真模型的绘图和动画部分进行稍许修改,在输入合适的参数以及电场仿真文件后,我们便可以得到一组粒子运动轨迹仿真的可视化动图,以及其相对应的结果(如:粒子运动响应时间、粒子三维坐标值等)。根据这些仿真结果,我们可以判定不同的器件结构、墨水参数、驱动波形对粒子运动行为的影响关系。下图展示了一组粒子运动仿真的三视图动画:
在这里插入图片描述


总结

以上就是关于透明电子纸的粒子运动仿真模型的全部介绍。本模型由 Python 代码编写,粒子的运动计算基于 Debye–Hückel 电泳迁移理论,空间电场需要由 Comsol with matlab 导出。使用者可以根据自己的需求,灵活修改其中电子墨水的材料参数,及仿真结果的判定标准,同时也可以根据自己审美,修改动画绘图的格式,以适应不同的需求。

该粒子运动仿真模型不仅可以模拟电泳粒子的运动轨迹,还可以计算电子纸器件的响应时间、粒子聚集情况、粒子三维坐标等,为电子纸显示屏的设计制造提供一定的参考依据。同时也可为研究电泳、电渗流等物理现象提供一定的仿真基础。

最后,如果对电泳理论以及胶体界面理论的研究足够深入后,粒子运动仿真模型可以较好地模拟真实的粒子运动情况,或许可以考虑搭配 Comsol with Matlab 进行大批量自动化的建模仿真,构建庞大且较为准确AI训练数据集!

标签:仿真,粒子,epsilon,self,笔记,other,运动
From: https://blog.csdn.net/weixin_42054421/article/details/139443317

相关文章

  • 九、FreeRTOS学习笔记-列表和列表项
    列表和列表项的简介列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。列表项就是存放在列表中的项目列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表列表的特点:列表项间的地址非连续的,是人为的连接到一起的。列表......
  • java函数笔记
    Statement.executeQuery和Statement.executeUpdate作用:用于执行SQL查询和更新操作。问题:容易导致SQL注入攻击。解决方法:使用PreparedStatement进行参数化查询。//不安全的做法Statementstmt=connection.createStatement();ResultSetrs=stmt.executeQuery("SEL......
  • python学习笔记-04
    高级数据类型一组按照顺序排列的值称为序列,python中存在三种内置的序列类型:字符串、列表和元组。序列可以支持索引和切片的操作,第一个索引值为0表示从左向右找,第一个索引值为负数表示从右找。1.字符串操作1.1切片切片是指选取字符串中的某些数据,语法:字符串[开始下标:结......
  • 西瓜书与d2l笔记
    西瓜书强化学习任务通常用马尔可夫决策过程(MarkovDecisionProcess,简称MDP)来描述机器只能通过选择要执行的动作来影响环境,也只能通过观察转移后的状态和返回的奖赏来感知环境机器要做的是通过在环境中不断地尝试而学得一个"策略"(policy)π,根据这个策略,在状态x下就能得知......
  • 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programmin
    系列文章目录操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)----操作系统介绍与接口示例操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)----xv6初探与实验一(Lab:Xv6and......
  • Vos仿真
    首先你要明白失调电压的来历,失调电压是由内部电路的失配造成的。输出失调,是输入为0,但是因为内部管子的失配,会在输出端产生一个压差。为了消除这个失调,要在输入端加上一个电压,使输出信号变成0,这样才是补偿了失调。同样的,等效的输入失调你可以理解为是输出的失调电压,除以了电路本身......
  • AC仿真和stb仿真/huawei
    Stb仿真:IPROB相当于一个大电感,dc时导通,交流截至,因此可以维持dc点的同时扫描开环特性。ALLEN:稳定性一律用闭环跑,开环没有意义。stb在哪里插iprobe都可以,cadence也推荐用这个方法跑。ac需要找个点断环加大电容大电感,这个点最好是高阻低电容,比如运放的输入,否则会有误差。加ipro......
  • Linux学习笔记6 进程角度看内存泄露
    一,从进程角度看堆区内存申请与释放问题1,c语言中的内存泄漏内存溢出:申请内存时,没用足够的内存可以使用。 内存泄露:严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏                宽泛的讲,实际情况中很多时候一些不太好的实践......
  • 数据结构学习笔记-简单选择排序
    简单选择排序的算法设计与分析问题描述:设计并分析简单选择排序【算法设计思想】迭代选择:算法通过循环遍历数组,进行size次迭代。最小值选择:在每次迭代(i)中,算法致力于找到未排序子数组(arr[i]到arr[size-1])内最小元素的索引。这个最小元素将被选出来进行交换。交......
  • 05-Excel基础操作-学习笔记
    使用分列工具整理数据导出的数据是文本文件即以.txt结尾的文件,放入Excel中,是一种常见的操作。具体操作打开文本格式的数据,Ctrl+A全选——Ctrl+C复制——新建excel表格——点击A1单元格(注意,这里不要双击)——Ctrl+V粘贴——选中A列——数据选项卡——分列——勾选“分隔符号(D)”......