没有合适的资源?快使用搜索试试~ 我知道了~
LOTOS规范下的经典多体问题建模与模拟
113理论计算机科学电子笔记43(2001)网址:http://www.elsevier.nl/locate/entcs/volume43.html23页LOTOS中的NKenneth J. 特纳University of Stirling斯特灵斯特灵FK9 4LA英国摘要它示出了如何在力学中的经典n体问题可以推广和形式化的LOTOS。规范框架的实例化产生了许多变体。其中包括牛顿摇篮、气体运动、“生命游戏”、太阳系仪、太空游戏、空中交通模拟和帆船比赛。它示出了这些是如何从使用配置工具的通用框架由此产生的LOTOS规范自动模拟,以图形方式动画系统的行为。1介绍多体问题是力学中的一个经典问题.它考虑的是在万有引力作用下许多物体对于两个物体,有一个解析解。对于三个或三个以上的物体,没有解析解,必须使用近似或模拟的方法在本文中,这个问题被广义地解释为在空间中的相互作用随着时间的推移的一些相互作用的元素。然后在LOTOS(时间排序规范语言[5])中对该问题进行建模,并进行模拟以获得图形动画的动态行为读者应该简单地预览一下图2,以便对将要讨论的问题变体有一个感觉。这种应用程序将LOTOS很好地带出了它原来的协议规范和分析领域。在LOTOS中探索n体问题的动机是:• 这个问题为LOTOS提供了一个重大挑战,并评估其在全新领域的适用性• 如将看到的,LOTOS可用于提供通用制剂。这就允许在同一个规范框架中捕获基本问题的惊人数量的变化。1电子邮件:kjt@cs.stir.ac.uk2001年由Els evierScienceB. V. 操作访问和C CB Y-NC-N D链接。特纳114• 一些变量被描述有标准的方法,例如,拉-格朗日力学的n体问题或麦克斯韦-玻尔兹曼理论的气体运动。然而,它们在物理学中被视为独立的理论。LOTOS支持所有变化的通用方法。• 作为一种规范语言,LOTOS具有形式化的概念,例如等价,模型检验和证明。这个问题及其在物理学中的变体也有正式的模型,如牛顿运动方程或统计力学。然而,LOTOS的方法非常不同,并提供了不同类型的分析。例如,后面给出的空中交通模型可能(原则上)被证明然而,应该说,这是该方法的一个愿望;迄今为止,只进行了模拟。• 多体问题及其变体提供了一个有趣的变化,从一些-用形式化方法研究枯燥的课题。作者承认,一个重要的动机是简单地享受这种方法的乐趣!LOTOS已成功地用于一些非协议领域。这些包括航空[3]、计算机集成制造[8]、嵌入式系统[1]、图形标准[9]、硬件[6]、医疗设备[11]、神经网络[4]和可视化[12]。(Many可提供更多参考资料)。据作者所知,n体问题与LOTOS以前的任何应用都有很大的不同。唯一类似的工作是[13]可以生成图形动画(吃饭的哲学家吃饭)。第2节提出了问题的框架,展示了如何在一个更一般的方式来解释原来的n体问题。一些变种是illustrated。然后解释包含这些的LOTOS规范框架。第3节讨论了对模拟的工具支持。第4节对一般问题的变体进行了一些深入的了解。这在第5节和第6节中对n体和布朗运动问题进行了说明。2一般问题2.1问题框架所研究的系统由许多相互作用的要素组成。在尊重原来的问题,“身体”一词身体以问题依赖的方式相互作用。举例来说• 在n体问题中,相互作用是通过相互的万有引力.的身体被认为是通过以太的媒介来“传达”它们的位置。虽然物理学家会觉得这是一种奇怪的解释,但它仍然是• 在二维元胞自动机(康威的“生命游戏”)中细胞通过交换它们的占有信息而相互作用。这也可以看作是一种沟通方式。• 在空中交通模型中,飞机通过通信位置进行交互这是一种更传统的使用雷达的通信方式特纳115从LOTOS的观点来看,系统因此被建模为通信过程的集合(每个主体一个)。允许通信的这允许广播通信,即由一个机构提供的信息(例如,其位置)变得所有其他机构都知道。对于许多问题变体,这正是所需要的。对于某些变体,只有来自邻近机构的信息才是相关的。因此,这些物体只根据来自附近物体的信息来行动举例来说• 对于牛顿• 在生命游戏中,每个细胞的命运只取决于它的八个近邻(正交和对角)。• 在帆船比赛中,解决冲突的规则只适用于(游艇,浮标)彼此在两条船的长度内该系统被认为是封闭的,即不受外界影响。在LOTOS术语中,所有机构之间的通信因此是内部的(即,以太之门是隐藏的)。在大多数应用中,物体根据其属性和其他物体的状态确定性地动作。然而,某些应用程序允许非确定性行为:• 在布朗运动中,粒子与气体分子发生碰撞后者没有建模,只有它们导致粒子随机移动的效果。• 在太空游戏中,太空船随机改变他们的航向和发射错误-席尔斯• 在帆船比赛中,风会随机改变方向和强度。对于大多数的问题变量,机构的数量是预先固定的。然而,一般而言,LOTOS公式允许机构随着系统的演变而变得不活跃或被(重新)激活例如,这与太空游戏有关,因为太空船可能发射导弹(从而产生新的物体)。身体有属性。为了保持一致性,每个主体都有一组固定的属性,尽管主体在不同的问题变体中使用不同的属性。图1总结了以下属性在各种应用中的使用:身份:身份只是一个主体标识符种类:物体的种类将其识别为质量、气体分子、自动机单元等。评级:这是一个用于附加信息的总括数字属性。例如,它给出了行星的质量或游艇的速度等级。尺寸:这在绘制物体时使用,但也与某些变体的行为有关(例如帆船模型)。例如,它定义了行星的直径,或者游艇的长度。位置、速度:这些是任意长度的矢量,尽管只有一维、二维和三维适用于这里研究的应用。标题、路径:这些也使用向量。航向可能不同于速度,因为例如,宇宙飞船或游艇可能指向与其当前行驶的方向不同的方向。一些问题变体中的机构旨在遵循特纳116问题种评级大小POS.维尔头路径n体质量质量直径(x,y)(x,y)--摆重量悬浮液直径θω--牛顿球悬浮液直径θω--布朗运动颗粒-直径(x,y)(x,y)--气体运动分子质量直径(x,y)(x,y)--生命游戏细胞占用宽度(x,y)---太空游戏导弹质量直径(x,y)(x,y)--飞船质量长度(x,y)(x,y)(x,y)-明星质量长度(x,y)---Orrery地球等质量直径(x,y)(x,y)--空中交通飞机速度长度(x,y,z)(x,y,z)-航路点航路点-直径(x,y,z)---帆船赛马克-直径(x,y)---游艇障碍长度(x,y)(x,y)(x,y)标志风最大速度箭头(x,y)(x,y)--Fig. 1. N体问题的特殊例子一个特定的路径作为一个向量列表。一艘游艇在比赛中航行,就像一系列要绕过的浮标(称为图2显示了如何在本文考虑的不同问题变体当然,图形描述不在LOTOS行为模拟范围内。然而,它是直接从模拟行为中导出的。系统演化的每一步都会产生一个新的系统状态。这被提供给绘图程序,该绘图程序基于每个实体的属性创建图形显示。车身外观不直接由LOTOS规范决定,尽管各种属性会影响图纸。例如,游艇的大小、位置和航向决定了船体的绘制方式。帆的位置由游艇的航向和风向决定。在空中交通应用中,飞机的位置和飞行高度是从仿真中得出的。在许多问题变体中,物体标识符可以被绘图程序用来标记物体,例如行星的名称或飞机的呼号。2.2规范框架特纳117该方法执行一种离散事件模拟。系统的行为是分步骤进行的,在每一步中,所有物体的状态都是已知的。所有特纳118123N体摆牛顿布朗运动气体运动火星孙水星金星地球生命空间游戏太阳系BA142A250UK438221BM6023303290BC航空交通风帆比赛图二. N体问题的特殊例子然后,各机构根据自己的状况和其他相关机构的状况更新自己的状况。系统进化的下一步就开始了。LOTOS规范包含一个同步所有主体的行为的步骤过程。以太事件被广播到所有实体,要求它们更新自己的状态并广播到其他实体。因为所有的进程都在以太门同步,所以所有的事件都是共享的。因此,这些进程步调一致地进行。每个body进程都包含一个其他body的状态列表以及它自己的状态;LOTOS不支持全局状态的概念。LOTOS规范框架包含了模拟n体问题的变体在规范中留下了某些any bodies:包含body进程的并行实例,并为其属性提供初始值。1特纳119×任意控制:用于少数需要对身体进行全面控制的应用程序(例如太空游戏或生命游戏)。它定义了一个进程而不是一个类型,以便可以描述非确定性行为。它可能会与现有的物体平行地创造新的物体(例如太空游戏中的导弹,或“生命游戏”中的新细胞any params:给出任何规范参数或常量。any update:定义如何使用其他主体的状态信息更新主体的状态。这是规范的核心,也是在问题变体中变化最大所有应用程序都定义了一个StateNext函数:国家Next:国家,国家>国家其使用其自身的状态和其它相关(例如,附近)主体的状态来更新主体的状态。大纲规范框架如下。为简洁起见,定义类型的公式该规范使用库中的布尔值和字符串方便的条件运算是为布尔值定义的虽然自然数可以从库中获得,但它们的Succ符号不方便。因此,它们由外部C类型int实现。对于自然数,引入了一些常用的常量和运算;对于未定义的自然数,使用None实数由外部C类型double实现。这是特别必要的,因为实数的规范在LOTOS中是极其复杂的。对实数引入了一些常用的常数2由于LOTOS没有内置的数字语法,它们被作为修改的标识符(例如3 14,M1 2,5E 3表示3.14,-1.2,5 103)。自然数和实数的实现是使用GLAD(通用数据注释语言)作为TOPO工具集的一部分[7]的并行描述给出的。在CADP中使用外部类型有一种类似的方法(Cæsar/Ald e′ baranD ev elopmentPackage[2])。规格AnyBody:NoExit(* 整体规格 *)库Boolean,StringEndlib(* boolean,string *)类型BoolOpsIs Path,States(* boolean operations *)Opns(* operations for booleans*)If:Bool,Kind,Kind> Kind(* conditional for kind *)If:Bool,Nat,Nat > Nat(* conditional for natural *)If:Bool,State , State> State ( * conditional for state * ) If : Bool ,States,States> States(* conditional for states *)If:Bool,Path,Path> Path(* conditional for path *)TypeNatIs Boolean(* natural number排序Nat(* natural的排序名称 *)Opns(* operations for natural *)2Random的定义有点调皮,因为它具有常数的签名,但由随机函数实现。特纳120−−0,1,2,3,None:>Nat(* 0,1,2,3,undefined *)Succ:Nat> Nat(* successor *)+ 、、* 、ˆ:Nat,Nat> Nat(* add/sub/mul/exp* )Eq , Ne,Lt , Le ,哥,GT:(* ==/ !=/=/>=/>*) Nat,Nat> Bool类型Real是 Boolean(* real numberSortsReal(* sort name for real *)Opns(* operations for real *)M1,0,0 5,1,2,随机:>实数(* -1.0/0.0/0.5/1.0/2.0/0.0.. 1.0 *)+ 、、 * 、 /, ˆ :Real,Real> Real(* add/sub/mul/div/exp *)Sin,Cos:Real> Real(* sin/cos *)Square,Cube,Sqrt:Real> Real(* square/cube/square root *)Abs:Real> Real(*absolute *)Lt,Le,Eq,Ne,Ge,Gt:(*/=/==/!=/ >=/>*)Real,Real> Bool动画是使用三种绘图模式之一:标签(身体形状加标签),形状(身体形状)和轨迹(跟踪身体主体的类型仅仅是一个枚举类型,它涵盖了所有的问题变量。添加一个新类型的body需要对Kind类型进行简单的扩展,并向C支持库添加新代码以绘制body。类型模式为自然(* 绘图模式 *)Opns(* operations for mode *)标签,形状,轨迹:>自然(* 绘图模式 *)类型种类是自然(* 种类的机构 *)排序种类(* 排序名称的种类 *)OPN(* 操作类型 *)飞机,球,细胞,地球,马克,火星,质量,水星,导弹,分子,月球,粒子,船舶,恒星,太阳,金星,航点,重量,风,游艇,无:>种类Ord:Kind> Nat(* ordinal number for kind *)等式, Ne:Kind,Kind> Bool(*(in)equality of kind *)清单上需要有一些不同的这些是库字符串类型的实例化用于元素串联的通过一些方便的操作扩展了基本列表。TypeListIs StringRenamedBy(* string as list *)OpnNamesFor+(* element prefix/append *)TypeListOpsIs Nat,List(* list operations *)Opns(* operations for lists*)IsIn:Element,String> Bool(* 元素是否在字符串中?* )NotIn:Element,String> Bool(* 元素不在字符串中?* )的文件特纳121−−第一、第二、第三:字符串>元素(* first/second/third values*)Nth:Nat,String> Element(*n th string element(0,.)* )Tail:String> String(* 除了第一个值之外的所有值 *)几乎所有的问题变体都需要向量,所以这些向量被创建为带有明显操作的实数列表。路径是向量的列表。TypeVecIs ListOps(* vector as number list *)ActualizedByReal,BooleanUsing(* use actual types *)SortNames(* 实际排序名称 *)RealFor Element(* real as element type *)VecFor String(*vector sort name *)BoolFor FBool(* use actual booleans *)OpnNames(*actual operation names *)VecFor String(* element to vector *)TypeVecOpsIs Nat,Vec(* vector operations *)Opns(*operations for vectors *)+ 、、、 * 、 /:Vec,Vec> Vec(* vector-vector add/sub/mul/div *)+ 、、、 * 、 /:实数,Vec> Vec(* scalar-vector add/sub/mul/div*)Mag,SumSquares:Vec> Real(* magnitude/sum of squares *)TypePathIs ListOps(* path as vector list *)ActualizedByVec,BooleanUsing(* use actual types *)SortNames(* 实际排序名称 *)VecFor Element(* vector as element type *)String的路径(* path sort name *)BoolFor FBool(* use actual booleans *)OpnNames(*actual operation names *)PathFor String(* element to path *)状态只是一个类似记录的结构,包含前面给出的属性。然后定义状态列表和更新状态的操作。NoState被引入作为未定义的状态。对任何参数的引用包括为问题变量生成的任何规格参数(如质量或直径)对任何更新的引用包括问题定义的更新过程。类型状态为Nat,Kind,Real,Vec,Path(* body state *)SortState(* sort name for state *)Opns(* operations for state *)状态:自然,种类,真实,真实,(* id/种类/等级/大小 *)矢量,路径>状态(* 位置/速度/航向/路径 *)ID:状态>自然(* 标识符 *)Kind:State> Kind(* kind *)率:状态>真实(* 评级 *)Size:State> Real(* size *)特纳122||位置、速度、航向:状态>矢量(* 位置/速度/航向 *)路径:状态>路径(* 路径 *)NoState:>State(* undefined state *)等式, Ne:State,State> Bool(*(in)equality for states *)TypeStatesIs ListOps(*states as state list *)ActualizedByState,BooleanUsing(* use actual types *)SortNames(* actual sort names*)StateFor Element(* state as element type *)StatesFor String(* state list sort name *)BoolFor FBool(* use actual booleans *)OpnNames(* actualoperation names *)StatesFor String(* element to state list *)TypeStatesOpsIs BoolOps,VecOps(* state list operations *)Opns(* operations for state list*)StateUpdate:State,States> States(* modify state for body *)任何参数(* parameters/constants *)任何更新(* 更新过程 *)总体规范行为是与步骤控制过程同步的主体过程的规范行为。所有的身体都通过以太之门广播他们的状态。每个主体也可以通过控制门与步进控制单独通信。这用于在启动时为每个主体分配一个唯一的标识符。行为(* 总体行为 *)隐藏Ether,ControlIn(* communication internal*)Bodies [Ether,Control](* bodies *)(* synchronised with*)步骤[Ether,Control](* 开始并运行模拟 *)(0of Nat,0ofNat,0of Nat,0of Real)其中(* 附属定义 *)使用问题定义的任何物体初始化物体。这将为每个实体并行实例化Body过程。参数是前面给出的实体在少数需要它的问题变体中,任何主体也包括用于整体主体控制的任何控制处理实体[Ether,Control]:NoExit:(* 初始创建实体 *)任何尸体最初,主体通过与步骤控制过程同步来声明唯一标识符物体通常在初始化时不知道其他物体的状态,但如果物体是在模拟过程中动态创建的,则会 向 其 提 供 此 信 息 。 在 这 种 情 况 下 , 物 体 立 即 进 入 其 更 新 阶 段BodyUpdate,否则进入其等待阶段BodyWait。在等待阶段,一个实体被以太事件触发,计算并广播它的新状态。活动实体的数量在此事件中提供给所有实体,尽管在大多数问题变体中不使用此信息。如果一个物体在模拟过程中变得不活跃(例如,“生命游戏”中的一个细胞特纳123设置为“无”。因此,它没有要更新的状态,并保持在等待阶段。通常,主体处于活动状态并进入更新阶段。在等待的过程中,一个身体可以通过以太门了解其他身体的状态可以通过广播其新状态来激活非活动在更新阶段,身体可以广播自己的状态,然后返回等待。它还可以在另一个主体的状态广播挂起时学习其状态。过程主体[Ether,Control](* 设置主体id,状态 *)(kind:种类,速率,大小:真实,位置,速度,头部:向量,路径:路径,状态:状态):无出口:控制?id:Nat;(* get unique body id *)(Letstate:State =(* set initial state *)State(id,kind,rate,size,pos,vel,head,path)In([国家Ne<>]>(* 其他国家知道?* )BodyUpdate [Ether](state,states)(* start bodystates *)(* 或 *)[states Eq<>]>(* other statesunknown *)BodyWait [Ether](state,states)(*start body with states *)))进程BodyWait [Ether](* body waiting phase *)(state:State,states:States):NoExit:以太?active:Nat;(* 获取更新请求 *)([Kind(state)Ne None]>(*bodyactive?* )BodyUpdate [Ether](* broadcast new state *)(StateNext(state,states),states)(* 或 *)[Kind(状态)Eq无]>(* 身体不活动?* )BodyWait [Ether](state,states)(* 不广播状态 *))(* 或 *)以太?new state:State;(* learn body state *)([Id(new state)Ne Id(state)]>(*forotherbody?* )BodyWait [Ether](* repeat with other(* 或 *)[Id(new state)Eq Id(state)]>(* for samebody?* )BodyWait [Ether](new state,states)(*repeat,own new state *))特纳124||||ProcessBodyUpdate [Ether] ( * body updating phase * ) ( state :State,states:States):NoExit:乙醚!state;(* broadcast own new state *)BodyWait [Ether](state,states)(* wait for new updates request *)(* 或 *)以太?new state:State;(* learn other body state *)BodyUpdate[Ether] ( * repeat with own new state * ) ( state , StateUpdate(new state,states))“步骤”过程由活动实体的数量、下一个新实体标识符、模拟循环的计数和模拟时间进行参数化除非模拟尚未达到循环限制(定义为规范参数),否则步骤可以根据控制门的请求分配主体标识符如果有一个或多个活动体,Step可以使用EtherGate中的事件触发它们更新状态。TOPO注释(*C.* )用于调用用C编写的代码在这里,调用函数draw sync,使用过程参数4(time)在图形显示上绘制所有实体步骤过程也可以通过以太门广播被这种特殊情况只有在重新启用不活动的机构或动态创建新机构时才会出现。此事件之后的C注释将主体状态(事件参数1)传递给绘制状态函数。当调用drawsync时,StepUpdate进程接受更新的主体状态的广播,调用draw state来记录这一点。如果新实体类型为“无”(因为它已变为非活动),则活动实体的计数将减少。通常情况下,活动实体的数量保持不变,StepUpdate会增加它所看到的实体的数量。如果需要更多的主体更新,StepUpdate会重复其行为。收到所有更新后,行为恢复到主步骤过程。工艺步骤[乙醚,对照](* 运行模拟步骤 *)(活动,下一次,周期:自然,时间:实时):无退出:[cycles Le Limit]>(*cyclesleft?* )(控制!nextid;(* give new body id *)步骤[Ether,Control](* repeat with new active,id *)(active + 1,nextid + 1,cycles,time)(* 或 *)[nextid Gt 0]>( * 至 少 有 一 具 尸体?* )乙醚!活性(* issue updates request and drawbody *)(* C draw sync($4);*);StepUpdate [Ether , Control] ( * allow state updates * )(0Of Nat,active,nextid,cycles,time)(* 或*)以太?state:State(* note re-activated/new body state*)((* |C绘制状态($!1);|* );特纳125−(让活动:Nat =(* 如果重新激活则递增 *)If(active Ltnextid,active + 1,active)In步骤[乙醚,对照](* 使用新活性药物重复 *)(活性药物,下一次,循环,时间)))(* 或 *)[cycles Gt Limit]>(* 是否达到循环限制?* )的文件停止(* 完成模拟 *)ProcessStepUpdate [Ether,Control](* allow state updates *)(count,active,nextid,cycles:Nat,time:Real):NoExit:以太?state:State(* note new body state*)(* |C绘制状态($!1);|* );Let(* modify active and count *)1)如果(状态)是空的,则为空;如果(状态)是空的,则为空;如果(状态)是空的,则为空。[count Lt active]>(* 是否有更多待更新的实体?* )StepUpdate [Ether,Control](* repeat updates*)(count,active,nextid,cycles,time)(* 或 *)[count Eq active]>(* 所有身体更新?* )步骤[乙醚,对照](* 重复步骤 *)(活性,下一次,循环+1,时间+滴答)))EndSpec(* AnyBody *)3仿真支撑图3显示了工具之间的总体信息流。可以使用标准模拟器,例如TOPO的LOLA(LOTOS实验室)模拟器或CADP模拟器执行LOTOS这可以手动完成,或者一步一步地,或者根据某些标准(如搜索深度)自动完成。然而,目标是自动运行模拟。因此,TOPO LOTOS-to-C编译器用于生成完全可执行的代码。编译后的LOTOS由naturals和reals的实现以及图形显示的接口补充。该方法基本上是独立于平台的。然而,图形显示必然会有所不同,因为它取决于支持系统。在作者的环境中实体是使用被广泛支持的图形绘制的。通常,每个动画帧都被发送到屏幕上,但绘图功能也可以将每个帧转移到文件中。这可以特纳126分析编译运行时C库预处理问题描述Lotos规范Lotos框架图三.工具集支持使用公共领域的pstogif和pstogif工具转换为动画GIF(图形交换格式)文件。在2.2节中的规范框架需要被实例化用于各种各样的问题变体。为了方便起见,框架被保存为单个模板,在这种情况下使用宏处理器m4 [10]填充这允许一个规范框架用于所有变体。由于目标是图形模拟,因此最好以图形方式输入物体的初始构型。这是相当可行的,但尚未做到。m4的一般特性(例如为宏定义)也可以在问题描述中使用。例如,n-body宏库包括用于随机整数和实数的randint和randreal预定义了少量的宏:body(body属性)、control(控制过程)、param(规范参数)、update(更新过程)和vec(向量值)。可以省略body的参数,并默认为敏感值。例如,velocity,heading和path参数不用于“生命游戏”中的单元格各种宏包含有关实体及其属性的信息。最后,update将此信息插入规范框架并生成完整的LOTOS文件。规格参数主要用于控制仿真。各种参数是预定义的,并且如果需要,可以重新定义。这些参数包括限制(模拟步数)、模式(绘制模式)、间隔(动画帧之间的时间)、比例(绘制比例)和记号(模拟时间步)。其他规格参数仅控制实体的绘制方式(例如行星体或粒子的直径)。还可以定义控制规范的参数(例如,传递给布朗运动中的粒子的冲量参数,加上其他数值常数,在任何参数中累积,以包含在最终规范中。LOTOS规范基本上是完整的,可用于其他分析,如验证和确认。唯一的外部支持是数字。虽然这数字的实现使用了一个描述如何实现数据的GLAD文件。虽然GLAD注释可以直接作为LOTOS规范中的特殊注释给出,但这往往会使规范变得混乱。因此提供了一个单独的GLAD文件。作为一个例子,在线动画离线动画制作可执行其他分析特纳127||{||||||||||||||||||||||||下面是实数实现的一个片段:Specification(* Real *)=>(* reals的实现 *)(*ldc#include各样Real=>(*basicfunctionsforreals*)(*extern*)(*draw Real Draw *)(*equal Real Check*)(*free Real Free *)(*parse Real Parse *);OpnsAny:forall>Real=>(*prefixforfunctionsproducingreals*)(*usingReal *);1 :>Real=>(*constructor *)(*extern*)(*call Real Make(1.0)*);+:Real,Real>Real=>(*实加法的实现*)(*extern*)(*name Add *);int n(* nums);这需要C头文件real. h并初始化reals的排序代码。外部排序必须提供函数来绘制(打印)排序值、检查相等性、释放分配的空间以及解析排序的文本值。为了避免在生成的C中出现前置函数名的冲突,using杂注可以用来为C函数定义一个前缀(这里的Real表示任何产生实数的操作)。常量1通过调用函数Real Make实现,参数为1.0。实数加法调用函数Real Add。这些函数是用标准C语言定义的(有一些额外的宏定义和标准库)。例如,两个实数(类型为udatum- user datum)的加法通过以下方式udatum Real Add(udatum r1,udatum r2)/* 添加实数r1和r2 */udatum r;/* result isr */SETREAL(r);/* 为r分配空间 */ REAL(r)= REAL(r1)+REAL(r2);/* 执行加法 */ FREEREAL(r1); FREEREAL(r2); /* 释放r1和r2的空间 */返回r;/* 返回结果 */}4特别的问题第二节给出了模拟多体问题及其变体的总体策略以下注释解释了在每种情况下如何安装规范框架一个非正式的,而不是LOTOS的解释。第五节和第六节详细介绍了n体运动和布朗运动的应用.N体问题:只有一种物体,质量.质量初始化为质量、直径、位置和速度。为了更新质量m的状态,计算其到每个其他质量mi的距离d的特纳128D2作用在质量上的引力则由Gmmi给出,其中G是引力常数力是指向另一质量的矢量.所有质量的力矢量相加并除以质量m。这给出了由于万有引力引起的瞬时加速度作为矢量。仿真时间步长使用加速度来确定新的物质的运动方式往往非常复杂。太阳系仪:太阳系仪是太阳系的模拟。这只是一个n体问题,对于内行星作为天体(原则上,对于所有行星、小行星和微行星)具有特定的值。这些天体的初始值包括相关的质量、直径、与太阳的距离和轨道速度。实体类型在绘制期间生成标签。太空游戏:这个例子的灵感来自于一个早期的电脑游戏。这与n体问题非常相似.有两颗恒星,由于它们相对较大的质量和距离,被认为是固定的。在最初的游戏中,有两艘太空船由用户控制。然而,由于LO-TOS模型是封闭的,用户控制的效果是通过每艘太空船的速度和航向的战略变化来模拟的。每艘宇宙飞船也可以随机发射一枚导弹;这是一个相对于宇宙飞船航向的固定速度宇宙飞船和导弹是由恒星的万有引力控制的,就像在n体问题中一样。如果一个物体与另一个物体碰撞,模拟停止,剩下的宇宙飞船获胜(除非它与另一艘宇宙飞船碰撞)。钟摆:只有一种物体,一种重量,也只有一种。矢量是一维的,因为只有一个自由度。摆锤的特征在于其偏离垂直的角度θ和角速度ω。摆锤初始化为质量、悬挂长度和初始角度;初始速度为零。对于质量m和重力加速度g,重物上的切向力为mgsinθ。这给出了瞬时加速度作为幅值为gsinθ的矢量。仿真使用此值来确定新的角位置和速度。摆锤因此移动,并且实际上无限地振荡,因为系统被假设为无损耗的。牛顿许多球被V形线悬挂,使它们能够在一个平面内摆动。当末端的球与其相邻的球碰撞时,它会停止,但其动量会传递。在模拟中,最初移动的球的速度会传递给其相邻的球。然后,这被认为是与下一个球碰撞,依此类推。最后,最外面的球以这个速度沿弧线发射。该规范正确地描述了其他情况,如每边有几个球在运动。布朗运动:在这个例子中,有一种物体,粒子的多个实例。这些都是初始化的值,其直径和位置;速度最初为零。由于重力的影响被认为是可以忽略的,所以忽略了粒子的重量状态更新过程简单地添加特纳129粒子速度的随机量,模拟与流体分子碰撞的效果质点运动受粘性阻力的影响随着时间的推移,每个粒子都遵循随机行走。气体运动:类似于布朗运动。有气体分子被限制在一个盒子里。阻力不相关。如果一个分子与另一个分子碰撞,或者与盒子的边缘碰撞,它会弹性地弹开。生命游戏这个细胞自动机的例子是由J。H. 康威只有一种身体,细胞。它的初始化宽度(仅用于绘图目的)和二维网格上的固定位置。仅对occu-occupied单元进行建模(因为总体空间通常是稀疏的)。为了更新小区的状态,检查其正交和对角邻居的占用率。一个没有或只有一个邻居的被占用的细胞被认为是死于孤独;它变成了空的。两个或三个相邻的被占用的单元格仍然被占用。一间牢房中有三个以上的邻居,被认为是因过度拥挤而死亡一个有三个邻居的空单元诞生(被占用);在所有其他情况下,它仍然是空的。从被占据的细胞的初始构型开始,细胞以复杂的模式出生或死亡。行为可能会达到一个不进化的静态,可能会进入一个重复的循环,或者可能会无限地进化。空中交通:在撰写本文时,这个问题变体已经设计好,但尚未实现。该系统中的两种物体是飞机和航路点(用于定义飞机路径的三维空间中的固定点在实践中,风(如喷流)是飞行中的一个重要因素,但在模型中被忽略了一架飞机初始化为它的最大速度、长度(仅
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功