Python和MATLAB及C++和Fortran胶体粒子数学材料学显微镜学微观流变学及光学计算

ops/2024/10/16 2:12:40/

🎯要点

  1. 二维成像拥挤胶体粒子检测算法
  2. 粒子的局部结构和动力学分析
  3. 椭圆粒子成链动态过程定量分析算法
  4. 小颗粒的光散射和吸收
  5. 活跃物质模拟群体行为
  6. 提取粒子轨迹粘弹性,计算剪切模量
  7. 计算悬浮液球形粒子多体流体动力学
  8. 概率规划全息图跟踪和表征粒子位置、大小和折射率
    在这里插入图片描述

Python粒子滤波器算法

为了简化,我们给出已经推导出的线性状态空间模型的粒子滤波器算法。粒子滤波器是针对以下状态空间模型推导出来的:
x k = A x k − 1 + B u k − 1 + w k − 1 y k = C x k + v k ( 1 ) \begin{aligned} & x _k=A x _{k-1}+B u _{k-1}+ w _{k-1} \\ & y _k=C x _k+ v _k \end{aligned}\qquad(1) xk=Axk1+Buk1+wk1yk=Cxk+vk(1)
其中 x k ∈ R n x _k \in R ^n xkRn 是离散时间步长 k k k 的状态向量, u k − 1 ∈ R m 1 u _{k-1} \in R ^{m_1} uk1Rm1 是时间步长 k − 1 k-1 k1 的控制输入向量, w k − 1 ∈ R m 2 w _{k-1} \in R ^{m_2} wk1Rm2 是时间步长 k − 1 k-1 k1 处的过程扰动向量(过程噪声向量), y k ∈ R r y _k \in R ^r ykRr 是时间步长 k k k 处观测到的输出矢量, v k ∈ R r v _k \in R ^r vkRr 是离散时间步长 k k k 处的测量噪声向量, A A A B B B C C C是系统矩阵。

假设过程扰动向量 w k w _k wk 服从正态分布,具有零均值和规定的协方差矩阵,即
w k ∼ N ( 0 , Q ) ( 2 ) w _k \sim N (0, Q)\qquad(2) wkN(0,Q)(2)
其中 Q Q Q 是过程扰动向量的协方差矩阵。另外,假设测量噪声向量 v k v _k vk 服从正态分布,具有零均值和规定的协方差矩阵,即
v k ∼ N ( 0 , R ) ( 3 ) v _k \sim N (0, R)\qquad(3) vkN(0,R)(3)
其中 R R R 是测量噪声向量的协方差矩阵。状态转移密度是以下正态分布的密度
N ( A x k − 1 + B u k − 1 , Q ) ( 4 ) N \left(A x _{k-1}+B u _{k-1}, Q\right)\qquad(4) N(Axk1+Buk1,Q)(4)
此外,我们还证明了测量密度(测量概率密度函数),表示为 p ( y k ∣ x k ) p\left( y _k \mid x _k\right) p(ykxk),是一个正态分布,其平均值为 C x k C x _k Cxk,协方差矩阵等于测量噪声向量 v k v _k vk 的协方差矩阵。也就是说,测量密度是以下正态分布的密度
N ( C x k , R ) ( 5 ) N \left(C x _k, R\right)\qquad(5) N(Cxk,R)(5)
为了实现粒子滤波器,我们需要从状态转换概率 (4) 中抽取 x k x _k xk 的样本。有两种方法可用于生成这些样本。第一种方法(我们在 Python 实现中使用)是从 (2) 中给出的分布中抽取过程扰动向量的随机样本。

