Sayısal Matematiğe Giriş
Bu "Merhaba Dünya!" PDE'ler (Kısmi Diferansiyel Denklemler). Laplace veya Difüzyon Denklemi Fizikte sıklıkla görülür, örneğin Isı Denklemi, Deforme, Akışkanlar Dinamiği, vb ... Gerçek hayat 3D olduğundan, "Merhaba Dünya!" "99 şişe bira, ..." şarkı söylemeyin, bu görev 1D'de verilir. Bunu, her iki ucunda bir duvara bağlı, üzerine kuvvet uygulanmış bir kauçuk elbise olarak yorumlayabilirsiniz.
Bir [0,1]
etki alanında u
belirli kaynak işlevi f
ve sınır değerleri için bir işlev bulun u_L
ve u_R
bu şekilde:
-u'' = f
u(0) = u_L
u(1) = u_R
u''
"" nin ikinci türevini belirtir. u
Bu tamamen teorik olarak çözülebilir, ancak göreviniz, puan için ayrı bir x alanında sayısal olarak çözmektir N
:
- x =
{i/(N-1) | i=0..N-1}
veya 1 tabanlı:{(i-1)/(N-1) | i=1..N}
h = 1/(N-1)
aralık mı
Giriş
f
işlev veya ifade veya dize olaraku_L
,u_R
kayan nokta değerleri olarakN
tamsayı olarak> = 2
Çıktı
- Dizi, Liste, bir Ayrılmış dize çeşit
u
öyle kiu_i == u(x_i)
Örnekler
örnek 1
Girdi: f = -2
, u_L = u_R = 0
, N = 10
(alamaz Do f=-2
yanlış, bir değer ancak döner bir sabit fonksiyon değildir -2
herkes için x
. Bu bizim ipe sabit yerçekimi kuvvetinin gibidir.)
Çıktı: [-0.0, -0.09876543209876543, -0.1728395061728395, -0.22222222222222224, -0.24691358024691357, -0.24691358024691357, -0.22222222222222224, -0.1728395061728395, -0.09876543209876547, -0.0]
Kolay ve kesin bir çözüm var: u = -x*(1-x)
ÖRNEK 2
Girdi: f = 10*x
, u_L = 0
u_R = 1
, N = 15
(Burada sağ tarafta rüzgâra karşı bir sürü vardır)
Çıktı: [ 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.]
Bu durumlar için kesin çözüm: u = 1/3*(8*x-5*x^3)
ÖRNEK 3
Girdi: f = sin(2*pi*x)
, u_L = u_R = 1
, N = 20
(Birisi yerçekimi kırdı veya yukarı ve rüzgar altı bir tür vardır)
Çıktı: [ 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.]
İşte kesin çözüm u = (sin(2*π*x))/(4*π^2)+1
Örnek 4
Girdi: f = exp(x^2)
, u_L = u_R = 0
,N=30
Çıktı:
[ 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. ]
Hafif simetriye dikkat edin
FDM
Bunu çözmek için olası bir yöntem Sonlu Farklar Yöntemi'dir :
- yeniden yazmak
-u_i'' = f_i
olarak (-u_{i-1} + 2u_i - u{i+1})/h² = f_i
hangisine eşit-u_{i-1} + 2u_i - u{i+1} = h²f_i
- Denklemleri kurun:
- Bir matris-vektör denklemine eşit olan:
- Bu denklemi çözün ve
u_i
Python'da gösteri için bunun bir uygulaması:
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)
Matris Cebiri olmadan alternatif uygulama ( Jacobi yöntemini kullanarak )
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
Ancak Laplace denklemini çözmek için başka bir yöntem kullanabilirsiniz. Eğer iteratif yöntemi kullanırsanız, artık dek yineleme gerektiğini |b-Au|<1e-6
ile, b
sağ taraf vektörü olmaku_L,f_1h²,f_2h²,...
notlar
Çözüm yönteminize bağlı olarak, verilen çözümlerle ilgili örnekleri tam olarak çözemeyebilirsiniz. En azından N->infinity
hata sıfıra yaklaşmalıdır.
Standart boşluklara izin verilmez , PDE'ler için yerleşik girişlere izin verilir.
Bonus
Grafik veya ASCII-art çözümünü görüntülemek için% -30'luk bir bonus.
Kazanan
Bu codegolf, baytlardaki en kısa kod kazanıyor!
log(log(x))
veya sqrt(1-x^4)
olmayan fonksiyonlar.
u(x) = 1/2 (-sqrt(π) x erfi(x)+sqrt(π) erfi(1) x+e^(x^2)-e x+x-1)
tam olarak hesaplanamaz.
f(x) = exp(x^2)
.