| restart: |
| with(linalg): |
| with(LinearAlgebra): |
| N:=16: |
| d:=Pi/2: |
| h:=0.75/sqrt(N); |
| s:=.5/sqrt(N); |
| SIZE:=2*N+1; |
| delta0:=i,j->piecewise(j=i,1,j<>i,0): |
| delta1:=i,j->piecewise(i=j,0,i<>j,((-1)(i-j))/(i-j)): |
| delta2:=i,j->piecewise(i=j,(-Pi2)/3,i<>j,-2*(-1)(i-j)/(i-j)2): |
| I_0:=Matrix(SIZE,delta0): |
| I_1:=Matrix(SIZE,delta1): |
| I_2:=Matrix(SIZE,delta2): |
| xk:=1/2+1/2*tanh(k*h/2); |
| xk_func:=unapply(xk,k); |
| phi:=unapply(log((x)/(1-x)),x); |
| Dphi:=unapply(simplify(diff(phi(x),x)),x); |
| g:=unapply(simplify(1/diff(phi(x),x)),x); |
| Dg:=unapply(diff(g(x),x),x); |
| gk:=unapply(subs(x=xk,g(x)),k); |
| Dgk:=unapply(subs(x=xk,Dg(x)),k); |
| g_Div_Dphi:=unapply(g(x)/Dphi(x),x); |
| g_Div_Dphi_k:=unapply(subs(x=xk,g_Div_Dphi(x)),k); |
| #Temporal Spaces; |
| tl:=exp(l*s); |
| tl_func:=unapply(tl,l); |
| gamm:=unapply(log(t),t); |
| Dgam:=unapply(diff(gamm(t),t),t); |
| g_gamm:=unapply(1/diff(gamm(t),t),t); |
| g_gamm_l:=unapply(subs(t=tl,g_gamm(t)),l); |
| gamm_Div_Dgam:=unapply(g_gamm(t)/Dgam(t),t); |
| gamm_Div_Dgam:= t-> t2; |
| gamm_Div_Dgam_l:=unapply(subs(t=tl,gamm_Div_Dgam(t)),l); |
| GenerateDiagonalAm := proc( x ) |
| local i:=1: |
| local A:=Matrix(SIZE): |
| for i from 1 by 1 to SIZE |
| do |
| Ai,i:=evalf(x(-N+i-1)): |
| end do: |
| return A; |
| end proc; |
| B:= -2*h*MatrixMatrixMultiply(I_0,GenerateDiagonalAm(gk))+ |
| MatrixMatrixMultiply(I_1,GenerateDiagonalAm(Dgk))+1/h*I_2: |
| DD:=h*GenerateDiagonalAm(g_Div_Dphi_k): |
| C:=MatrixMatrixMultiply(GenerateDiagonalAm(g_gamm_l),s*(I_0-I_1)): |
| E:=s*GenerateDiagonalAm(gamm_Div_Dgam_l): |
| Fkl:=unapply((Pi2-4)*sin(Pi*xk_func(k-N-1))*exp(-tl_func(l-N-1)),k,l); |
| F:=evalf(Matrix(SIZE,Fkl)): |
| V:=Matrix(SIZE,v): |
| EQN_SYS:=evalf( |
| MatrixMatrixMultiply( |
| MatrixMatrixMultiply( |
| Matrix(inverse(DD)),B |
| ),V |
| ) |
| ) |
| +evalf( |
| MatrixMatrixMultiply( |
| MatrixMatrixMultiply( |
| V,C),Matrix(inverse(E) |
| ) |
| ) |
| ): |
| SYS:=: |
| for i from 1 by 1 to SIZE |
| do |
| for j from 1 by 1 to SIZE |
| do |
| SYS:=op(SYS),EQN_SYS(i,j)=F(i,j); |
| end do: |
| end do: |
| vars:=seq(seq(v(i,j),i=1..2*N+1),j=1..2*N+1): |
| A,b:LinearAlgebraGenerateMatrix(evalf(SYS),vars): |
| c:=linsolve(A,b): |
| CoeffMatrix=Matrix(SIZE): |
| cnt:=1; |
| for i to SIZE do |
| for j to SIZE do |
| CoeffMatrixj,i:=ccnt: |
| cnt:=cnt+1 |
| end do; |
| end do; |
| CoeffMatrix:=Matrix(CoeffMatrix,SIZE): |
| ApproximateSol:=unapply( |
| evalf( |
| sum( |
| sum("CoeffMatrix"[m+N+1,n+N+1] |
| *sin(Pi*(phi(x)-m*h)/h)/(Pi*(phi(x)-m*h)/h) |
| *sin(Pi*(gamm(t)-n*s)/s)/(Pi*(gamm(t)-n*s)/s) |
| ,m=-N..N), |
| n=-N...N) |
| ) |
| +exp(-4*t)*sin(Pi*x) |
| ,x,t): |
| plot3d(ApproximateSol(x,t),x=0..1,t=0..1): |
| Exact:=unapply(exp(-Pi2*t)*sin(Pi*x),x,t); |
| plot3d(Exact(x,t),x=0..1,t=0..1); |
| plot3d({Exact(x,t),ApproximateSol(x,t)},x=0..1,t=0..1); |
| XX:=.6; |
| #Numerical Comparision EXACT |
| for j from 0.1 to 10 by 1 |
| do |
| evalf(Exact(XX,j)): |
| od; |
| #Numerical Comparision APPROX |
| for j from 0.1 to 10 by 1 |
| do |
| evalf(ApproximateSol(XX,j)): |
| od; |
| #Numerical Comparision ERROR |
| for j from 0.1 to 10 by 1 |
| do |
| abs(evalf(evalf(ApproximateSol(XX,j)-Exact(XX,j)))): |
| od; |