此类函数值怎么做

本系列博客将深入探讨粒子追踪技术在离子束和电子束仿真中的应用我们首先会介绍概率分布函数值(probability distribution function,简称 PDF)的背景知识并展示在 COMSOL Multiphysics? 软件中对其进行随机抽样的多種方法。在后续文章中我们还将演示如何基于该数学理论来精准地模拟真实环境中离子束和电子束的传播。

使用概率分布函数值的目的

帶有能量的离子束和电子束是高能物理和核物理基础研究领域的热门话题它们也被广泛应用于阴极射线管,医用同位素的生产和核废料處理等领域对于光束传播的精确数值仿真而言,粒子位置和速度分量的初始值是十分重要的参数

在粒子追踪仿真中,当释放束流离子戓电子时通常情况下我们需要抽样选取部分粒子作为 中的离散点。不过在深入探讨什么是相空间,以及离子或电子如何形成相空间之湔我们先来大致了解一下概率分布函数值以及如何在 COMSOL

首先,我们对相关物理量进行定义连续随机变量 x 是一个可以取无穷多值的随机变量。举例来说假设在长度为 L 的线段上随机选择点 x1,在线段的另一处选择第二个点 x2假设这两点是不同的点,我们便可以在该线段上选择苐三个不同点 x_3 = (x_1+x_2)/2然后是第四个点 x_4 = (x_1+x_3)/2,以此类推从而获得无限多个不同的点,如下所示

值得一提的是,另一种随机变量被称为离散随机变量它只能取特定的值。想象你在投掷硬币或从扑克中抽取一张纸牌这时结果的数量是有限的。

一维概率分布函数值 f(x) 又称主要用于描述连续随机变量的值等于给定值的概率。例如下方的概率分布函数值

对变量 x 进行了描述该变量在开区间(0,1)内取任意值的概率是均等嘚但不会在区间外取值。此 PDF 是均匀分布其绘图如下所示。

概率分布函数值同样可以用于离散随机变量甚至适用于在某些区间内为连續、在其他区间内为离散的变量。后一类随机变量还可以被当作连续随机变量进行解释只不过它的 PDF 包含了一个或多个。本系列博客仅讨論连续型随机变量

若满足以下条件,则 PDF 会被归一化

换句话说变量 x 在范围 (-∞, ∞) 内取任意值的总概率为 1。

上述定义清楚地表明如果概率汾布函数值被归一化,则

方程的 PDF 及其对应的 CDF 见下方图表很明显,PDF已经被归一化了

从均匀分布中随机取值通常是十分容易的。在大多数編程语言中有非常多的程序可用于生成均匀分布的随机数。然而有时我们可能需要处理更加任意的分布如下图所示。

随机数在区间 (0, 1) 内取值CDF 的最终值为 1,这表示 PDF 已被归一化但是,随机数的分布显然并不均匀;例如相比于 (0.7, 0.8)随机数更有可能出现在范围 (0.2, 0.3) 内。在这种情况下直接使用内置程序对间隔 (0, 1) 内均匀分布的随机数进行抽样,可能并不正确;我们必须想出另一种方法从这个看似任意的 PDF 中抽取随机数。

為此我们采用了一种从概率分布函数值中取值的最基本方法——。现在将 U 定义为 0 到 1 之间均匀分布的随机数。换句话说U 遵循方程表示嘚分布函数值。接着为了从(可能不均匀的)概率分布函数值 f(x) 中抽样随机数,我们需要执行了下列操作:

  1. 若函数值 f(x) 尚未被归一化则对其进行归一化。
  2. 对函数值 F(x) 求逆得出逆累积分布函数值 或者分位数函数值 F-1(x)。由于我们对 f(x) 进行了归一化所以亦可称之为逆正态累积分布函數值,或将其简单表述为逆正态 CDF
  3. 将均匀分布的随机数 U 的值代入逆正态 CDF。

总而言之当 U \in \left(0,1\right) 时,F-1(U) 是满足概率分布函数值 f(x) 的随机数接下来,我們将讨论一个具体案例帮助您了解如何通过这种途径对不均匀的概率分布函数值进行抽样。

Rayleigh 分布 经常出现在稀薄气体动力学和束流物理嘚方程中其表达式为

其中 σ 是待指定的比例因子。如下所示我们可以证实上方的 Rayleigh 分布函数值已被归一化。

下图绘制了当 σ = 1 时归一化的 Rayleigh 汾布和它的累积分布函数值当 x 逐渐变大时,CDF 显然接近 1

现在将变量 y 替换为均匀分布的随机数 U,则

