function [g, lE] = gsolve(Z,B,l)

% Solves for imaging system response function


n = 256;

A = double(zeros(size(Z,1)*size(Z,2)+n+1, n+size(Z,1)));
b = double(zeros(size(A,1),1));

k = 1;
for i=1:size(Z,1)
    for j=1:size(Z,2)
        wij = w(Z(i,j)+1);
        A(k,Z(i,j)+1) = wij;    A(k,n+i) = -wij;      b(k,1) = wij * B(i,j);
        k = k + 1;
    end
end

%% Fix the curve by setting its middle value to 0

A(k,129) = 1;
k = k + 1;

%% Include the smoothness equations

for i = 1:n-2
    A(k,i)=l*w(i+1);         A(k,i+1) = -2*l*w(i+1);   A(k,i+2)=l*w(i+1);
    k = k + 1;
end

%% Solve the system using SVD
x = A\b;

g = x(1:n);

lE = x(n + 1:size(x,1));
    
end
