%% Rozwiązywania rwnań nieliniowych przyklady
% Do uruchomienia skryptu nalezy otworzyc go w Matlabie i wlaczyc zielina strzalke Run
% W ustawieniach Matlaba prponuje zmienic wyświetlanie liczb z większą precyzją
% Preferences - MATLAB - Command Window - Text display - Numeric format - Long
%
%% Przyklad przygotowania funkcji i jej graficzna wizualizacja

% przygotowujemy funkcję zmiennej x 
fx=@(x) sin(2.*x.^2)-(x-0.2).^2+0.9;
% rysiujemy funkcję w wybranym przedziale x1 x2 uzywajac funkcji Matlaba fplot
x1=-2;
x2=2;
fplot(fx,[x1 x2])
% dodajemy siatkę i zatrzymujemy rysunek
grid on
hold on

%
%% Poszukiwanie rozwiazania
% Poszukiwane rozwiazanie lezy w przedziale -1.5 do -1 i drugie w przedziale 1 do 1.5. Wykorzystujac funkcje do obliczen metoda bisekcji znajdziemy pierwsze rozwiazanie

% Przygotowanie danych wejsciowych - okreslenia przedizalu poszukiwania rozwiazania
x1=-1.5;
x2=-1;
%określenie dokadności rozwiązania
e=1e-3;
% Wykorzystanie funkcji metoda_bisekcji do wyznaczenia rozwiązania 
% (bez średnika na końcu aby zobaczyc wyniki
[x0,f0,n]=metoda_bisekcji(fx,x1,x2,e)

% Pokzanie rozwiązania na wykresie
plot(x0,f0,'ro')

%% Zadania do samodzielnego rozwiazania
%% 1 Znajdz drugie rozwiazanie wykorzystujac metode bisekcji i przedstaw je na wykresie
% Możesz skopiowac powyzsze rozwiazanie i je odpowiednio zmodyfikowac. Uzyj do rozwiązania nowych zmiennych x02, f02 i n2




%% 2 wyznacz ile krokow bedzie wymagalo rozwiazanie gdy zwiekszysz dokladnosc do poziomu e=1e6
% Poszukaj rzwiązania dla drugiego przedzialu. Do zmiennych wyjściowych dodaj 2 na koncu: x022 itp.
% Uzyj n22 jako zmiennej do wyznaczania ilosci krokow rozwiazania w tym wypadku i porowanaj z wrtoscia n z poprzedniego rozwiazania, pokaż rozwiązanie tak jak robi to przedstawiona poniżej funkcja dla wcześniejszego rozwiązania

disp(['liczba krokw iteracji = ',num2str(n2)])



%% 3 Napisz wlasna funkcje do obliczen metoda regula falsi i wykonaj obliczenia ta metoda
% Wskazowka: mozesz skopiowac funkcje metoda_bisekcji i wkleic ja ponizej. Nastepnie zmien nazwe na nowa np regula_falsi i zmodyfikuj kod we wasciwych miejscach.
% W  kolejnych krokach wykonaj obliczenia dla wskazanych wyzej przedzialow przy tej samej dokladnosci rozwiazania. porownaj ilosc krokow potrzebnych do rozwiazania oraz uzyskane wyniki. Dla zroznicowania zmiennych możesz dodac _rf, np. x02_rf






%
%% Funkcje wlasne przygotowane do obliczeń
% function [x0,f0,n]=metoda_bisekcji(f,x1,x2,e)

function [x0,f0,n]=metoda_bisekcji(f,x1,x2,e)

%Funkcja rozwiązuje równanie f(x)=0 w przedziale od x1 do x2. e jest
%wskażnikiem charakteryzującym dokładność rozwiązania, gdy nie jest zadany
%przyjmuje wartość e=1e-6
%Wartościami wyjściowymi są
% x0 - wartość rozwiązania (x dla którego f(x)=0)
% f0  - wartość rozwiązania f=0+-e
% n - ilość kroków

% Warunke sprawdzający 
if exist('e','var')==0
    e=1e-6;
end
% Wyznaczenie wartości funkcji od x1
f1=f(x1);
% Wyznaczenie wartości funkcji od x2
f2=f(x2);
% Ustawienie wartości licznika do liczenia ilości kroków iteracji
n=0;


if abs(f1)<e
    % w tym przypadku x1 jest rozwiązaniem
    x0=x1;
    f0=f1;
elseif abs(f2)<e
    % w tym przypadku x2 jest rozwiązaniem
    x0=x2;
    f0=f2;
elseif f1*f2>0
    % w tym przypadku brakuje rozwiązania
    f0=NaN;
    x0=NaN;
else
    % w tym przypadku poszukiwane jest rozwiązanie
    while abs(f1)>e && abs(f2)>e
        n=n+1;
        %Poszukiwanie rozwiązania metodą połowienia przedziału
        x3=(x2+x1)/2;
        f3=f(x3);

        if f1*f3<0
            x2=x3;
            f2=f3;
        else
            x1=x3;
            f1=f3;
        end
    end
    %Przypisanie rozwiązania do zmiennych wyjściowych 
    x0=x3;
    f0=f3;
end
end

% function [x0,f0,n]=regula_falsi(f,x1,x2,e)


