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

<details>

<summary>关键词</summary>

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

</details>

{% embed url="https://viadean.notion.site/Python-C-61d85e911dfa46d0a36a3ecc12d8af3b" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

### 🎯要点

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可视化电场示例

让我们回忆一下库仑定律：来自位于 $$r_0$$ 处的单个点电荷 $$q_0$$ 的位于 P 点（位置 r）的测试电荷 Q 上的力由下式给出：\
$$\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 /\left(4 \pi \epsilon_{0}\right)$$SI 单位（$$\epsilon_{0}$$ 是自由空间的介电常数）。 力与两个电荷的乘积成正比，与两个电荷之间的距离的平方成反比，并沿着从电荷 $$q_0$$到电荷 Q 的线点。电场就是力$$F_0$$ 与电荷 Q 的比值。 测试电荷 Q 在测试电荷的大小变为零的极限。 在实践中，这给了我们：\
$$\mathbf{E}*{0}(\mathbf{r})=k q*{0} \frac{\mathbf{r}-\mathbf{r}*{0}}{\left|\mathbf{r}-\mathbf{r}*{0}\right|^{3}}$$

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

如果我们面临多个点电荷，我们可以应用叠加原理：Q 上的合力由作用在 Q 上的各个力的矢量和组成。 因此，如果我们处理 n 点电荷$$q_{0}, q_{1}, \ldots, q_{n-1}$$分别位于 $$\mathbf{r}*{0}$$, $$\mathbf{r}*{1}$$, $$\ldots, \mathbf{r}_{n-1}$$ 处，则情况如图所示。 为了便于查看，我们的图形是二维的，但形式主义同样适用于三个维度。 位置 r 处的总电场为：\
\
$$\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}}$$

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

### 绘制场线

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

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

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

```python
 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）。我们还需要某种方式来存储点电荷所在的 $$r_i$$。我们选择将这些存储在字典中，该字典从电荷 $$q_i$$映射到位置$$r_i$$。

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