N<-12; k<-0:N; xn<-cos(pi*k/N)
cvec<-c(2,rep(1,N-1),2)*(-1)^k
DX<-outer(xn,xn,"-"); D<-matrix(0,N+1,N+1)
for(i in 1:(N+1)) for(j in 1:(N+1)) if(i!=j)
D[i,j]<-(cvec[i]/cvec[j])/DX[i,j]
diag(D)<- -rowSums(D)
D2<-D%*%D; interior<-2:N
rhs<-pi^2*sin(pi*xn[interior])
u<-numeric(N+1)
u[interior]<-solve(-D2[interior,interior],rhs)
xx<-seq(-1,1,length.out=1001); exact<-sin(pi*xx)
lambda<-(-1)^k; lambda[c(1,N+1)]<-lambda[c(1,N+1)]/2
barycentric_eval<-function(z,xn,yn,lambda) {
vapply(z,function(x) {
d<-x-xn; hit<-which.min(abs(d))
if(abs(d[hit])<=8*.Machine$double.eps*max(1,abs(x))) return(yn[hit])
t<-lambda/d
sum(t*yn)/sum(t)
},numeric(1))
}
u_grid<-barycentric_eval(xx,xn,u,lambda)
plot(xx,exact,type="l",lwd=2,col=1,xlab="x",ylab="u(x)",
main="Collocazione spettrale di -u'' = pi^2 sin(pi x)")
lines(xx,u_grid,lwd=2,lty=2,col=4);points(xn,u,pch=19,col=2,cex=0.6)
legend("topleft",c("soluzione esatta","collocazione","nodi Lobatto"),
col=c(1,4,2),lty=c(1,2,NA),pch=c(NA,NA,19),bty="n")
cat("errore massimo sulla griglia =",max(abs(u_grid-exact)),"\n")