from sympy import *
import numpy as np
from matplotlib import pyplot as plt
x, i, h = symbols('x i h')
expr1 = Piecewise(
(0, (x-i) > h),
(0, (x-i) < -h),
(2*((x-i)/h)**3-3*((x-i)/h)**2+1, (x-i) > 0),
(-2*((x-i)/h)**3-3*((x-i)/h)**2+1, (x-i) <= 0)
)
expr2 = Piecewise(
(0, (x-i) > h),
(0, (x-i) < -h),
(((x-i)/h)**3-2*((x-i)/h)**2+(x-i)/h, (x-i)>0),
(((x-i)/h)**3+2*((x-i)/h)**2+(x-i)/h, (x-i)<=0)
)
L=1
h_val = 1
X = np.linspace(-2,2, 100)
Y1 = [expr1.subs([(i,0),(h,h_val),(x,val)]) for val in X]
Y2 = [expr2.subs([(i,0),(h,h_val),(x,val)]) for val in X]
Y3 = [expr1.subs([(i,1),(h,h_val),(x,val)]) for val in X]
Y4 = [expr2.subs([(i,1),(h,h_val),(x,val)]) for val in X]
plt.plot(X, Y1)
plt.plot(X, Y2)
plt.plot(X, Y3)
plt.plot(X, Y4)
plt.show()
h_val = 1
exprs = [expr1.subs([(i,0),(h,h_val)]), expr2.subs([(i,0),(h,h_val)]), expr1.subs([(i,1),(h,h_val)]), expr2.subs([(i,1),(h,h_val)])]
rows = np.array([[integrate(a*b, (x,-1,2)) for a in exprs] for b in exprs])
rowsB = np.array([[integrate(diff(a,x)*diff(b,x)-a*diff(b), (x,-1,2)) for a in exprs] for b in exprs])
rows[0,1]=rows[1,0]=rows[2,3]=rows[3,2]=0
print "h = %d" % h_val
print "\n A = \n"
for row in rows:
print row
print "\n B = \n"
for row in rowsB:
print row
x, i, h = symbols('x i h')
expr1 = Piecewise(
(0, (x-i) > h),
(0, (x-i) < -h),
(2*((x-i)/h)**3-3*((x-i)/h)**2+1, (x-i) > 0),
(-2*((x-i)/h)**3-3*((x-i)/h)**2+1, (x-i) <= 0)
)
expr2 = Piecewise(
(0, (x-i) > h),
(0, (x-i) < -h),
(((x-i)/h)**3-2*((x-i)/h)**2+(x-i)/h, (x-i)>0),
(((x-i)/h)**3+2*((x-i)/h)**2+(x-i)/h, (x-i)<=0)
)
L=1
h_val = 0.1
exprs2 = [expr1.subs([(i,0),(h, h_val)]), expr2.subs([(i,0),(h, h_val)]), expr1.subs([(i,1),(h, h_val)]), expr2.subs([(i,1),(h, h_val)])]
rows2 = np.array([[integrate(diff(a,x,x)*diff(b,x,x), (x,-1,2)) for a in exprs2] for b in exprs2])
dim = int(2*L/h_val)
A = np.zeros((dim,dim))
A[0,0]=1
A[1,1]=1
for ind in range(2,dim-2,2):
A[ind:ind+4,ind:ind+4] = rows2
def final_exp(f):
B = np.zeros((dim,1))
for ind in range(2,dim-1,2):
B[ind:ind+2,0] = [integrate(a*f,(x,-1,2)) for a in exprs2[:2]]
a_vals = np.linalg.inv(A).dot(B)
bases = []
for ind in np.arange(0,float(L),h_val):
bases.extend([expr1.subs([(i, ind),(h,h_val)]),expr2.subs([(i, ind),(h,h_val)])])
return sum([bases[ind]*a_vals[ind] for ind in range(20)]),bases
Xs = np.arange(0,L,h_val/5)
for f in np.linspace(0,-1,5):
exp,bases = final_exp(f)
Ys = [exp.subs(x,ind) for ind in Xs]
plt.plot(Xs, Ys)
plt.show()