function [x,u]=newmarkwave(xspan,tspan,nstep,param,... c,u0,v0,g,f,varargin) %NEWMARKWAVE risolve l'equazione delle onde % con il metodo di Newmark % [X,U]=NEWMARKWAVE(XSPAN,TSPAN,NSTEP,PARAM,C,... % U0,V0,G,F) % risolve l'equazione delle onde % D^2 U/DT^2 - C D^2U/DX^2 = F in % (XSPAN(1),XSPAN(2)) X (TSPAN(1),TSPAN(2)) con il % metodo di Newmark, con condizioni iniziali % U(X,0)=U0(X), DU/DX(X,0)=V0(X) e condizioni al % bordo di Dirichlet U(X,T)=G(X,T) in X=XSPAN(1) % ed in X=XSPAN(2). C e' una costante positiva, % F,G,U0 e V0 sono inline function. % NSTEP(1) e' il numero di intervalli di spazio. % NSTEP(2) e' il numero di intervalli in tempo. % PARAM(1)=ZETA e PARAM(2)=THETA. % [X,U]=NEWMARKWAVE(XSPAN,TSPAN,NSTEP,PARAM,C,... % U0,V0,G,F,P1,P2,...) passa i parametri addizio- % nali P1,P2,... alle funzioni U0,V0,G,F. h = (xspan(2)-xspan(1))/nstep(1); dt = (tspan(2)-tspan(1))/nstep(2); zeta = param(1); theta = param(2); N = nstep(1)+1; e = ones(N,1); D = spdiags([e -2*e e],[-1,0,1],N,N); I = speye(N); lambda = dt/h; A = I-c*lambda^2*zeta*D; An = I+c*lambda^2*(0.5-zeta)*D; A(1,:) = 0; A(1,1) = 1; A(N,:) = 0; A(N,N) = 1; x = linspace(xspan(1),xspan(2),N); x = x'; fn = feval(f,x,tspan(1),varargin{:}); un = feval(u0,x,varargin{:}); vn = feval(v0,x,varargin{:}); [L,U]=lu(A); alpha = dt^2*zeta; beta = dt^2*(0.5-zeta); theta1 = 1-theta; for t = tspan(1)+dt:dt:tspan(2) fn1 = feval(f,x,t,varargin{:}); rhs = An*un+dt*I*vn+alpha*fn1+beta*fn; temp = feval(g,[xspan(1),xspan(2)],t,varargin{:}); rhs([1,N]) = temp; u = L\rhs; u = U\u; v = vn + dt*((1-theta)*(c*D*un/h^2+fn)+... theta*(c*D*u/h^2+fn1)); fn = fn1; un = u; vn = v; end