由于 U 在区间 (0, 1) 内呈均匀分布并且其值当湔未知,考虑上述情况我们通过使 U1 – U 精确遵循相同的概率分布函数值,从而进一步简化上方的表达式由此,我们得到了 x 的抽样值的朂终表达式

接下来,我们将讨论如何在 COMSOL 模型中通过使用方程对 Rayleigh 分布的值进行抽样

请注意,在计算逆正态 CDF 时上述分析方法并非总是可荇的。对于任何函数值的积分不一定始终存在闭合的解析解,而且累积分布函数值的逆函数值不一定存在对应的表达式本文特意选择 Rayleigh 汾布作为案例,正是因为我们可以推导出它的逆正态 CDF而不需要数值或近似方法。

我们可以借助上述分析结果在 COMSOL Multiphysics 中对任意一维分布(例如 Rayleigh 汾布)进行抽样我们首先来介绍一下可用于从特定类型分布中抽样的内置工具。

在 COMSOL Multiphysics 中我们有多种定义伪随机数(稍后我们会解释“伪隨机”的含义)的方法。例如您可以使用全局定义 节点或定义 节点中的随机 函数值特征,通过均匀分布或正态分布定义伪随机数如果使用的是均匀 分布,请指定平均值范围若平均值为

当平均值为 1 且范围为 1.5 时,均匀分布的示例图如下

当使用正态 分布或高斯分布时,請指定平均值标准偏差若平均值为 μn 且标准偏差为 σn,则 PDF 为

当平均值设为 1标准偏差为设 1.5,正态分布的示例图如下与均匀分布的相哃点在于,正态分布的曲线呈锯齿状并且不可预测;不同之处是越靠近 y = 1,曲线上的点就越密集而越向两边越稀疏。

在默认设置中平均值为 0,范围或标准偏差为 1此时两种分布的对比图如下。


对比范围为 1 的均匀 PDF 和标准偏差为 1 的高斯 PDF

除了“随机”函数值特征,您也可以茬任意表达式中使用内置函数值 randomrandomnormalrandom 函数值呈均匀分布,平均值为 0范围为 1; randomnormal 函数值呈正态分布,平均值为 0标准偏差为 1。

对于方程我們需要在区间 (0, 1) 中均匀抽取一个数 U,有两种方法可以实现这一操作:

  1. 使用“随机”函数值特征并将平均值设为 0.5,范围设为 1
  2. 使用内置的 random 函數值,并将平均值和范围增加 0.5

尽管两种方法均是可行的,不过我们将在下文中采用第二种方法

随机数,伪随机数与种伪随机种子

正如湔文所述采用上述方法的目的是生成伪随机数。 指以初始值或种子 为起点通过确定方式生成的随机数。对于内置的 random 函数值来说种子楿当于函数值的一个或多个变元。对比而言真正的随机数不能仅仅凭靠一个程序而生成,它来源于自然的熵增——一种本质上不可预测、不可重复的自然过程例如放射性衰减或大气噪声。

在许多方面伪随机数使用起来会比真随机数更为方便。伪随机数的重复性特征可被用于排除 Monte Carlo 仿真的故障这是因为使用同一个种子多次运行仿真可以得到相同的结果,这让识别模型的变化变得十分简单由于不需要自嘫熵源,因而只能在有限的时间内从环境中收获有限的熵所以伪随机数所需的仿真时间少于真随机数。

然而伪随机数也存在一些缺点峩们必须采取一些额外的预防措施。种子的数值不同伪随机数也就不同,但是相同的种子会反复生成相同的数字。若您想在任意的 COMSOL 模型中验证这一点可以创建一个“全局计算”节点,并使用恒定种子反复对内置的 random 函数值进行计算现在假设该函数值为 random(1),如下图所示輸出结果与“1”之间不存在明显的关联,因此从这个意义上来说似乎确实是“随机”的;然而若对表达式进行多次计算得到的值则始终楿同,并不会呈现随机分布

如果在每一次计算随机数时都使用不同的种子,那么每一次都会获得不同的结果在下方的屏幕截图中,表格中的时间被用作随机函数值的输入变元我们可以将下图的计算结果与上图进行对比。

当模拟粒子系统时Monte Carlo 仿真往往包含了大量的粒子集群,这些粒子在随机的初始条件下被释放并受随机力的支配。此类涉及到粒子群随机现象的案例包括:

  • 分布中抽样——本系列中后续嘚博客文章将对这些内容进行探讨

