%% Assignment #1, Problem 4

%% Solving linear system (i)
% Gaussian elimination gives a matrix U with nonzero diagonal elements,
% hence there is a unique solution.

A = [1,2;2,1]
[L,U,p] = lu(A,'vector'); U            % matrix U from Gaussian elimination
b = [3;4]
x = A\b                                % unique solution

%% Plotting lines for linear system (ii)
% The two lines intersect in a single point x
% which is the solution of the linear system we found before.

L1 = diag( b(1)./A(1,:) )              % two points satisfying eq.1
L2 = diag( b(2)./A(2,:) )              % two points satisfying eq.2

plotpoints(L1); hold on                % plot line for eq.1
plotpoints(L2,'--')                    % plot line for eq.2
plotpoints(x,'ko'); label(x,'x')       % plot solution point
hold off
axis equal; grid on; title('Two lines intersect at solution point x')
legend('equation 1','equation 2')

%% Solving linear system (ii)
% Gaussian elimination fails, it does not give  matrix U with nonzero diagonal elements.
% Hence the matrix A is singular. So the linear system has either no solution or infinitely many solutions.
%
% Using \ with machine arithmetic gives a warning that the matrix is singular within machine precision.
%
% Using \ with symbolic arrays gives a message that no solution exists.

A = [1,2;2,4]
[L,U,p] = lu(A,'vector'); U            % matrix U from Gaussian elimination
b = [3;4]
% Using Matlab with machine arithmetic
x = A\b                                % Matlab gives Inf (infinity)
% Using symbolic computation:
x = sym(A)\sym(b)                      % symbolic \ gives warning that no solution exists

%% Plotting lines for linear system (ii)
% Here the two lines are parallel and do not intersect
% since the linear system has no solution.

L1 = diag( b(1)./A(1,:) )              % two points satisfying eq.1
L2 = diag( b(2)./A(2,:) )              % two points satisfying eq.2

plotpoints(L1); hold on                % plot line for eq.1
plotpoints(L2,'--'); hold off          % plot line for eq.2
axis equal; grid on; title('The two lines are parallel, there is no solution')
legend('equation 1','equation 2')

%% Solving linear system (iii)
% Since A is singular there is either no solution or infinitely many solutions.
%
% Note that the backslash command in machine arithmetic gives a warning "matrix is singular to working precision". But it does not return any solution (despite the fact that there are solutions). 
%
% Using symbolic computation in Matlab we obtain a particular solution xpart, and a basis V for the null space (one vector). Hence the solution is given by a line xpart+t*V with arbitrary t.

b = [3;6]
% Using Matlab with machine arithmetic
x = A\b                                % Matlab gives NaN (not a number)
% Using symbolic computation:
xpart = sym(A)\sym(b)                  % symbolic \ gives one solution and
                                       % warning that more solutions exist
V = null(sym(A))                       % basis for null space

%% Plotting lines for linear system (iii)
% Here the two lines are parallel and do not intersect
% since the linear system has no solution.

L1 = diag( b(1)./A(1,:) )              % two points satisfying eq.1
L2 = diag( b(2)./A(2,:) )              % two points satisfying eq.2

plotpoints(L1,'c','LineWidth',3); hold on    % plot line for eq.1
plotpoints(L2,'b--','LineWidth',3); hold off % plot line for eq.2
axis equal; grid on; title('The two lines are identical, all points on line are solution')
legend('equation 1','equation 2')


