% Table of Contents
% Obiekty skalarne rzeczywiste
%     Podstawowe działania na liczbach rzeczywistych.
% Liczby zespolone
% Zmienne i obiekty symboliczne
% Funkcje
%     Definiowanie funkcji
%     Rozwiązywanie prostych równań
%     Rozkład wielomianu na czynniki
%     Rozkład funkcji wymiernej na sumę ułamków prostych
%     Inne równania
% Dobra praktyka: rozpoczynamy skrypt od wyczyszczenia przestrzeni roboczej i zamknięcia wszystkich obrazków.

clear; 
close all;

%
%% Obiekty skalarne rzeczywiste
%
% Wielkości skalarne tworzymy w następujący sposób:

a=3
b=4.1;   % średnik powoduje, że wynik operacji nie jest wyświetlany
c=pi     % stała pi
format long    % zmieniamy sposób wyświetlania wyniku
c
format short    % wracamy do typowego sposobu wyświetania liczb
c-a

%
%% Podstawowe działania na liczbach rzeczywistych.
% Działania arytmetyczne:

a+b
a-b
a*b          % mnożenie
a/b          % dzielenie a:b
a\b           % dzielenie b:a
b^a          % potęgowanie
a*b+c
a*(b+c)

% Moduł - wartość bezwzględna \left|a\right| -   abs(a)

abs(-pi)

% Pierwiastek kwadratowy  \sqrt{a}  -  sqrt(a)

sqrt(10)

% Pierwiastek rzeczywisty stopnia n:  \sqrt[n]{a} -   a^(1/n)

7^(1/5)
nthroot(7,5)

% Funkcja wykładnicza    e^a:    exp(a),   stała e:    exp(1)

exp(1)         % stała e
exp(2)         % e^2

% Logarytm naturalny:   log(a),   logarytm dziesiętny:    log10(a)

log(5)
log10(5)

%
%% Liczby zespolone

clear

% Liczby zespolone tworzymy używając literki i lub j do oznaczenia jednostki urojonej

z1=1+1i
z2=2-2j

%
% Działania na liczbach i zmiennych zespolonych wykonujemy używając typowych symboli.

z1+z2
z1-z2
z1*z2
z1/z2

%
% Sprzężenie liczby zespolonej z dostaniemy pisząc z' lub conj(z)

(1+2j)'
conj(z2)

%
% Należy uważać, żeby niechcący nie zapisać pod zmienną i czy j innej wielkości.

i=5
1+3i
1i   % to jest jednostka urojona
i    % a to już nie jest jednostka urojona
1+3*i
clear

%
% Część rzeczywistą liczby zespolonej otrzymujemy za pomocą funkcji  real,
%  jej część urojoną za pomocą funkcji  imag.
% Moduł liczby zespolonej otrzymujemy za pomocą funkcji  abs,
% a jej argument (w radianach) za pomocą funkcji  angle.

real(1+3i)
imag(1+3i)
abs(1+3i)  % moduł
angle(-1+3i)  % argument - wynik w radianach
rad2deg(angle(-1-3i))  % zamiana radianów na stopnie

%
%% Zmienne i obiekty symboliczne
% Wielkość numeryczną możemy zamienić na symboliczną za pomocą operacji   sym()

 clear 

% Wartości zmiennych symbolicznych są dokładne:

sym(4.2)    % ułamek dziesiętny zostanie zamieniony na ułamek zwykły
z1=-2+2i
z3=sym(z1)
real(z3)
imag(z3)
abs(z3)
angle(z3)    % argument w radianach
rad2deg(angle(z3))   % zamiana argumentu z radianów na stopnie

%

a=sym(-1-3j)
arg_a=angle(a)  % argument główny w radianach
st_arg_a=rad2deg(arg_a) % zamiana radianów na stopnie
abs(a)

%
% Pierwiastki z liczb zespolonych
% Przykład  \sqrt[3]{16}

16^(1/3)   % wartość przybliżona, numeryczna (dla inżynierów)
nthroot(sym(16),3)   % wartość dokładna
sym(16^(1/3))   % wartość przybliżona zamieniona na najbliższy ułamek zwykły
sym(16)^(1/3)   % wartość dokładna (dla matematyków)

%
% Przykład: obliczymy   \sqrt[3]{-8j}

(-8j)^(1/3)    % dostaniemy tylko jeden z trzech pierwiastków
sym(-8j)^(1/3)
sym((-8j)^(1/3))

%
%% Funkcje
%% Definiowanie funkcji
% Do tworzenia zmiennych i wyrażeń i funkcji symbolicznych wykorzystujemy polecenie syms, np.

