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

  • 本文只介绍自洽可分的哈密顿系统的辛算法的显式结构

  • 一阶显式辛结构

\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}

  • 全代码
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve

##SymplecticHamilton
##self-consistent
##separable
class symhamcssolver():

    def __init__(self, Up, Vq, 
                 q0=np.array([0]),
                 p0=np.array([1]), 
                 T_start=0, T_end=20, tau=0.01):


        self.Up = Up
        self.Vq = Vq

        self.tau = tau
        self.T = np.arange(T_start, T_end, self.tau)
        self.size = len(self.T)

        self.q = np.zeros((len(self.T), len(q0)))
        self.q[0, :] = q0

        self.p = np.zeros((len(self.T), len(p0)))
        self.p[0, :] = p0
        
        self.tol = 1e-6

    def __str__(self):
        return f"Symplectic algrithm of self-consistent and separable Hamilton system"


    def E1(self,):
        for i in range(1, self.size):
            self.q[i, :] = self.q[i-1, :] + self.tau * self.Up(self.p[i-1, :])
            self.p[i, :] = self.p[i-1, :] - self.tau * self.Vq(self.q[i, :])
        return self.p, self.q
    
    def E2(self,):
        for i in range(1, self.size):
            x = self.q[i-1, :]
            y = self.p[i-1, :] - self.tau/2 * self.Vq(x)
            self.q[i, :] = x + self.tau * self.Up(y)
            self.p[i, :] = y - self.tau/2 * self.Vq(self.q[i, :])
        return self.p, self.q

    def E4(self,):
        alpha = 1/(2-2**(1/3))
        beta  = 1 - 2 * alpha
        c = np.zeros(5)
        d = np.zeros(5)
        c[2] = alpha
        c[4] = alpha
        c[3] = beta
        d[1] = alpha/2
        d[4] = alpha/2
        d[2] = (alpha + beta)/2
        d[3] = (alpha + beta)/2

        for i in range(1, self.size):
            x1 = self.q[i-1, :] + c[1] * self.tau * self.Up(self.p[i-1, :])
            y1 = self.p[i-1, :] - d[1] * self.tau * self.Vq(x1)
            x2 = x1 + c[2] * self.tau * self.Up(y1)
            y2 = y1 - d[2] * self.tau * self.Vq(x2)
            x3 = x2 + c[3] * self.tau * self.Up(y2)
            y3 = y2 - d[3] * self.tau * self.Vq(x3)
            self.q[i, :] = x3 + c[4] * self.tau * self.Up(y3)
            self.p[i, :] = y3 - d[4] * self.tau * self.Vq(self.q[i, :])

        return self.p, self.q


## H = p^2/2m + k/2q^2
m = 1
k = 1
Up = lambda p:p[:]/m
Vq = lambda q:k*q[:]
    
c = symhamcssolver(Up, Vq)

fig = plt.figure(figsize=(12, 4))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)
 
p, q = c.E1()
ax1.plot(p, q)
ax1.set_title("E1")
ax1.set_xlabel("q")
ax1.set_ylabel("p", rotation=0)

p, q = c.E2()
ax2.plot(p, q)
ax2.set_title("E2")
ax2.set_xlabel("q")
ax2.set_ylabel("p", rotation=0) 

p, q = c.E4()
ax3.plot(p, q)
ax3.set_title("E4")
ax3.set_xlabel("q")
ax3.set_ylabel("p", rotation=0)

plt.pause(0.01)




  • 解示意图 

 自洽可分的哈密顿系统的辛算法_第1张图片

你可能感兴趣的:(算法,python,开发语言)