在每个离散时间点 k k k,粒子滤波器计算以下一组粒子
{ ( x k ( i ) , w k ( i ) ) ∣ i = 1 , 2 , 3 , … , N } ( 6 ) \left\{\left( x _k^{(i)}, w_k^{(i)}\right) \mid i=1,2,3, \ldots, N\right\}\qquad(6) {(xk(i),wk(i))i=1,2,3,,N}(6)
索引为 i i i 的粒子由元组 ( x k ( i ) , w k ( i ) ) \left( x _k^{(i)}, w_k^{(i)}\right) (xk(i),wk(i)) 组成,其中 x k ( i ) x _k^{(i)} xk(i) 是状态样本, w k ( i ) w_k^{(i)} wk(i) 是重要性权重。粒子集近似后验密度 p ( x k ∣ y 0 : k , u 0 : k − 1 ) p\left(x_k \mid y _{0: k}, u _{0: k-1}\right) p(xky0:k,u0:k1),如下所示
p ( x k ∣ y 0 : k , u 0 : k − 1 ) ≈ ∑ i = 1 N w k ( i ) δ ( x k − x k ( i ) ) ( 7 ) p\left( x _k \mid y _{0: k}, u _{0: k-1}\right) \approx \sum_{i=1}^N w_k^{(i)} \delta\left( x _k- x _k^{(i)}\right)\qquad(7) p(xky0:k,u0:k1)i=1Nwk(i)δ(xkxk(i))(7)
粒子滤波算法的说明:对于初始粒子集
{ ( x 0 ( i ) , w 0 ( i ) ) ∣ i = 1 , 2 , 3 , … , N } \left\{\left( x _0^{(i)}, w_0^{(i)}\right) \mid i=1,2,3, \ldots, N\right\} {(x0(i),w0(i))i=1,2,3,,N}

Python过滤实现(片段)

