如何计算四个原子的二面角
首先給出Python實例,三行代碼解決二面角問題:
給定四個原子坐標,就可以返回二面角的數(shù)值。
import numpy as np import mathdef calculate_dihedral_angle(A, B, C, D):# such as# A = [1.0, 2.9, 0.0]# B = [1.1, 0.5, 1. ]# and so ona, b, c = B-A, C-B, D-Cn1, n2 = np.cross(a, b), np.cross(b, c)return math.acos(np.dot(n1, n2)/(np.linalg.norm(n1)*np.linalg.norm(n2))) * 180 / math.pi其中A,B,C,D是以列表形式給出的直角坐標 (例如:?A = [x, y, z] )
1. 給出4個原子的坐標A、B、C、D(應(yīng)該是笛卡爾坐標,內(nèi)坐標的話也就不需要算了)
2. 注意4個原子的順序(這涉及到二面角的大小,正負,可以參考各種分子可視化軟件的選擇二面角方法)
3. 求三個向量a = B-A, b = C-B, c = D-C(這一步需要注意減法的順序,因為這決定了向量的方向,從而決定了平面法向量的方向)
4. 使用數(shù)學(xué)上向量的方法叉乘,n1=a×b,n2=b×c;(注意順序,決定了法向量的方向,方向錯了二面角會錯)
5. 得出的兩個法向量用余弦定理求角度 θ = arccos(n1·n2)/(|n1|*|n2|)
6. 由于之前我們嚴格定義了各種矢量的方向,所以得出的即四個原子的二面角(寫程序的時候注意弧度與角度之間的轉(zhuǎn)化)
數(shù)學(xué)原理:
叉乘會根據(jù)給定的兩個向量的方向和大小給出法向方向的向量(方向:右手定則)
A,B,C 就對應(yīng)著AB,BC兩個向量,叉乘給出的法向量方向是唯一的,而根據(jù)平面法向量和平面上的向量相互正交的性質(zhì)列方程解方程組得到的法向量是有正負兩個方向的(因為正負兩個方向都滿足正交的條件,算二面角的時候就會出現(xiàn)問題)
同理,B,C,D也會給出一個唯一方向的法向量,兩個法向量之間會有(0,180°)的夾角,算出的cosθ=(n1·n2)/(|n1|*|n2|)也會有正負的分別,但根據(jù)余弦圖像可得,每一個值都對應(yīng)著一個在(0,180°)內(nèi)確定的角度。
總結(jié)
以上是生活随笔為你收集整理的如何计算四个原子的二面角的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html邮箱地址的正则表达式,javas
- 下一篇: Java自动化测试系列[v1.0.1][