• 自洽可分的哈密顿系统的辛算法


    • 本文只介绍哈密顿系统的辛算法的显式结构
      • 不给出具体的推导过程

    自洽可分的哈密顿系统的辛算法

    • 一阶显式辛结构

    \begin{matrix} q^{n+1}=q^n+\tau U_p(p^n) \\ p^{n+1}=p^n-\tau V_q(q^{n+1}) \end{matrix}

    • 二阶显式辛结构

    \begin{matrix} x=q^n\\ y=p^n-\frac{\tau}{2}V_q(x)\\ q^{n+1}=x+\tau U_q(y)\\ p^{n+1}=y-\frac{\tau}{2}V_q(q^{n+1}) \end{matrix}

    • 四阶显式辛结构

    c_1=0,c_2=(2-2^{1/3})^{-1},c_3=1-2(2-2^{1/3}),c_4=(2-2^{1/3})^{-1}

    d_1=d_4=(2-2^{1/3})^{-1},d_2=d_3=(1-(2-2^{1/3})^{-1})/2

    \begin{matrix} x_1=q^n+c_1\tau U_p(p^n) &y_1 = p^n -d_1V_q(x_1) \\ x_2=x_1+c_2\tau U_p(y_1) & y_2 =y_1-d_2\tau V_q(x_2)\\ x_3 = x_2 + c_3\tau U_p(y_2) &y_3=y_2 -d_3\tau V_q(x_3) \\ q^{n+1}=x_3 +c_4\tau U_p(y_3) &p^{n+1}=y_3-d_4\tau V_q(q^{n+1}) \end{matrix}

    • 全代码
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. from scipy.optimize import fsolve
    4. ##SymplecticHamilton
    5. ##self-consistent
    6. ##separable
    7. class symhamcssolver():
    8. def __init__(self, Up, Vq,
    9. q0=np.array([0]),
    10. p0=np.array([1]),
    11. T_start=0, T_end=20, tau=0.01):
    12. self.Up = Up
    13. self.Vq = Vq
    14. self.tau = tau
    15. self.T = np.arange(T_start, T_end, self.tau)
    16. self.size = len(self.T)
    17. self.q = np.zeros((len(self.T), len(q0)))
    18. self.q[0, :] = q0
    19. self.p = np.zeros((len(self.T), len(p0)))
    20. self.p[0, :] = p0
    21. self.tol = 1e-6
    22. def __str__(self):
    23. return f"Symplectic algrithm of self-consistent and separable Hamilton system"
    24. def E1(self,):
    25. for i in range(1, self.size):
    26. self.q[i, :] = self.q[i-1, :] + self.tau * self.Up(self.p[i-1, :])
    27. self.p[i, :] = self.p[i-1, :] - self.tau * self.Vq(self.q[i, :])
    28. return self.p, self.q
    29. def E2(self,):
    30. for i in range(1, self.size):
    31. x = self.q[i-1, :]
    32. y = self.p[i-1, :] - self.tau/2 * self.Vq(x)
    33. self.q[i, :] = x + self.tau * self.Up(y)
    34. self.p[i, :] = y - self.tau/2 * self.Vq(self.q[i, :])
    35. return self.p, self.q
    36. def E4(self,):
    37. alpha = 1/(2-2**(1/3))
    38. beta = 1 - 2 * alpha
    39. c = np.zeros(5)
    40. d = np.zeros(5)
    41. c[2] = alpha
    42. c[4] = alpha
    43. c[3] = beta
    44. d[1] = alpha/2
    45. d[4] = alpha/2
    46. d[2] = (alpha + beta)/2
    47. d[3] = (alpha + beta)/2
    48. for i in range(1, self.size):
    49. x1 = self.q[i-1, :] + c[1] * self.tau * self.Up(self.p[i-1, :])
    50. y1 = self.p[i-1, :] - d[1] * self.tau * self.Vq(x1)
    51. x2 = x1 + c[2] * self.tau * self.Up(y1)
    52. y2 = y1 - d[2] * self.tau * self.Vq(x2)
    53. x3 = x2 + c[3] * self.tau * self.Up(y2)
    54. y3 = y2 - d[3] * self.tau * self.Vq(x3)
    55. self.q[i, :] = x3 + c[4] * self.tau * self.Up(y3)
    56. self.p[i, :] = y3 - d[4] * self.tau * self.Vq(self.q[i, :])
    57. return self.p, self.q
    58. ## H = p^2/2m + k/2q^2
    59. m = 1
    60. k = 1
    61. Up = lambda p:p[:]/m
    62. Vq = lambda q:k*q[:]
    63. c = symhamcssolver(Up, Vq)
    64. fig = plt.figure(figsize=(12, 4))
    65. ax1 = fig.add_subplot(1,3,1)
    66. ax2 = fig.add_subplot(1,3,2)
    67. ax3 = fig.add_subplot(1,3,3)
    68. p, q = c.E1()
    69. ax1.plot(p, q)
    70. ax1.set_title("E1")
    71. ax1.set_xlabel("q")
    72. ax1.set_ylabel("p", rotation=0)
    73. p, q = c.E2()
    74. ax2.plot(p, q)
    75. ax2.set_title("E2")
    76. ax2.set_xlabel("q")
    77. ax2.set_ylabel("p", rotation=0)
    78. p, q = c.E4()
    79. ax3.plot(p, q)
    80. ax3.set_title("E4")
    81. ax3.set_xlabel("q")
    82. ax3.set_ylabel("p", rotation=0)
    83. plt.pause(0.01)

    • 解示意图 

     

    含时可分哈密顿系统

    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. from scipy.optimize import fsolve
    4. ##SymplecticHamilton
    5. ##self-inconsistent
    6. ##separable
    7. ##
    8. ## \frac{dq}{dt} = U_p(p, t)
    9. ## \frac{dp}{dt} = -V_q(q, t)
    10. ##
    11. class symhamicssolver():
    12. def __init__(self, Up, Vq,
    13. q0=np.array([0]),
    14. p0=np.array([1]),
    15. T_start=0, T_end=20, tau=0.01):
    16. self.Up = Up
    17. self.Vq = Vq
    18. self.tau = tau
    19. self.T = np.arange(T_start, T_end, self.tau)
    20. self.size = len(self.T)
    21. self.q = np.zeros((len(self.T), len(q0)))
    22. self.q[0, :] = q0
    23. self.p = np.zeros((len(self.T), len(p0)))
    24. self.p[0, :] = p0
    25. self.tol = 1e-6
    26. def __str__(self):
    27. return f"Symplectic algrithm of self-inconsistent and separable Hamilton system"
    28. def E1(self,):
    29. for i in range(1, self.size):
    30. self.q[i, :] = self.q[i-1, :] + self.tau * self.Up(self.p[i-1, :], self.T[i-1])
    31. self.p[i, :] = self.p[i-1, :] - self.tau * self.Vq(self.q[i, :] , self.T[i])
    32. return self.p, self.q
    33. def E2(self,):
    34. for i in range(1, self.size):
    35. x = self.q[i-1, :]
    36. y = self.p[i-1, :] - self.tau/2 * self.Vq(x, self.T[i-1])
    37. self.q[i, :] = x + self.tau * self.Up(y, self.T[i-1]+self.tau/2)
    38. self.p[i, :] = y - self.tau/2 * self.Vq(self.q[i, :], self.T[i])
    39. return self.p, self.q
    40. def E4(self,):
    41. alpha = 1/(2-2**(1/3))
    42. beta = 1 - 2 * alpha
    43. c = np.zeros(5)
    44. d = np.zeros(5)
    45. c[2] = alpha
    46. c[4] = alpha
    47. c[3] = beta
    48. d[1] = alpha/2
    49. d[4] = alpha/2
    50. d[2] = (alpha + beta)/2
    51. d[3] = (alpha + beta)/2
    52. for i in range(1, self.size):
    53. x1 = self.q[i-1, :] + c[1] * self.tau * self.Up(self.p[i-1, :], self.T[i])
    54. zeta1 = self.T[i-1] + c[1] * self.tau
    55. y1 = self.p[i-1, :] - d[1] * self.tau * self.Vq(x1, zeta1)
    56. eta1 = self.T[i-1] + d[1] * self.tau
    57. x2 = x1 + c[2] * self.tau * self.Up(y1, eta1)
    58. zeta2 = zeta1 + c[2] * self.tau
    59. y2 = y1 - d[2] * self.tau * self.Vq(x2, zeta2)
    60. eta2 = eta1 + d[2] * self.tau
    61. x3 = x2 + c[3] * self.tau * self.Up(y2, eta2)
    62. zeta3 = zeta2 + c[3] * self.tau
    63. y3 = y2 - d[3] * self.tau * self.Vq(x3, zeta3)
    64. eta3 = eta2 + d[3] * self.tau
    65. self.q[i, :] = x3 + c[4] * self.tau * self.Up(y3, eta3)
    66. self.p[i, :] = y3 - d[4] * self.tau * self.Vq(self.q[i, :], self.T[i])
    67. return self.p, self.q
    68. ## H = p^2/2m + k/2q^2
    69. m = 1
    70. k = 1
    71. Up = lambda p, t:p[:]/m + t
    72. Vq = lambda q, t:k*q[:] + t
    73. c = symhamicssolver(Up, Vq)
    74. fig = plt.figure(figsize=(12, 4))
    75. ax1 = fig.add_subplot(1,3,1)
    76. ax2 = fig.add_subplot(1,3,2)
    77. ax3 = fig.add_subplot(1,3,3)
    78. p, q = c.E1()
    79. ax1.plot(p, q)
    80. ax1.set_title("E1")
    81. ax1.set_xlabel("q")
    82. ax1.set_ylabel("p", rotation=0)
    83. p, q = c.E2()
    84. ax2.plot(p, q)
    85. ax2.set_title("E2")
    86. ax2.set_xlabel("q")
    87. ax2.set_ylabel("p", rotation=0)
    88. p, q = c.E4()
    89. ax3.plot(p, q)
    90. ax3.set_title("E4")
    91. ax3.set_xlabel("q")
    92. ax3.set_ylabel("p", rotation=0)
    93. plt.pause(0.01)

  • 相关阅读:
    结合CAP理论分析ElasticSearch的分布式实现方式
    Bigkey问题的解决思路与方式探索
    Unity Shader入门精要学习——透明效果
    springboot一个简单的前端响应后端查询项目
    JAVA餐饮掌上设备点餐系统计算机毕业设计Mybatis+系统+数据库+调试部署
    RobotFramework用户关键字(一)
    Python 中的后台进程
    【构建ML驱动的应用程序】第 11 章 :监控和更新模型
    太赞了!美团T9大牛硬肝仨月总结出Linux高性能服务器编程
    差分约束原理及其应用
  • 原文地址:https://blog.csdn.net/Chandler_river/article/details/132972957