[Python에 의한 과학·기술 계산] 누메로프법에 의한 2층 상미분 방정식의 해법, 수치 계산
소개
과학·기술 계산에서는, 1층 미분을 포함하지 않는 2층의 상미분 방정식,
$\frac{d^2 y}{d x^2} + k^2(x)y=S(x) {\tag 1} $
가 자주 나온다(1차원 슈레딩거 방정식 등).
이 방정식의 해법으로는 누메로프법이라고 불리는 매우 간단하고 효율적인 양해법의 알고리즘이 있다. 이 방법은 4차 룬게 쿠터법[1]보다 1차만 정밀도가 높다[2].
이 논문에서는 파이썬을 사용하여 간단한 예제를 풀 수 있습니다.
누메로프법
균일 한 격자 간격
$h = x_{n}-x_{n+1}{\tag 2}$
따라서 Numerov 방법에 의한 해결책은
$y_{n+1}=\frac{(1-5bh^2)y_n-(1+\frac{1}{2}k^2_{n-1} h^2)y_{n-1}+ b(S_{n+1}+10S_n+S_{n-1})}{1+bk^2_{n+1}h^2} +\mathcal{O(h^6)}{\tag 3} $
된다 [1]. 특히, $S(x)=0$일 때는 1차원의 헬름홀츠 방정식이 되고, 누메로프법에 의한 해는
$y_{n+1}=\frac{(1-5bh^2)y_n-(1+\frac{1}{2}k^2_{n-1} h^2)y_{n-1}} {1+bk^2_{n+1}h^2} +\mathcal{O(h^6)}{\tag 4} $
된다.
예제
$\frac{d^2 y}{d x^2} = -4\pi y, y(0)=1, y'(0)=0 {\tag 5} $
를 x=0에서 1까지 풉니다.
엄밀한 해는
$ y = cos(2\sqrt\pi x){\tag 6} $
이다.
누메로프법에서는 $y[0]$ 이외에 $y[1]$의 값이 필요하다.
여기서 $ y '(0) $의 전진 차분 표현에서,
$y'(0) = (y[1]-y[0])/h = 0 $로, $y[1] = 1$로 한다.
또, $h = x_{n}-x_{n+1} = 0.005$로 한다
코드
"""
ヌメロフ法による2階常微分方程式の解法
"""
import numpy as np
import matplotlib.pyplot as plt
delta_x=0.005
xL0, xR0 =0, 1
Nx = int((xR0-xL0)/delta_x)
k2=np.zeros([Nx+1])
k2[:] = 4*np.pi
y=np.zeros([Nx])
#初期条件
y[0] = 1
y[1]=1 # y'(0) = (y[1]-y[0])/delta_xと前進差分して評価
def Numerov (N,delta_x,k2,u): # ヌメロフ法による発展
b = (delta_x**2)/12.0
for i in range(1,N-1):
u[i+1] = (2*u[i]*(1-5*b*k2[i])-(1+b*k2[i-1])*u[i-1])/(1+b*k2[i+1])
Numerov(Nx, delta_x, k2, y) # ヌメロフ法による解
# for plot
X= np.linspace(xL0,xR0, Nx)
y_exact = np.cos(2*np.sqrt(np.pi)*X)
plt.plot(X, y,'o',markersize=2,label='Numerov')
plt.plot(X, y_exact,'-',color='red',markersize=0.5,label='Exact')
plt.legend(loc='upper right')
plt.xlabel('X') # x軸のラベル
plt.ylabel('Y') # y軸のラベル
plt.show()
결과
점이 누메로프법에 의한 수치해, 적선이 엄밀해를 나타낸다.
참고문헌
[1] Qiita 기사 [Python에 의한 과학·기술 계산] 4차의 룬게-쿠타법에 의한 1차원 뉴턴 방정식의 해법
[2] 아베 마사노리 외(역), 『쿠닌 계산기 물리학』
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 누메로프법에 의한 2층 상미분 방정식의 해법, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sci_Haru/items/338a5bb68ce17189917b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
균일 한 격자 간격
$h = x_{n}-x_{n+1}{\tag 2}$
따라서 Numerov 방법에 의한 해결책은
$y_{n+1}=\frac{(1-5bh^2)y_n-(1+\frac{1}{2}k^2_{n-1} h^2)y_{n-1}+ b(S_{n+1}+10S_n+S_{n-1})}{1+bk^2_{n+1}h^2} +\mathcal{O(h^6)}{\tag 3} $
된다 [1]. 특히, $S(x)=0$일 때는 1차원의 헬름홀츠 방정식이 되고, 누메로프법에 의한 해는
$y_{n+1}=\frac{(1-5bh^2)y_n-(1+\frac{1}{2}k^2_{n-1} h^2)y_{n-1}} {1+bk^2_{n+1}h^2} +\mathcal{O(h^6)}{\tag 4} $
된다.
예제
$\frac{d^2 y}{d x^2} = -4\pi y, y(0)=1, y'(0)=0 {\tag 5} $
를 x=0에서 1까지 풉니다.
엄밀한 해는
$ y = cos(2\sqrt\pi x){\tag 6} $
이다.
누메로프법에서는 $y[0]$ 이외에 $y[1]$의 값이 필요하다.
여기서 $ y '(0) $의 전진 차분 표현에서,
$y'(0) = (y[1]-y[0])/h = 0 $로, $y[1] = 1$로 한다.
또, $h = x_{n}-x_{n+1} = 0.005$로 한다
코드
"""
ヌメロフ法による2階常微分方程式の解法
"""
import numpy as np
import matplotlib.pyplot as plt
delta_x=0.005
xL0, xR0 =0, 1
Nx = int((xR0-xL0)/delta_x)
k2=np.zeros([Nx+1])
k2[:] = 4*np.pi
y=np.zeros([Nx])
#初期条件
y[0] = 1
y[1]=1 # y'(0) = (y[1]-y[0])/delta_xと前進差分して評価
def Numerov (N,delta_x,k2,u): # ヌメロフ法による発展
b = (delta_x**2)/12.0
for i in range(1,N-1):
u[i+1] = (2*u[i]*(1-5*b*k2[i])-(1+b*k2[i-1])*u[i-1])/(1+b*k2[i+1])
Numerov(Nx, delta_x, k2, y) # ヌメロフ法による解
# for plot
X= np.linspace(xL0,xR0, Nx)
y_exact = np.cos(2*np.sqrt(np.pi)*X)
plt.plot(X, y,'o',markersize=2,label='Numerov')
plt.plot(X, y_exact,'-',color='red',markersize=0.5,label='Exact')
plt.legend(loc='upper right')
plt.xlabel('X') # x軸のラベル
plt.ylabel('Y') # y軸のラベル
plt.show()
결과
점이 누메로프법에 의한 수치해, 적선이 엄밀해를 나타낸다.
참고문헌
[1] Qiita 기사 [Python에 의한 과학·기술 계산] 4차의 룬게-쿠타법에 의한 1차원 뉴턴 방정식의 해법
[2] 아베 마사노리 외(역), 『쿠닌 계산기 물리학』
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 누메로프법에 의한 2층 상미분 방정식의 해법, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sci_Haru/items/338a5bb68ce17189917b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
"""
ヌメロフ法による2階常微分方程式の解法
"""
import numpy as np
import matplotlib.pyplot as plt
delta_x=0.005
xL0, xR0 =0, 1
Nx = int((xR0-xL0)/delta_x)
k2=np.zeros([Nx+1])
k2[:] = 4*np.pi
y=np.zeros([Nx])
#初期条件
y[0] = 1
y[1]=1 # y'(0) = (y[1]-y[0])/delta_xと前進差分して評価
def Numerov (N,delta_x,k2,u): # ヌメロフ法による発展
b = (delta_x**2)/12.0
for i in range(1,N-1):
u[i+1] = (2*u[i]*(1-5*b*k2[i])-(1+b*k2[i-1])*u[i-1])/(1+b*k2[i+1])
Numerov(Nx, delta_x, k2, y) # ヌメロフ法による解
# for plot
X= np.linspace(xL0,xR0, Nx)
y_exact = np.cos(2*np.sqrt(np.pi)*X)
plt.plot(X, y,'o',markersize=2,label='Numerov')
plt.plot(X, y_exact,'-',color='red',markersize=0.5,label='Exact')
plt.legend(loc='upper right')
plt.xlabel('X') # x軸のラベル
plt.ylabel('Y') # y軸のラベル
plt.show()
결과
점이 누메로프법에 의한 수치해, 적선이 엄밀해를 나타낸다.
참고문헌
[1] Qiita 기사 [Python에 의한 과학·기술 계산] 4차의 룬게-쿠타법에 의한 1차원 뉴턴 방정식의 해법
[2] 아베 마사노리 외(역), 『쿠닌 계산기 물리학』
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 누메로프법에 의한 2층 상미분 방정식의 해법, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sci_Haru/items/338a5bb68ce17189917b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[1] Qiita 기사 [Python에 의한 과학·기술 계산] 4차의 룬게-쿠타법에 의한 1차원 뉴턴 방정식의 해법
[2] 아베 마사노리 외(역), 『쿠닌 계산기 물리학』
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 누메로프법에 의한 2층 상미분 방정식의 해법, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sci_Haru/items/338a5bb68ce17189917b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)