🍍Python和C++计算物理光学波形化学结构数学方程

关键词

Python | C++ | 数值计算 | 物理学 | 化学 | 数学 | 光学 | 行星 | 波形 | 方程 | 分子结构 | 线性 | 非线性 | 方程组 | 氢原子 | 水分子 | 球谐函数 | 排序 | 索引 | 序列 | 算法 | 二分法 | 错误方法的规则 | 连续近似法 | 牛顿-拉夫逊法 | 割线法 | 伯奇-维塔法 | 多维函数系统 | 雅可比行列式 | 牛顿法 | 哈雷彗星 | 偏心角度值 | 光谱能量密度 | 绘图 | 图示可视化 | 多项式 | 矩阵 | 分解 | 弹性振动 | 频率 | 位移 | 惯性张量 | 主惯性矩 | 环苯分子 | 特征值 | 特征向量 | 飞机偏航 | 飞机翻滚 | 蒙特卡罗方法 | 常微分方程 | 偏微分方程 | 建模

🏈page指点迷津 | Brief

🎯要点

  1. Python | C++代码化排序索引​和计算​:🎯冒泡排序,升序排序,快速排序,索引排序,基于索引数组的排名,基于直接插入的两个键索引,两个相关数组的索引。🎯数学计算1:数据集升序排列后,生成索引和排名​。🎯数学计算2:一定量序列排序后,生成得新索引表,并绘制原始序列。🎯计算3:一定量序列进行冒泡排序,插入排序,快速排序,绘制一张图显示三种排序依赖性,分别定性评估小型和广泛序列的排序算法的性能。

  2. Python | C++代码化霍纳法评估多项式和计算:🎯幂级数展开的指数,连分数正切函数,递归关系的正交多项式,球谐函数 - 相关勒让德函数,球面贝塞尔函数。🎯数学计算1:计算多项式一阶导数的系数,绘制五次勒让德多项式;🎯数学计算2:使用幂级数展开计算函数正弦和反正弦。🎯数学计算3:使用连分数计算指数函数。🎯物理计算4:计算球谐得范数平方并绘制极坐标图。🎯物理计算5:计算给定阶和角度得所有球谐函数和相同阶勒让德多项式之积。🎯物理计算6:球形电磁波的传播由标量亥姆霍兹方程描述,该方程在球坐标中分离变量后,可得出径向方程,其解为圆柱贝塞尔函数和诺依曼函数,计算该函数解并绘图。🎯物理计算7:氢原子波相关勒让德函数,绘制径向概率密度。

  3. Python | C++代码化代数方程和计算:🎯求解真值根:二分法,错误方法的规则,连续近似法,牛顿-拉夫逊法,割线法,伯奇-维塔法,多维函数系统的雅可比行列式,非线性方程组的牛顿法。🎯数学计算1:使用二分法求解指定多项式。🎯数学计算2:使用二分法和割线法返回多项式收敛迭代次数。🎯物理计算3:使用开普勒方程,求解哈雷彗星偏心异常角度值并绘图,使用牛顿法求解整个旋转周期的偏心异常角度值。🎯物理计算4:夫琅和费衍射强度分布,绘制分布图:强度分方程及其第一导数方程,使用割线法和初始近似值求解主衍射最大值半宽,使用错误方法得规则,求解给定范围内强度最大值。🎯物理计算5:普朗克定律表示热平衡状态下黑体发射的电磁辐射的光谱能量密度,绘制光谱能量密度图,求解光谱能量密度的导数的最大值。🎯物理计算6:对给定的圆与抛物线方程,使用雅可比和牛顿法求其交点。🎯数学计算7:求解给定三元非线性方程组。

  4. Python | C++ 代码化线性方程组和计算:🎯求解矩阵方程:部分旋转的高斯消元法,部分旋转高斯-乔丹消元法,部分旋转和矩阵求逆的高斯-约尔消元法,完整旋转高斯-乔丹消元法,使用杜立特法对矩阵 LU 分解,使用 LU 分解的矩阵求逆,三角矩阵求逆,对称正定矩阵的 Cholesky 分解求解,使用 Cholesky 分解的正定矩阵求逆,求解三对角矩阵的线性系统,高斯-赛德尔法求解线性方程组。🎯数学计算1:使用高斯-乔丹消元解矩阵方程。🎯数学计算2:使用LU 因式分解给定方程组。🎯数学计算3:使用LU 因式分解求解三对角矩阵。🎯数学计算4:使用高斯-乔丹消元解非奇异矩阵,检查恒等式。🎯数学计算5:计算矩阵恒等式,并随机生成二维矩阵以及求逆。🎯数学计算6:使用 Cholesky 分解计算对称正定矩阵的逆,生成随机二维下三角矩阵,生成正定矩阵。🎯物理计算7:求逆多贝希斯 D4 小波变换。

  5. Python | C++代码化特征值和计算:🎯数学计算1:使用函数 Jacobi 证明随机可逆对称矩阵。🎯物理计算2:无质量的弹性振动弦正常振动模式下的频率和位移。🎯化学计算3:从四方甲烷分子各个坐标中减去质心坐标,将分子置于其质心系统中,计算笛卡尔坐标下质心系统中分子的惯性张量,求解惯性张量的特征值,使用转置变换矩阵将原子坐标旋转到主轴系,可视化坐标结果。🎯物理计算4:从飞机各个坐标中减去质心坐标,将其放置在质心系统中,计算飞机在笛卡尔质心系统中的惯性张量,从惯性张量的特征值确定主惯性矩,使用转置变换矩阵将飞机坐标旋转到主轴系,分别对飞机施加给定角度的“偏航”和“滚转”,可视化其结果。🎯化学计算5:在 Hückel 理论框架下,找到环苯分子的特征能和特征向量。🎯化学计算6:基于水分子电子结构的密度泛函理论计算,对水分子的鲁坦方程求解泛化特征值。

  6. Python | C++ 代码化列表函数的建模,蒙特卡罗方法,常微分和偏微分方程。