syms x
f(x)=x^3+8j    % w definicji funkcji pojawia się zadeklarowana wcześniej zmienna x

g=x^4        % przy definiowaniu nie musimy podawać argumentu, 
            % można napisać g=... lub g(x)=...
f(-2j)         % obliczenie wartości
subs(g,x,2j)     % do wyrażenia oznaczonego symbolem g podstawiamy za x wartość 2j

h=@(x) cos(3*x) % inny sposób definiowania funkcji: funkcja anonimowa
h(pi/4)
h(g)

%
%% Rozwiązywanie prostych równań
% Możemy rozwiązać równanie  f=0  za pomocą  operacji  solve:

solve(f)    % dostaniemy wszystkie rozwiązania równania f(x)=0

% Matlab radzi sobie dobrze z dowolnymi równaniami wielomianowymi.
% Równość zapisujemy używając symbolu ==

solve(g==4)          % dostaniemy wszystkie pierwiastki równania x^4=4
rozw=solve(x^6==16) % dostaniemy wszystkie pierwiastki szóstego stopnia liczby 16
eval(rozw)          % polecenie eval zamienia wielkości dokładne na numeryczne

% Czasami Matlab nie podaje rozwiązań w jawnej  postaci

syms x
w(x)=x^5+2*x^4-3*x^2+16
s=solve(w(x),x)

% W takiej sytuacji możemy uzyskać przybliżone wartości rozwiązań (wyrażenia symbolicznego)
% używając polecenia    vpa(wyrażenie, liczba_cyfr)

vpa(s)
vpa(s,7)

%
% Gdy chcemy wyznaczyć pierwiastki wielomianu  w\left(x\right)=a_{n\;\;} x^n +\cdots +a_1 x+a_0,
% możemy też wykorzystać operację   roots([a_n ,\cdots ,a_1 ,a_0]).
% Na przykład pierwiastki wielomianu  w\left(x\right)=x^3 +8j  wyznaczymy jak niżej

r1=roots([1,0,0,8j])       %  zwraca wartości numeryczne         
r2=roots(sym([1,0,0,8j]))  
% zwraca wartości dokładne, gdy współczynniki wielomianu zapiszemy w postaci symbolicznej
r3=sym(roots([1,0,0,8j]))  % uwaga na kolejność poleceń!

%
%% Rozkład wielomianu na czynniki
% Rozkład wielomianu na czynniki nierozkładalne dostaniemy za pomocą polecenia
% factor(wielomian, zmienna, opcje)

syms x
w(x)=x^4-x^2+16
wx=factor(w(x), x, 'FactorMode', 'real') % dostaniemy czynniki nierozkładalne nad R
wc=factor(w(x), x, 'FactorMode', 'complex') % dostaniemy czynniki liniowe zespolone
wz=factor(w, x, 'FactorMode', 'full')  % dostaniemy czynniki liniowe dokładne

%
%% Rozkład funkcji wymiernej na sumę ułamków prostych
% Aby zapisać funkcję wymierną w postaci sumy ułamków prostych,
% używamy polecenia    partfrac(funkcja, zmienna, opcje)

syms x;
f(x)=(x^2-3*x+6)/(x^4-5*x^2+4)
partfrac(f(x),x)

g(x)=(x^5+4*x^2+1)/(x^4-1)
u_R=partfrac(g(x),x)
u_C=sym(partfrac(g(x),x,'FactorMode','full'))

u(x)=(4*x^2+1)/(x^3+2)
h_R=partfrac(u(x),x,'FactorMode', 'real')
h_C=partfrac(u(x),x,'FactorMode', 'complex')
h_f=partfrac(u(x),x,'FactorMode', 'full')

%
%% Inne równania
% Do rozwiązywania równań bardziej skomplikowanych można wykorzystać polecenie
% solve(równanie, zmienne, opcje)
% Wyznaczymy rozwiązania równania  \sin^2 \left(2x\right)=\frac{1}{2}

syms x
solve(sin(2*x)^2==1/2,x)  

% Jeśli rozwiązań jest wiele, to program zwykle zwraca tylko jedno, to najbliższe zera.
% Możemy zażądać wypisania postaci wszystkich rozwiązań, dopisując opcję
% 'ReturnConditions', true
% Rozwiązania dostaniemy opisane jako trójkę:  [rozw, parametry, warunki]

[rozw, parametry, warunki]=solve(sin(2*x)^2==1/2,x,'ReturnConditions', true) 

%
% Chcemy wyznaczyć rozwiązania równiania z^3 ={\bar{z} }^3

syms z
solve(z^4==2*(z')^3,z)
[roz, param, cond]= solve(z^3==(z')^3,z,'ReturnConditions', true)

%%