Solving second-order ODE by the finite difference method in Python
Following code solves this second order linear ordinary differential equation $ y''+7y=8\cos(4x)+\sin^{2}(2x), y(0)=\alpha, y(\pi/2)=\beta $
by the finite differences method using just default libraries in Python 3
(tested with Python 3.4
). Linear system is solved by matrix factorization.
This snippet was used for NUM2 subject in FJFI, 2015 as a final project. Big thanks to my friend Vojta, who also participate.
This is just for educational purposes and cannot be used for cheating.
Here is the code (download):
from math import cos, sin, pi
# Settings
g1 = float(input("Value in y(0) = ")) # 3 ... y(0)
g2 = float(input("Value in y(pi/2) = ")) # 1.5 ... y(pi/2)
m = int(input("Number of steps: ")) # e.g. 1000
h = (pi/2)/m # krok site
net = [i*h for i in range(m+1)] # body site
# Initial
f = lambda x: 8 * cos(4*x) + (sin(2*x) ** 2) # f(x)
p = lambda x: -1 # p(x)
q = lambda x: 7 # q(x)
P = [p(i*h) for i in range(m+1)]
Q = [q(i*h) for i in range(m+1)]
F = [-f(i*h) for i in range(1,m)]
## Solving tridiagonal matrix by matrix factorization
A = [-(P[i+1]/h**2) for i in range(m-1)] # upper diagonal
C = [-(P[i+1]+P[i+2])/h**2 - Q[i+1] for i in range(m-1)] # diagonal
B = [-(P[i+2]/h**2) for i in range(m-1)] # lower diagonal
alphas = [0]
betas = [g1]
for i in range(m-1):
alphas.append(B[i] / (C[i] - alphas[i]*A[i]))
betas.append((betas[i]*A[i] + F[i]) / (C[i]-alphas[i]*A[i]))
u = [g2]
for i in range(m):
u.insert(0, alphas[m-i-1]*u[0]+betas[m-i-1])
## Write to file in gnuplot format
## In gnuplot just type: plot "out.txt"
with open("out.txt", "w", encoding="utf8") as outf:
outf.write("# x \t y\n")
for xova, yova in zip(net, u):
outs = "{0} {1}\n".format(xova, yova)
outf.write(outs)