🍇Python可视化电场示例

让我们回忆一下库仑定律:来自位于 r0r_0 处的单个点电荷 q0q_0 的位于 P 点(位置 r)的测试电荷 Q 上的力由下式给出: F0=kq0Q(rr0)2rr0rr0\mathbf{F}*{0}=k \frac{q*{0} Q}{\left(\mathbf{r}-\mathbf{r}*{0}\right)^{2}} \frac{\mathbf{r}-\mathbf{r}*{0}}{\left|\mathbf{r}-\mathbf{r}_{0}\right|}

其中库仑常数是 k=1/(4πϵ0)k=1 /\left(4 \pi \epsilon_{0}\right) SI 单位(ϵ0\epsilon_{0} 是自由空间的介电常数)。 力与两个电荷的乘积成正比,与两个电荷之间的距离的平方成反比,并沿着从电荷 q0q_0 到电荷 Q 的线点。电场就是力F0 F_0 与电荷 Q 的比值。 测试电荷 Q 在测试电荷的大小变为零的极限。 在实践中,这给了我们: E0(r)=kq0rr0rr03\mathbf{E}*{0}(\mathbf{r})=k q*{0} \frac{\mathbf{r}-\mathbf{r}*{0}}{\left|\mathbf{r}-\mathbf{r}*{0}\right|^{3}}

在那里我们取消了 Q,并借此机会合并了两个分母。 这是由r0 r_0 处的点电荷 q0q_0 引起的 r 位置处的电场。

如果我们面临多个点电荷,我们可以应用叠加原理:Q 上的合力由作用在 Q 上的各个力的矢量和组成。 因此,如果我们处理 n 点电荷q0,q1,,qn1 q_{0}, q_{1}, \ldots, q_{n-1} 分别位于 r0\mathbf{r}*{0}, r1\mathbf{r}*{1}, ,rn1\ldots, \mathbf{r}_{n-1} 处,则情况如图所示。 为了便于查看,我们的图形是二维的,但形式主义同样适用于三个维度。 位置 r 处的总电场为: E(r)=i=0n1Ei(r)=i=0n1kqirrirri3\mathbf{E}(\mathbf{r})=\sum_{i=0}^{n-1} \mathbf{E}*{i}(\mathbf{r})=\sum*{i=0}^{n-1} k q_{i} \frac{\mathbf{r}-\mathbf{r}*{i}}{\left|\mathbf{r}-\mathbf{r}*{i}\right|^{3}}