显然如果每个粒子得到了完全相同的伪随机数,那么仿真将完全与物理现场相悖举例来说,就是当離子与背景气体相互作用时所有离子会在同一时刻与气体分子或原子发生碰撞。为了让粒子是独一无二的粒子仿真中涉及到的随机数必须具有唯一的种子。

一种方法是将粒子索引 用作种子的一部分得到的整数与每一个粒子唯一对应。粒子索引变量为 <scope>.pidx其中 <scope> 是物理场接ロ实例的唯一标识符。在数学粒子追踪 接口中粒子索引通常为 pt.pidx 。函数值

若粒子在整个过程中都由随机的力支配这将产生一个新的问题。举例来说当使用随机数确定离子是否与气体分子发生碰撞时,您可不希望每一次都为特定粒子分配同一个随机数——否则的话粒子呮能在一个时间步长上发生碰撞或者干脆不碰撞!解决方案是:在随机数种子中引入多个变元,使其至少包含一个与其他粒子不同的变元囷一个随仿真时间变化的变元如果仿真需要对多个伪随机数进行互不干涉的抽样,那么或许需要再添加新变元随机函数值在使用时通瑺采取 random(pt.pidx,t,1) 的形式,当然如果确实需要额外的独立伪随机数,我们可以将最终变元 1 替换成其他数字

我们来回顾一下最初的 Rayleigh 分布抽样问题。假设我们有一个粒子群并希望对每个粒子抽样一个数,使结果值符合 Rayleigh 分布此案例中我们会使用到 σ = 3 的方程。在 COMSOL 模型中定义以下变量:

請注意最后一行便是方程。下方的直方图为由 1000 个粒子组成的集群的 rn 值平滑曲线代表精确 Rayleigh 分布,在这里我们通过解析 函数值特征对其進行定义。

如果您想绘制出包含更丰富信息的精细曲线那么需要添加更多的粒子来精确地捕获概率分布函数值。

如果将概率分布函数值莋为插值 函数值特征而不是解析分段 函数值输入到 COMSOL Multiphysics 中,那么便可通过内置功能自动对随机函数值进行定义此随机函数值会从指定的 PDF Φ进行抽样。

假设我们的插值函数值会对下表中的数据点进行线性插值:

0 0
0

下方的软件截图演示了如何将这些数据输入到“插值”函数值中具体操作方式是打开“插值”函数值特征的设置窗口,并勾选定义随机函数值 复选框便能自动对函数值 rn_int1 进行定义,此函数值可对该分咘进行抽样在“图形”窗口中,直方图显示了 1000 个数据点的随机抽样结果连续曲线便是插值函数值本身。我们还添加了 20 和 0.74 这两个额外的洇子分别用于修正直方图柱条的数目和对插值函数值进行归一化处理。

在本文中我们解释了概率分布函数值、累积分布函数值以及与各自逆函数值之间的关系。同时还探讨了几种适用于对 COMSOL 模型中的均匀和非均匀概率分布函数值进行抽样的技术在系列的下一篇文章中,峩们将对离子束和电子束的物理现象进行阐述并会阐述为何概率分布函数值对于准确模拟束流系统来说是至关重要的。

引子:天下难事必作于易,天丅大事必作于细 —— 《道德经·第六十三章》

自1995年尼克萨博第一次提出智能合约理念以来,智能合约的功能延展越来越迅速代码逻辑功能也越来越复杂。在开发的过程中由于欠缺全局考虑和逻辑测试,非常容易出现逻辑判断和功能实现的不理想导致合约的正常功能絀现异常甚至产生可以被攻击者绕过的逻辑漏洞。审核代码的通篇逻辑或者从历史教训中汲取开发经验成为规避此类漏洞最有效可行的方案。

可见修饰字斟句酌函数值调用约法三章

自由与限制,两个矛盾又相辅相成的状态有人言,没有限制的自由不是真正的自由正洳《海上钢琴师》的台词:“钢琴有低音的开头,也有高音的结束八十八个琴键是有限的,却可挥洒出无限的动人音符我喜欢这说法,这也是我生存的方式…陆地对我而言就是一艘大船这世界上有数以千计的街道,而你要如何走到尽头你要如何选择一个妻子,一栋房子一幅风景,甚至何种方式死去这些在我面前就像无穷多琴键的钢琴,但我却一个音符也弹不出来…”当自由挣脱限制的束缚会讓人感到恐惧和迷茫。

自由和限制的关系也正是科技发展和安全的关系。合约安全的精髓就是限制及控制理念精确的附加限制条件是防御安全漏洞的有效手段。在函数值调用权限的问题上正确添加函数值说明符或者修饰符来控制调用的范围和权限,是协助预防攻击者調用重要和敏感的函数值的“保护伞”

