96 lines
2.2 KiB
Julia
96 lines
2.2 KiB
Julia
# \hat u(k) computed using Newton algorithm
|
|
function hatu_newton(order,rho,a0,d,v,maxiter,tolerance)
|
|
|
|
# compute gaussian quadrature weights
|
|
weights=gausslegendre(order)
|
|
|
|
# initialize V and Eta
|
|
(V,V0,Eta,Eta0)=init_veta(weights,d,v)
|
|
|
|
# initialize u, V and Eta
|
|
u=zeros(Complex{Float64},order)
|
|
for j in 1:order
|
|
# transformed k
|
|
k=(1-weights[1][j])/(1+weights[1][j])
|
|
if d==2
|
|
u[j]=2*pi*a0*rho/k
|
|
elseif d==3
|
|
u[j]=4*pi*a0*rho/k^2
|
|
end
|
|
end
|
|
|
|
# iterate
|
|
for i in 1:maxiter-1
|
|
new=u-inv(dXi(u,V,V0,Eta,Eta0,weights,rho,d))*Xi(u,V,V0,Eta,Eta0,weights,rho,d)
|
|
|
|
if(norm(new-u)/norm(u)<tolerance)
|
|
u=new
|
|
break
|
|
end
|
|
u=new
|
|
end
|
|
|
|
return (u,en(u,V0,Eta0,rho,weights,d)*rho/2)
|
|
end
|
|
|
|
# Xi(u)=0 is equivalent to the linear equation
|
|
function Xi(u,V,V0,Eta,Eta0,weights,rho,d)
|
|
order=length(weights[1])
|
|
|
|
# init
|
|
out=zeros(Complex{Float64},order)
|
|
|
|
# compute E before running the loop
|
|
E=en(u,V0,Eta0,rho,weights,d)
|
|
|
|
for i in 1:order
|
|
# k_i
|
|
k=(1-weights[1][i])/(1+weights[1][i])
|
|
# S_i
|
|
S=V[i]-1/(rho*(2*pi)^d)*integrate_legendre_sampled(y->(1-y)/y^3,Eta[i].*u,0,1,weights)
|
|
# X_i
|
|
X=k^2/(2*E*rho)
|
|
|
|
# U_i
|
|
out[i]=u[i]-S/(2*E*(X+1))*Phi(S/(E*(X+1)^2))
|
|
end
|
|
|
|
return out
|
|
end
|
|
|
|
# derivative of Xi (for Newton)
|
|
function dXi(u,V,V0,Eta,Eta0,weights,rho,d)
|
|
order=length(weights[1])
|
|
|
|
# init
|
|
out=zeros(Complex{Float64},order,order)
|
|
|
|
# compute E before the loop
|
|
E=en(u,V0,Eta0,rho,weights,d)
|
|
|
|
for i in 1:order
|
|
# k_i
|
|
k=(1-weights[1][i])/(1+weights[1][i])
|
|
# S_i
|
|
S=V[i]-1/(rho*(2*pi)^d)*integrate_legendre_sampled(y->(1-y)/y^3,Eta[i].*u,0,1,weights)
|
|
# X_i
|
|
X=k^2/(2*E*rho)
|
|
|
|
for j in 1:order
|
|
y=(weights[1][j]+1)/2
|
|
dS=-1/rho*(1-y)*Eta[i][j]/(2*(2*pi)^d*y^3)*weights[2][j]
|
|
dE=-1/rho*(1-y)*Eta0[j]/(2*(2*pi)^d*y^3)*weights[2][j]
|
|
dX=-k^2/(2*E^2*rho)*dE
|
|
out[i,j]=(i==j ? 1 : 0)-(dS-S*dE/E-S*dX/(X+1))/(2*E*(X+1))*Phi(S/(E*(X+1)^2))-S/(2*E^2*(X+1)^3)*(dS-S*dE/E-2*S*dX/(X+1))*dPhi(S/(E*(X+1)^2))
|
|
end
|
|
end
|
|
|
|
return out
|
|
end
|
|
|
|
# energy
|
|
function en(u,V0,Eta0,rho,weights,d)
|
|
return V0-1/(rho*(2*pi)^d)*integrate_legendre_sampled(y->(1-y)/y^3,Eta0.*u,0,1,weights)
|
|
end
|
|
|