%% Obliczenia z wykorzystaniem symbolic toolbox w Matlabie
% przygotował dr inż Robert JAKUBOWSKI, Politechnika Rzeszowska, KSiSL
% Table of Contents
% Zmienne symboliczne, wyrażenia symboliczne, równania i funkcje
% Operacje upraszczające wyrażenia symboliczne
% Rozwiązywanie równań i układów równań na wyrażeniach symbolicznych
% Wizualizacja wyrażeń symbolicznych i funkcji
%% Zmienne symboliczne, wyrażenia symboliczne, równania i funkcje
% Zmienne symboliczne deklaruje się poprzez funkcję syms. Poniżej zdeklarowane zostanie x, y i z jako zmienene symboliczne

syms x y z

% Wyrażenia symboliczne tworzymy z wykorzystaniem zmiennych symbolicznych np:

f1=x^2+2*y^3
f2=-x+y^2+z^2

% W wyrażeniach symbolicznych można dokonać podstawień jednych zmiennych za drugie, lub też można podstawiać liczby za zmienne. Do postawień wykorzystuje się funkcję subs

f11=subs(f1,x,2)
f21=subs(f2,[x y],[1 3])
f13=subs(f1,[x y],[1 3])

% Nieco inny efekt uzyskamy podstawiając w miejsce pojedynczej zmiennej kilka elementów

f11_1=subs(f1,x,[1; 2; 3])

% Proszę sprawdzić jaka będzie różnica gdy w miejsce x podstawi się wektor będący werszem
% W przypadku gdy w miejsce x i y chcemy podstawić wektor, to pojawia się problem. Jedyną możliwą opcją jest najpierw podstawimy wektor za jedną zmiennną, a następnie za drugą, tyle że wtedy dostaniemy zwiększoną liczbę wyników. Za x już podstawiliśmy teraz podstawmy za y i zobaczmy wynik. Jest on podstawieniem y do kazdgo z wcześniej uzyskanych wyrażeń z podstawienia x.

b=[5; 5; 3];
f11_2=subs(f11_1,y,b)

% Równania możemy tworzyć pisząc zależnoćś od podstaw, lub wykorzystując wcześniej przygotowane wyrażenia symboliczne. Do zapisania równości prawej i lewej strony wykorzystuje się podwójny znak ==

r1=x^2-2*y==-2
r2=f1==-3*x
r3=f1==f2

% Funkcje okresla się jako wyrażenia zależne od innych zmiennych. Struktura funkcji fun(zm)=wyrażenie. Np funkcja zmiennej x

fun1(x)=2*x^3-5
fun2(x)=f1

% Pierwsza i druga  funkcja jest funkcją zmiennej x. Druga funkcja zawiera dodatkowo wyrażenie zmienną symboliczną y.
% Można też tworzyć funkcję wielu zmiennych, np z funkcji fun2 możemy zrobić funkcje fun3 zmiennej x i y

fun3(x,y)=fun2

% Obliczenia funkcji prowadzi się poprzez podstawienie wartości w miejsce zmiennej. np

f1_2=fun1(2)
f2_2=fun2(2)
f3_23=fun3(2,3)

% W przypadku fun1 i fun3 wynik końcowy jest liczbą, w przypadku fun2 otrzymaliśmy wyrażenie, które można obliczyć podstawiając z wykorzystaniem funkcji subs

f2_2=subs(f2_2,y,3)

% Do funkcji też można podstawić kilka zmiennych i wyznaczać dla nich wyniki. Np wyliczmy wartość fun3 dla x=1; 2; 4; i odpowiadających temu wartości y= 1; 1; 3

a=[1; 2 ;4];
b=[1; 1; 3];
f3_wekt=fun3(a,b)

% Otrzymane wyniki chociaż reprezentują liczby, to nie są liczbami. Można to sprawdzić funkcją whus

whos f3_wekt
whos a

% W uzyskanej informacj opcaj Class informuje nas, że zmienna f3_wekt jest zmienną symboliczną, a zmienna a jest zmienną numeryczną typu double
%
%% Operacje upraszczające wyrażenia symboliczne
% Poprzez funkcje wewnętrzne Matlaba można wykonać operacje upraszczajace wyrażenia symboliczne.

syms x
W1 = x*(x+2)^2 - 4*x

% Do rozwijania wyrażeń służy funkcja expand

W1_e=expand(W1)

% Do uproszczenia wyrażenia służy funkcja simplify

W1_s=simplify(W1)

% Do poszukiwania mnożników w wyrażeniu służy funkcja factor

W1_f=factor(W1)

% Otrzymaliśmy trzy elementy, które pomnożone przez siebi dają analizowane wyrażenie.
%
%% Rozwiązywanie równań i układów równań na wyrażeniach symbolicznych
% Rozwiązywanie równań i układów równań wykonuje się za pomocą funkcji solve. Przygotujmy równanie r1 zmiennej x i je rozwiążmy

clear variables
syms x y
r1=8*x^4-2*x==0

ob_r1=solve(r1)

% Otrzymaliśmy liczby w postaci wyrażeń symbolicznych, które podobnie jak poprzednio poprzez funkcję eval czy double można zamienić na wartości

ob_r1_val=eval(ob_r1)

