수치 수학 소개
이것이 "Hello, World!"입니다. PDE (부분 미분 방정식) 라플라스 또는 확산 방정식은 열 방정식, 변형, 유체 역학 등과 같은 물리학에서 자주 나타납니다. 실제는 3D이므로 "Hello, World!"라고 말하고 싶습니다. "99 병의 맥주"를 부르지 말고이 작업은 1D로 진행됩니다. 이를 힘이 가해져 양쪽 끝에 벽에 묶인 고무 로브로 해석 할 수 있습니다.
A의 [0,1]도메인 기능 찾을 u지정된 소스 기능 f및 경계 값 u_L과 u_R같은 것을 :
-u'' = fu(0) = u_Lu(1) = u_R
u'' 의 이차 미분을 나타냄 u
이것은 순전히 이론적으로 해결할 수 있지만 당신의 임무는 점을 위해 이산 도메인 x 에서 숫자로 해결하는 것입니다 N.
- x =
{i/(N-1) | i=0..N-1}또는 1 기반 :{(i-1)/(N-1) | i=1..N} h = 1/(N-1)간격입니다
입력
f함수 또는 표현식 또는 문자열로u_L,u_R부동 소수점 값으로N정수> = 2
산출
- 배열, 목록의 구분 문자열의 일종
u이되도록u_i == u(x_i)
예
실시 예 1
입력 : f = -2, u_L = u_R = 0, N = 10(하지 마십시오 f=-2잘못, 그것은 값 만 반환하는 일정한 기능을하지 않습니다 -2모든 x. 그것은 우리의 로프에 일정한 중력의 힘과 같다.)
산출: [-0.0, -0.09876543209876543, -0.1728395061728395, -0.22222222222222224, -0.24691358024691357, -0.24691358024691357, -0.22222222222222224, -0.1728395061728395, -0.09876543209876547, -0.0]
쉬운 정확한 해결책이 있습니다. u = -x*(1-x)

실시 예 2
입력 : f = 10*x, u_L = 0 u_R = 1, N = 15(여기서 우측 맞바람이 많을)
산출: [ 0., 0.1898688, 0.37609329, 0.55502915, 0.72303207, 0.87645773, 1.01166181, 1.125, 1.21282799, 1.27150146, 1.29737609, 1.28680758, 1.2361516, 1.14176385, 1.]
이 상태에 대한 정확한 해결책 : u = 1/3*(8*x-5*x^3)

실시 예 3
입력 : f = sin(2*pi*x), u_L = u_R = 1, N = 20(누군가가 중력을 위반하거나 위쪽 및 풍하의 종류가있다)
산출: [ 1., 1.0083001, 1.01570075, 1.02139999, 1.0247802, 1.0254751, 1.02340937, 1.01880687, 1.01216636, 1.00420743, 0.99579257, 0.98783364, 0.98119313, 0.97659063, 0.9745249, 0.9752198, 0.97860001, 0.98429925, 0.9916999, 1.]
정확한 해결책은 다음과 같습니다. u = (sin(2*π*x))/(4*π^2)+1

실시 예 4
입력 : f = exp(x^2), u_L = u_R = 0,N=30
산출:
[ 0. 0.02021032 0.03923016 0.05705528 0.07367854 0.0890899
0.10327633 0.11622169 0.12790665 0.13830853 0.14740113 0.15515453
0.16153488 0.1665041 0.17001962 0.172034 0.17249459 0.17134303
0.16851482 0.1639387 0.15753606 0.1492202 0.13889553 0.12645668
0.11178744 0.09475961 0.07523169 0.05304738 0.02803389 0. ]

약간의 비대칭 성을 유의하십시오
FDM
이를 해결하는 한 가지 가능한 방법은 유한 차분 법입니다 .
- 다시
-u_i'' = f_i로 (-u_{i-1} + 2u_i - u{i+1})/h² = f_i어느 것이-u_{i-1} + 2u_i - u{i+1} = h²f_i- 방정식을 설정하십시오.

- 다음은 행렬-벡터 방정식과 같습니다.

- 이 방정식을 풀고
u_i
파이썬 시연을위한 이것의 하나의 구현 :
import matplotlib.pyplot as plt
import numpy as np
def laplace(f, uL, uR, N):
h = 1./(N-1)
x = [i*h for i in range(N)]
A = np.zeros((N,N))
b = np.zeros((N,))
A[0,0] = 1
b[0] = uL
for i in range(1,N-1):
A[i,i-1] = -1
A[i,i] = 2
A[i,i+1] = -1
b[i] = h**2*f(x[i])
A[N-1,N-1] = 1
b[N-1] = uR
u = np.linalg.solve(A,b)
plt.plot(x,u,'*-')
plt.show()
return u
print laplace(lambda x:-2, 0, 0, 10)
print laplace(lambda x:10*x, 0, 1, 15)
print laplace(lambda x:np.sin(2*np.pi*x), 1, 1, 20)
행렬 대수를 사용하지 않는 대체 구현 ( Jacobi 방법 사용 )
def laplace(f, uL, uR, N):
h=1./(N-1)
b=[f(i*h)*h*h for i in range(N)]
b[0],b[-1]=uL,uR
u = [0]*N
def residual():
return np.sqrt(sum(r*r for r in[b[i] + u[i-1] - 2*u[i] + u[i+1] for i in range(1,N-1)]))
def jacobi():
return [uL] + [0.5*(b[i] + u[i-1] + u[i+1]) for i in range(1,N-1)] + [uR]
while residual() > 1e-6:
u = jacobi()
return u
그러나 Laplace 방정식을 풀기 위해 다른 방법을 사용할 수도 있습니다. 당신이 반복적 인 방법을 사용하는 경우 잔류 될 때까지 반복한다 |b-Au|<1e-6으로, b오른쪽 벡터 인u_L,f_1h²,f_2h²,...
노트
솔루션 방법에 따라 주어진 솔루션으로 예제를 정확하게 해결하지 못할 수 있습니다. 적어도 N->infinity오류의 경우 0에 접근해야합니다.
표준 허점은 허용되지 않으며 PDE 용 내장 기능이 허용됩니다.
보너스
솔루션을 그래픽 또는 ASCII로 표시하면 -30 %의 보너스.
승리
이것은 codegolf이므로 바이트 단위의 가장 짧은 코드가 승리합니다!
log(log(x))이나 sqrt(1-x^4)통합 기능이있는 기능을 의미 합니다.
u(x) = 1/2 (-sqrt(π) x erfi(x)+sqrt(π) erfi(1) x+e^(x^2)-e x+x-1)정확히 계산할 수는 없다고 말하고 싶었습니다 .






f(x) = exp(x^2).