```% ising_thermal - Internal energy of the Ising model in thermal equilibrium
%   ising_thermal(B,T) gives the internal energy
%   per qubit of the Ising spin chain in a transverse field in the
%   thermodynamic limit, if the temperature is T, the
%   field strength is B and the coefficient
%   of the nearest neighbor coupling is 1.
%   ising_thermal(B,T,N) does the same for N qubits.

function E0=ising_thermal(BField,T,varargin)

if isempty(varargin),
N=Inf;
else
if length(varargin)~=1,
error('Wrong number of input arguments.')
end %if
N=varargin{1};
end %if

% Thermodynamical limit
if N==Inf;

% Using Pfeuty, Ann. Phys. 57, 79-90 (1970)
J=4;
Gamma=2*BField;
lambda=J/2/Gamma;

k=1;
N=1000;
m=-N/2:1:N/2-1;
q=2*pi*m/N;
dq=1;

wq=sqrt(1+2*lambda*cos(q)+lambda^2);

% Normalization
E0=sum(Gamma.*wq.*1./(exp(Gamma.*wq./k./T)+1))/N+ising_ground(BField);

else

% Numerics for finite N
x=[0 1;1 0];
y=[0 -i;i 0];
z=[1 0; 0 -1];
e=[1 0; 0 1];

% Using routines from the library to make the Ising Hamiltonian
H=-nnchainp(x,x,N)-BField*nnchainp(z,e,N);
rho=expm(-H/T);
rho=rho/trace(rho);
E0=trace(H*rho)/N;

end %if```