Solidity有两种函数值调用方式,一种是内部调用不会创建一个EVM调用(也叫做消息调用),另一种则是外部调用会创建EVM调用(会发起消息调用)。Solidity对函数值和状态变量提供了四种可见性分别是external,public,internal,private。其中函数值默认是public

  • 声明为external的函数值可以從其它合约或通过Transaction进行调用,所以声明为external的函数值是合约对外接口的一部分
  • 不能直接进行内部调用。
  • 函数值默认声明为public
  • public的函数值既允許内部调用,也允许外部调用
  • public的函数值由于被外部合约访问,是合约对外接口的一部分
  • 在当前的合约或继承的合约中,只允许内部调鼡
  • 只能在当前合约中被访问(不可在被继承的合约中访问)。
  • 即使声明为private仍能被所有人查看到里面的数据。访问权限只是阻止了其它匼约访问函数值或修改数据

由于变量的可见性说明符与函数值类似,这个特殊情况也可以造成变量的外部读取我们在第九期重点解析叻这个问题,请移步:

修饰符可以用来轻松改变函数值的行为比如在执行的函数值之前自动检查条件。他们可继承合约的属性也可被派生的合约重写。除了官方的一些修饰符例如,view(函数值不会更改和保存任何数据);pure(函数值既不会往区块链写数据也不从区块链讀取数据)之外,我们还有自定义修饰符用来自定义其对函数值的约束逻辑。这些函数值可以同时作用于一个函数值例如:

从上面的知识我们可以总结,可见性说明符和函数值修饰符直接关系到函数值可以被谁调用如果重要和敏感函数值缺少相关的修饰成分,就可能淪为攻击者不劳而获的工具如同各种电影动漫中神秘的力量需要被封印一样,不能正确限制这种力量势必带来无法挽回的后果。

我们按照可见性说明符和修饰符将漏洞分为两类:

在基础知识中我们提到函数值默认的可见性为public,允许用户从外部调用它们可见性说明符嘚不正确使用可能会导致智能合约中的资金流失:

函数值的默认可见性是public,意味着任何人都可以操作上面的_transfer函数值实现不需要授权就可鉯转走他人的代币。

部分敏感函数值需要onlyOwner权限如果该函数值忘记添加onlyOwner函数值修饰器,那么任何人都可以操作该函数值破坏合约执行逻輯。

setOwner() 函数值的作用是修改 owner通常情况下该函数值只有当前 owner 可以调用。 但问题代码中任何人都可以调用 setOwner() 函数值,这就导致了任何人都可以修改合约的 owner 该问题本质上是函数值调用权限不符的漏洞。

实现函数值重要功能的环节变为使项目功亏一篑的致命漏洞这是所有人不愿意看到的。

开发过程中准确理解函数值执行的安全范畴在充分理解智能合约知识的基础上加以精确的权限控制,是防止合约函数值功能被利用的重要举措同时,权限的控制需要对合约逻辑的全面理解以及细节掌握在智能合约开发时,注意细微之处的重要权限相关问题才能实现合约真正的自由发展。

结语:夫祸患常积于忽微,而智勇多困于所溺

[4]: 【Solidity入门系列】函数值的可见性与访问权限控制

作者:成都鏈安科技   如需转载请联系原作者

以上所述就是小编给大家介绍的《漏洞分析连载第十四期 | 拘于小节的调用权限,函数值调用权限漏洞》唏望对大家有所帮助,如果大家有任何疑问请给我留言小编会及时回复大家的。在此也非常感谢大家对 的支持!

在附件中b2中应是 364天呀,为什么鈈对呢
表中A2单元格时间日期当天为2011年8月2日,A1单元格日期为2010年8月3日

两个日期之间的天数为什么不正确

补充2:我用的是excel2007,在帮助里没有这个函数值,可能不能用请用2007版本的老师们试一下,我打算不用这个函数值了不知2010版本的用户们有没有这个问题?

结论:感谢 yangang800 第一时间给予答复感谢 正弋老兵 的信任,感谢 yangrongguan 的解答感谢 SSJJWW  不厌其烦的教导 ,感谢各位关注此贴的老师们在cexelhome里,我受益多多谢谢。
    哈哈还是咱方版的全面,对这个问题不迷惑了向方版学习。:loveliness:
在实际工作中坚决不用此类的函数值,因为当你在不同版本复制时就可能出现错誤,影响你的成果

我要回帖

更多关于 函数 的文章

 

随机推荐