%% GAUSS elimination 

A = input("Enter matrix") ;
B = input("Enter source vector");
N = length(B);
X = zeros(N,1);
Aug = [A B];

for j = 1:N-1
    for i = j+1:N
        m = Aug(i,j)/Aug(j,j);
        Aug(i,:) = Aug(i,:) - m*Aug(j,:);
    end
end

Aug 

X(N) = Aug(N, N+1)/Aug(N,N) ;

for k = N-1:-1:1
    X(k) = (Aug(k , N+1) - Aug(k, k+1:N)*X(k+1:N))/ Aug(k,k);
end 

X


%% GAUSS SEIDEL 

A = input("Enter matrix") ;
B = input("Enter source vector");
N = length(B);
X = zeros(N,1);
n = 10 ;
Y = zeros(N,1);
P = input('initial giess vector ');
e = 0.0001;


for j = 1:n
    for i = 1:N
        X(i) = (B(i)/A(i,i)) - (A(i, [1:i-1, i+1:N]) * P([1:i-1, i+1:N])) / A(i,i);
        P(i) = X(i);
    end 
    if abs(Y-X)<e
        break
    end 
    Y=X;

end 

X


%% POWER METHOD 

A = input("Enter matrix") ;
v = input("Enter guess");
n = 30 ;
e = 0.001 ;
M = 0 ;
vO = v ;

for j = 1 :n 
    v = A*vO ;
    M = max(v);
    v = v/M ;
    if abs(v-vO)<e
        break
    end
    vO = v ;
end 

B

%% NEWTON 

clc 
clear all

f = @(x) 2^x - 5*x + 2 ;
df = @(x) log(2)*(2^x) - 5 ;
e = 0.00000000000001 ; 
xO = 0 ;
n = 10 ;

for i = 1:n 
    x1 = xO - f(xO)/df(xO);
    if abs(x1-xO) < e
        break ;
    end
    xO = x1 ;
    disp(xO)
end 

%% SECANT 


f = @(x) x - 5*x^2 + 2 ;
e =0.000000000000000000001 ;
x0 = 0 ;
x1 = 1 ;
x2 = 0 ;
n = 10 ;

for i = 1:n
    x2 = (x0*f(x1) - x1*f(x0))/(f(x1) - f(x0));
    if abs(x2-x1)<e
        break
    end 
    disp(x2)
    x1 = x2;
    x0 = x1;

end 

%% FIXED POINT 

f = @(x) 2^x -5*x + 2 ;
g = @(x) (2^x + 2 )/5 ;

e = 0.00001 ; 
xO = 0 ;
n = 10 ;
x1 = 0 ;


for i = 1:n
    x1 = g(xO);
    if abs(xO-x1)<e
        disp(x1)
        break
    end 
    xO = x1 ;    
end



%%BISECTION 


clc
clear ALL

f = @(x) 2^x - 5*x + 2 ;
a = 0 ;
b =1 ;
n = 30 ;
e =0.0001 ;

c = 0 ;

if f(a)*f(b)<0
    for i=1:n
        c = (a+b)/2 ;
        if abs(c-b) < e || abs(c-a) <e
            disp(i)
            break;
        end 
        if f(a)*f(c)<0
            b = c ;
        elseif f(b)*f(c)<0
            a = c ;
        end 
    end 

else 
    disp('no') ;

end 

disp(c)