import time
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normaldef systematicResampling(weightArray):N=len(weightArray)cValues=[]cValues.append(weightArray[0])for i in range(N-1):cValues.append(cValues[i]+weightArray[i+1])startingPoint=np.random.uniform(low=0.0, high=1/(N))resampledIndex=[]for j in range(N):currentPoint=startingPoint+(1/N)*(j)s=0while (currentPoint>cValues[s]):s=s+1resampledIndex.append(s)return resampledIndexmeanProcess=np.array([0,0])
covarianceProcess=np.array([[0.002, 0],[0, 0.002]])meanNoise=np.array([0])
covarianceNoise=np.array([[0.001]])processDistribution=multivariate_normal(mean=meanProcess,cov=covarianceProcess)
noiseDistribution=multivariate_normal(mean=meanNoise,cov=covarianceNoise)m=5
ks=200
kd=30Ac=np.array([[0,1],[-ks/m, -kd/m]])
Cc=np.array([[1,0]])
Bc=np.array([[0],[1/m]])h=0.01A=np.linalg.inv(np.eye(2)-h*Ac)
B=h*np.matmul(A,Bc)
C=CcsimTime=1000
x0=np.array([[0.1],[0.01]])stateDim,tmp11=x0.shape
controlInput=100*np.ones((1,simTime))stateTrajectory=np.zeros(shape=(stateDim,simTime+1))
output=np.zeros(shape=(1,simTime))stateTrajectory[:,[0]]=x0for i in range(simTime):stateTrajectory[:,[i+1]]=np.matmul(A,stateTrajectory[:,[i]])+np.matmul(B,controlInput[:,[i]])+processDistribution.rvs(size=1).reshape(stateDim,1)output[:,[i]]=np.matmul(C,stateTrajectory[:,[i]])+noiseDistribution.rvs(size=1).reshape(1,1)x0Guess=x0+np.array([[0.7],[-0.6]])
pointsX, pointsY = np.mgrid[x0Guess[0,0]-0.8:x0Guess[0,0]+0.8:0.1, x0Guess[1,0]-0.5:x0Guess[1,0]+0.5:0.1]
xVec=pointsX.reshape((-1, 1), order="C")
yVec=pointsY.reshape((-1, 1), order="C")states=np.hstack((xVec,yVec)).transpose()dim1,numberParticle=states.shapeweights=(1/numberParticle)*np.ones((1,numberParticle))
numberIterations=1000stateList=[]
stateList.append(states)
weightList=[]
weightList.append(weights)for i in range(numberIterations):controlInputBatch=controlInput[0,i]*np.ones((1,numberParticle))newStates=np.matmul(A,states)+np.matmul(B,controlInputBatch)+processDistribution.rvs(size=numberParticle).transpose()newWeights=np.zeros(shape=(1,numberParticle))for j in range(numberParticle):meanDis=np.matmul(C,newStates[:,[j]])distributionO=multivariate_normal(mean=meanDis[0],cov=covarianceNoise)newWeights[:,j]=distributionO.pdf(output[:,i])*weights[:,[j]]weightsStandardized=newWeights/(newWeights.sum())tmp1=[val**2 for val in weightsStandardized]Neff=1/(np.array(tmp1).sum())if Neff<(numberParticle//3):resampledStateIndex=np.random.choice(np.arange(numberParticle), numberParticle, p=weightsStandardized[0,:])        newStates=newStates[:,resampledStateIndex]weightsStandardized=(1/numberParticle)*np.ones((1,numberParticle))states=newStatesweights=weightsStandardizedstateList.append(states)weightList.append(weights)meanStateSequence=np.zeros(shape=(stateDim,numberIterations))
for i in range(numberIterations):meanState=np.zeros(shape=(stateDim,1))for j in range(numberParticle):meanState=meanState+weightList[i][:,j]*stateList[i][:,j].reshape(2,1)meanStateSequence[:,[i]]=meanState

👉更新:亚图跨际


http://www.ppmy.cn/ops/126233.html

相关文章

zookeeper实现RMI服务,高可用,HA

这可不是目录 1.RMI原理与说明1.1含义1.2流程1.3rmi的简单实现1.4RMI的局限性 2.zookeeper实现RMI服务&#xff08;高可用、HA&#xff09;2.1实现原理2.2高可用分析2.3zookeeper实现2.3.1代码分析2.3.2公共部分2.3.3服务端2.3.4客户端2.3.5运行与部署2.3.6效果展示与说明 1.RM…

【Jenkins】2024 最新版本的 Jenkins 权限修改为 root 用户启动,解决 permission-denied 报错问题

最新版本的 Jenkins 修改 /etc/sysconfig/jenkins 中的 JENKINS_USERroot不会再生效&#xff0c;需要按照以下配置进行操作&#xff1a; vim /usr/lib/systemd/system/jenkins.service然后重启就可以了 systemctl daemon-reload # 重新加载 systemd 的配置文件 systemctl res…

Flink入门

概念透析 实践练习章节介绍了作为 Flink API 根基的有状态实时流处理的基本概念&#xff0c;并且举例说明了如何在 Flink 应用中使用这些机制。其中 Data Pieplelin & ETL 小节介绍了有状态流处理的概念&#xff0c;并且在 Fault Tolerance 小节中进行了深入介绍。Streami…

【Vue】Vue扫盲(六)关于 Vue 项目运行以及文件关系和关联的详细介绍

一、Vue 项目运行过程 编译阶段 Vue 通过编译器将构建的模板转换为渲染函数。这个过程包括模板解析、AST&#xff08;抽象语法树&#xff09;生成和优化等操作。 例如&#xff0c;对于一个简单的 Vue 模板 {{message}} &#xff0c;编译器会解析其中的插值表达式{{message}}&a…

mysql集群-主库从库配置--主从库分离

mysql集群 为什么要做主从库分离&#xff1f; 怎么进行分离&#xff1f; 设置2个数据库&#xff0c;为主库从库&#xff0c;主库存储&#xff0c;从库查询 怎么设置&#xff1f; 在你原本的配置yml文件中主库的ip是多少&#xff0c;从库是多少&#xff0c;都要和数据库的ip 一…

系统架构评估

系统架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。它利用数学或逻辑分析技术&#xff0c;针对系统的一致性、正确性、质量属性、规划结果等不同方面&#xff0c;提供描述性、预测性和指令性的分析结果。 系统架构评估的方法通常可以分为3类&…

vue项目 子组件在打开时调用父组件传过来的props里的数据

1 分析: 父组件在加载时就会加载子组件,所以此时调不到数据, 我们可以利用父组件内子组件的ref属性,获取子组件的方法, 在父组件的触发方法中调用直接传值 例: 父组件: //父组件事件AttributesRelations(row){this.dialogForm rowthis.$refs.AttributesRelationsRef.Attribu…

美畅物联丨视频汇聚从“设”开始:海康威视摄像机设置详解

在运用畅联云平台进行视频汇聚与监控管理时&#xff0c;海康威视的安防摄像机凭借其卓越的性能与广泛的应用兼容性&#xff0c;成为了众多用户的首选产品。海康威视摄像机参数设置与调试对于实现高效的安防监控至关重要。今天&#xff0c;让我们一同深入学习海康摄像机的参数设…