% Uzyskane wyniki są wartościami zespolonymi oraz liczbami rzeczywistymi. Aby ograniczyć rozwiązanie do liczn rzeczywistych możemy nałożyć ograniczenia na zmienną x poprzez funkcję assume. Naprzykład ograniczmy ją do liczb rzeczywistych i rozwiązmy równanie

assume(x,'real')
ob_r1=solve(r1)

% Obecnie otrzymaliśmy jako wynik dwie wartości zamiast czterech. Gdy jescze założymy dodatkowo, że x>0 to powinniśmy dostać jedno rozwiązanie

assumeAlso(x>0)
ob_r1=solve(r1)

% Do wycofania ograniczeń położonych na zmienną służy komenda assume z parametrem clear

assume(x,'clear')

% Podobny efekt narzucenia zmiennej symbolicznej określonego ograniczenia można uzyskać bezpoścrednio przy dklaracji zmiennej np.

syms x real

% Sparwdzenie nałożonych ograniczeń na zmienną jest dostępne funkcją assumptions

assumptions(x)
assumeAlso(x>y)
assumptions(x)

% W przypadku, gdy rozwiązujemy równanie z kilkoma zmiennymi, jeden z nich będzie traktowany jako poszukiwana niewiadoma, a pozostałe jako parametry. Dlatego gdy weżmiemy  równanie r2 o zmiennych x lub y, to możemy go rozwiązać

assume(x,'clear')
r2=x^2-y^3==3
ob_r2_x=solve(r2,x)
ob_r2_y=solve(r2,y)

% Aby uzyskać w tym wypadku określoną wartość trzeba za występującą zmienną podstawić określoną wartość na z wykorzystaniem funkcji subs i double jak przedstawiono poniżej

ob_r2_y_val=double(subs(ob_r2_y,x,1))

% Rozwiązywanie układów równań realizuje się w podobny sposób. Wykorzystamy równania r1 i r2 zmiennych x i y do znalezienia wartości x i y spełniających te równania

r1=x-2*y+3==0
r2=x^2+y^2==25
[x_ob,y_ob]=solve([r1,r2],[x,y])

%  Zamieńmy wynikowe wielkości symboliczne na wartości liczbowe

x_ob_val=double(x_ob)
y_ob_val=double(y_ob)

% Gdy na rozwiązywany układ narzucimy ograniczenie, że interesuje nas rozwiązanie dla x i y większych od 0 to otrzymamy

assume([x y], 'positive')
[x_ob,y_ob]=solve([r1,r2],[x,y]);
[x_y_ob_val]=double([x_ob,y_ob])

%
%% Wizualizacja wyrażeń symbolicznych i funkcji
% Wyrażenia symboliczne można wizualizować za pomocą funkcji fplot. Standardowe wywołanie bez żadnych dodatkowych zmiennych rysuje funkcjię w zakresie od -5 do 5

clear variables
syms x y
f1=3*x^3-2*x-1
fplot(f1)
grid on

% Można zmienić przedział rysowania wprowadzając dodatkowy wektor zawierający początek i koniec przedziału np

fplot(f1,[-2 3])
grid on

% Chcąc dodać kolejny wykres, zatrzymujemy istniejący funkcją hold on i dodajemy kolejny. po zakończeniu zwalniamy blokowanie wykresu funkcją hold off. kolejny wykres rysowany później nie jest dodawny, tylko zastępuje narysowane wcześniej wykresy.

hold on
f2=(sin(x/2))*x^2
fplot(f2,[-2,3],'r-p')
hold off

% Ostatnii parametr użytej funkcji fplot zawiera specyjikację rodzaju linii. Można to definiować na róąne sposoby. Szcegóły odnośnie sposobów definiowania wykresów proszę doczytać w poradnikach Matlaba
% Do wizualizacji funkcji dwóch zmiennych można użyć funkcji fimplicit. Pokżmy to na podstawie funkcji równania okręgu

f3=x^2+y^2
fimplicit(f3==4)
hold on
fimplicit(f3==25)
grid on
hold off

% Dla rysowania wielu obrysów od razu mlożna wykorzystać funkcję fcontour.

fcontour(f3)

% Możemy też zdefiniować cechy rysowanych obrysów. Jak przedstawiono poniżej, po nzawie rysowanej funkcji zdefiniowano obszar rysowania, a później w opcjach za pomocą LevelList wartości stanowiące rozwiązanie funkcji

fcontour(f3,[-6 8 -5 6],'LevelList',[0.5 1 4 25])
grid on

% Funkcję dwóch zmiennych można także przedstawić przestrzennnie za pomocą funkcji fsurf.

fsurf(f3)

%
% Trójelementowe wyrażenie lub funkcję można przedstawić w przestrzeni wykorzystując funkcję fimplicit3. Spełnienie warunku że funkcja 3 zmiennych = a przedstawiono poniżej

syms z
f3D=12*x^2+3*y^2-(z-2)^2
fimplicit3(f3D==1)

% Narysujmy dwoma róznymi sposobami funkcję f3D = 1 i f3D=25

fimplicit3(f3D==1)
hold on
fimplicit3(f3D==25,'EdgeColor',"none")
view([-36.30 42.97])

% Pozostałe działania na wyrażeniach symbolicznych zostaną przedstawione w następnym wykładzie