• WKB近似


    • WKB方法用于研究一种特定类型的微分方程的全局性质
      • 很有用
      • 这种特定的微分方程形如:

    y''+[\lambda^2q_1(x)+q_2(x)]y=0

    • 经过一些不是特别复杂的推导,我们可以得到他的WKB近似解。
      • 该近似解的选择取决于函数q_1(x)和参数\lambda的性质
      • 同时,我们默认函数的定义域为[0,+\infty)
    • q_1(x)恒大于零,\lambda\rightarrow +\infty时:

    y=\frac{1}{q_1^{\frac{1}{4}}(x)}\begin{pmatrix} a\cdot cos(\lambda \int_0^x\sqrt{q_1(\tau)}d\tau)+b\cdot sin(\lambda\int_0^x\sqrt{q_1(\tau)}d\tau) \end{pmatrix}

    • q_1(x)恒小于零,\lambda\rightarrow +\infty时:

    y=\frac{1}{[-q_1(x)]^{\frac{1}{4}}} \begin{pmatrix} a\cdot ch(\lambda \int_0^x\sqrt{-q_1(\tau)}d\tau)+b\cdot sh(\lambda\int_0^x\sqrt{-q_1(\tau)}d\tau) \end{pmatrix}

    • 注:很快你会发现两个问题
      • a 和 b 是怎么确定的
        • 答:初始条件
      • \lambda 趋于正无穷 并不意味着 只有 \lambda 很大才能使得该WKB 近似真实
    • q_1(x)存在一个或者多个零点时,函数的WKB近似会变得非常的复杂
      • 我们一会再看

    WKB 近似案例 1

    • 该案例选取自参考文献【1】P137 例5.1.1

    \begin{matrix} y''=\lambda^2Q(x)y\\ y(0)=0,y'(0)=1\\ Q(x)=(1+x^2)^2 \end{matrix}

    • 我们相信它的WKB近似为y\sim \frac{1}{\lambda (1+x^2)^{\frac{1}{2}}}sh(\lambda\cdot(x+\frac{x^3}{3}))
    • 我们使用四阶Runge-Kutta方法求解
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. from scipy.optimize import fsolve
    4. class odessolver():
    5. def __init__(self, f, Y_start=np.array([0, 1]), dY_start=np.array([0, 0]), \
    6. X_start=0, X_end=1, h=0.01):
    7. self.f = f
    8. self.h = h
    9. self.X = np.arange(X_start, X_end, self.h)
    10. self.n = Y_start.size
    11. self.Y = np.zeros((self.n, self.X.size))
    12. #第一个参数表示元 第二个参数表示变量
    13. self.Y[:, 0] = Y_start
    14. self.Y[:, 1] = Y_start + self.h * dY_start
    15. self.tol = 1e-6
    16. def __str__(self):
    17. return f"y'(x) = f(x) = ({self.f}) variables"
    18. def RK4(self):
    19. for i in range(1, self.X.size):
    20. k1 = self.f(self.X[i-1] , self.Y[:, i-1])
    21. k2 = self.f(self.X[i-1] +self.h/2 , self.Y[:, i-1]+1/2*self.h*k1)
    22. k3 = self.f(self.X[i-1] +self.h/2 , self.Y[:, i-1]+1/2*self.h*k2)
    23. k4 = self.f(self.X[i-1] +self.h , self.Y[:, i-1]+ self.h*k3)
    24. self.Y[:, i] = self.Y[:, i-1] +self.h/6 * (k1 + 2*k2 + 2*k3 + k4)
    25. return self.Y
    26. def IRK4(self):
    27. for i in range(1, self.X.size):
    28. def f1(k1, k2):
    29. f1_x = self.X[i-1] + self.h*(3-3**0.5)/6
    30. f1_y = self.Y[:, i-1]+k1/4*self.h+(3-2*3**0.5)/12*k2*self.h
    31. f1_res = self.f(f1_x, f1_y)
    32. return np.array([f1_res[i] for i in range(self.n)])
    33. def f2(k1, k2):
    34. f2_x = self.X[i-1] + self.h*(3+3**0.5)/6
    35. f2_y = self.Y[:, i-1]+k2/4*self.h+(3+2*3**0.5)/12*k1*self.h
    36. f2_res = self.f(f2_x, f2_y)
    37. return np.array([f2_res[i] for i in range(self.n)])
    38. def func(k):
    39. k1 = np.array([k[i] for i in range(self.n)])
    40. k2 = np.array([k[i+self.n] for i in range(self.n)])
    41. doc = []
    42. for i in range(self.n):
    43. doc.append((k1 - f1(k1, k2))[i])
    44. for i in range(self.n):
    45. doc.append((k2 - f2(k1, k2))[i])
    46. return doc
    47. sol = fsolve(func, np.zeros(self.n*2))
    48. self.Y[:, i] = self.Y[:, i-1] + 1/2 * self.h * (sol[:self.n] + sol[self.n:])
    49. return self.Y
    50. A = 0
    51. B = 1
    52. Lambda = 1
    53. Q = lambda x:(1+x**2)**2
    54. Y0 = np.array([A, B])
    55. def test_fun(x, Y):
    56. return np.array([Y[1], Lambda**2 * Q(x) * Y[0]])
    57. c = odessolver(test_fun, Y_start=Y0)
    58. x = np.arange(0, 1, 0.01)
    59. y3 = c.RK4()
    60. x = np.arange(0, 1, 0.01)
    61. plt.plot(x, y3[0, :], label="RK4")
    62. ##y4 = c.IRK4()
    63. ##x = np.arange(0, 1, 0.01)
    64. ##plt.plot(x, y4[0, :], label="IRK4")
    65. WKB = lambda x:1/(Lambda*(1+x**2)**0.5)*(np.exp(x+x**3/3)-np.exp(-(x+x**3/3)))/2
    66. plt.plot(x, WKB(x), label="WKB")
    67. plt.legend()
    68. plt.pause(0.01)

    • 看上去十分得合理

    参考文献

    [1]数学物理中的渐近方法 李家春 周显初 科学出版社

  • 相关阅读:
    记一次中兴新支点NewStartHA虚拟机安装
    学习Java语法糖这一篇就够了(详细版)
    【Hack The Box】linux练习-- Bashed(未完)
    IDEA自定义Servlet、Filter、Listener模板
    网络类型及数据链路层的协议
    PG-DBA培训16:PostgreSQL负载均衡分发与双主HA架构
    泛型的基础 装箱拆箱
    分库分表二:ShardingJDBC进阶实战案例上
    java Date
    pod之间的通信
  • 原文地址:https://blog.csdn.net/Chandler_river/article/details/133276754