即,单个电场贡献的总和,Ei(r)\mathbf{E}_{i}(\mathbf{r})。 请注意,您可以考虑空间中任何一点的总电场 r。 另请注意,电场是一个矢量:在空间中的任何点,该 E 都有大小和方向。 可视化矢量场的一种方法包括绘制场线,即帮助我们跟踪场方向的假想曲线。 更具体地说,给定点的场线的切线为我们提供了该点的电场方向。 场线不交叉; 它们以正电荷(“源”)开始,以负电荷(“汇”)结束。

绘制场线

我们将在 Python 中绘制电场线; 虽然存在更复杂的向量场可视化方法(例如,线积分卷积),但我们在下面描述的内容应该足以让您对事物有定性的感觉。 虽然绘图函数(甚至库)的变化往往比编程基础设施的其他方面快得多,但无论具体实现是什么样子,所讨论的原则都适用。

我们面临两个任务:首先,我们需要根据方程式(3)在电荷附近的几个点产生电场(矢量),其次,我们需要以这样一种方式绘制场线,以便我们可以从物理上解释正在发生的事情。 和前面的代码一样,我们为每个任务创建一个 Python 函数。 为简单起见,我们从一个只有两个点电荷(大小相等,符号相反)的问题开始。 此外,我们将自己限制在两个维度上(笛卡尔坐标 x 和 y)。

代码 1.3 是一个 Python 实现,其中为了简单起见,库仑常数被分开。 我们首先导入 numpy 和 matplotlib,因为繁重的工作将由函数 streamplot() 完成,该函数需要 NumPy 数组作为输入。 我们还导入了平方根和 deepcopy() 函数,它们可以创建一个不同的列表列表。

 import numpy as np
 import matplotlib.pyplot as plt
 from math import sqrt
 from copy import deepcopy
 def makefield(xs, ys):
     qtopos = {1: (-1,0), -1: (1,0)}
     n = len(xs)
     Exs = [[0. for k in range(n)] for j in range(n)]
     Eys = deepcopy(Exs)
     for j,x in enumerate(xs):
         for k,y in enumerate(ys):
             for q,pos in qtopos.items():
                 posx, posy = pos
                 R = sqrt((x - posx)**2 + (y - posy)**2)
                 Exs[k][j] += q*(x - posx)/R**3
                 Eys[k][j] += q*(y - posy)/R**3
     return Exs, Eys
 def plotfield(boxl,n):
     xs = [-boxl + i*2*boxl/(n-1) for i in range(n)]
     ys = xs[:]
     Exs, Eys = makefield(xs, ys)
     xs=np.array(xs); ys=np.array(ys)
     Exs=np.array(Exs); Eys=np.array(Eys)
     plt.streamplot(xs, ys, Exs, Eys, density=1.5, color=‘m’)
     plt.xlabel(‘$x$’)
     plt.ylabel(‘$y$’)
     plt.show()
 plotfield(2.,20)

函数 makefield() 接受两个列表 xs 和 ys,对应于我们希望评估电场的坐标(x 和 y 一起构成 r)。我们还需要某种方式来存储点电荷所在的 rir_i。我们选择将这些存储在字典中,该字典从电荷 qiq_i 映射到位置ri r_i

对于每个位置 r,我们需要评估E(r) \mathbf{E}(\mathbf{r}):在二维中,它由 Ex(r)E_{x}(\mathbf{r}) Ey(r)E_{y}(\mathbf{r}) 组成,即总电场的两个笛卡尔分量。目前只关注其中一个,比如 Ex(r)E_{x}(\mathbf{r}),我们意识到我们需要为任何可能的 r 存储它的值,即对于任何可能的 x 和 y 值。我们决定使用由嵌套列表推导式生成的列表列表。然后我们为 Ey(r)E_{y}(\mathbf{r}) 创建另一个列表列表。

我们需要绘制(即存储)总电场的 x 和 y 分量的值,在所有所需的值向量 r,即在由 xs 和 ys 组成的二维网格上。这需要计算给定 x 的所有可能 y 处的电场(来自给定点电荷 q_i 的贡献),然后迭代所有可能的 x。我们还需要迭代我们的点电荷 q_i 和它们的位置 r_i​。我们通过在 qtopos.items() 中 for q, pos in qtopos.items() 来做到这一点:此时我们将 pos 解包为 posx 和 posy。

Last updated