Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 氯化钠晶体_Python_Numpy_Physics_Vpython - Fatal编程技术网

Python 氯化钠晶体

Python 氯化钠晶体,python,numpy,physics,vpython,Python,Numpy,Physics,Vpython,我试着做这个练习: 氯化钠晶体的钠和氯原子排列在立方体上 但原子在钠和氯之间交替,所以每一个钠 被六个氯包围,每个氯被六个钠包围。 使用两种不同的颜色创建氯化钠晶格的可视化 表示两种类型的原子 我的代码是: from vpython import * from numpy import * L = 5 R = 0.5 for i in range(-L,L,2): for j in range(-L,L,2): for k in range(-L,L,2):

我试着做这个练习:

氯化钠晶体的钠和氯原子排列在立方体上 但原子在钠和氯之间交替,所以每一个钠 被六个氯包围,每个氯被六个钠包围。 使用两种不同的颜色创建氯化钠晶格的可视化 表示两种类型的原子

我的代码是:

from vpython import *
from numpy import *

L = 5
R = 0.5
for i in range(-L,L,2):
    for j in range(-L,L,2):
        for k in range(-L,L,2):
            sphere(pos=vector(i,j,k),radius = R, color = vec(0,1,1))

for l in range(-L+1,L+1,2):
    for m in range(-L+1,L+1,2):
        for n in range(-L+1,L+1,2):
            sphere(pos=vector(l,m,n),radius = R, color = vec(1,1,0))
但我得到这个数字:


从这个角度看,这是不正确的,因为有相同颜色的列。我做错了什么?

首先,提供的代码没有生成具有预期方向的氯化钠排列良好的晶格

考虑每个输出的前几个数字

>>> for i in range(-L,L,2):
...     for j in range(-L,L,2):
...         for k in range(-L,L,2):size = 5
...             print(i, j, k)
... 
-5 -5 -5
-5 -5 -3
-5 -5 -1
...
>>> for l in range(-L+1,L+1,2):
...     for m in range(-L+1,L+1,2):
...         for n in range(-L+1,L+1,2):
...             print(l, m, n)
... 
-4 -4 -4
-4 -4 -2
-4 -4 0
...
如果前一个球体将后一个球体偏移一个单位,则每个球体将有10个相邻球体,而不是6个相邻球体。这就解释了为什么球体被渲染得相距很远,而且每个球体似乎都有10个邻居,因此所尝试的并不是紧密堆积的立方晶格,而是全部展开。实际上,您所做的错误是在您确实不应该的情况下对晶格应用偏移,在球体之间引入间隙,使其在视觉上看起来不清晰

为了正确地执行此操作,请缓慢地执行此操作,每次执行一步,迭代该层的每个单元,并一次性渲染球体。让我们先从二维棋盘模式开始

请考虑以下内容:

from vpython import *
from numpy import *

size = 5
radius = 0.5
# predefine the colours
elements = [
    vec(0, 1, 1),
    vec(1, 1, 0),
]

z = 0  # pin z to just a single layer 
for y in range(-size, size):
    for x in range(-size, size):
        sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y) % 2])
通过简单地加上x和y来计算颜色,然后取结果的模2来确定使用哪种颜色,因为奇数和偶数之和将产生奇数,否则它们是偶数,渲染出来的这个数学特性将有我们的第一层。这里是StackOverflow

事实证明,此属性也适用于Z层

for z in range(-size, size):
    for y in range(-size, size):
        for x in range(-size, size):
            sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y + z) % 2])
这将产生你所期望的结果。现在,如果要同时修改radius参数和颜色,可能需要将元素指定为两个字典,可以通过以下方式传入:

这将模拟旋转的视图,以便更清楚地显示结果


首先,所提供的代码没有生成具有预期取向的氯化钠的良好排列晶格

考虑每个输出的前几个数字

>>> for i in range(-L,L,2):
...     for j in range(-L,L,2):
...         for k in range(-L,L,2):size = 5
...             print(i, j, k)
... 
-5 -5 -5
-5 -5 -3
-5 -5 -1
...
>>> for l in range(-L+1,L+1,2):
...     for m in range(-L+1,L+1,2):
...         for n in range(-L+1,L+1,2):
...             print(l, m, n)
... 
-4 -4 -4
-4 -4 -2
-4 -4 0
...
如果前一个球体将后一个球体偏移一个单位,则每个球体将有10个相邻球体,而不是6个相邻球体。这就解释了为什么球体被渲染得相距很远,而且每个球体似乎都有10个邻居,因此所尝试的并不是紧密堆积的立方晶格,而是全部展开。实际上,您所做的错误是在您确实不应该的情况下对晶格应用偏移,在球体之间引入间隙,使其在视觉上看起来不清晰

为了正确地执行此操作,请缓慢地执行此操作,每次执行一步,迭代该层的每个单元,并一次性渲染球体。让我们先从二维棋盘模式开始

请考虑以下内容:

from vpython import *
from numpy import *

size = 5
radius = 0.5
# predefine the colours
elements = [
    vec(0, 1, 1),
    vec(1, 1, 0),
]

z = 0  # pin z to just a single layer 
for y in range(-size, size):
    for x in range(-size, size):
        sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y) % 2])
通过简单地加上x和y来计算颜色,然后取结果的模2来确定使用哪种颜色,因为奇数和偶数之和将产生奇数,否则它们是偶数,渲染出来的这个数学特性将有我们的第一层。这里是StackOverflow

事实证明,此属性也适用于Z层

for z in range(-size, size):
    for y in range(-size, size):
        for x in range(-size, size):
            sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y + z) % 2])
这将产生你所期望的结果。现在,如果要同时修改radius参数和颜色,可能需要将元素指定为两个字典,可以通过以下方式传入:

这将模拟旋转的视图,以便更清楚地显示结果