WOJSKOWA AKADEMIA TECHNICZNA Wydział Mechatroniki NUMERYCZNE METODY OBLICZENIOWE |
---|
ĆWICZENIA LABORATORYJNE Temat: Rozwiązywanie równań nieliniowych i układów równań liniowych Prowadzący: dr inż. Marek Gąsiorowski dr inż. Leszek Baranowski Ocena: ……………. |
Grupa |
L9X1S1 |
Wykonał: GAŁUSZKA Michał |
1.Cel ćwiczenia:
Nauczyć wykorzystywania odpowiednich funkcji stosowanych w Matlabie do rozwiązywania równań nieliniowych (funkcje: fzero i roots) oraz układów równań liniowych (funkcje: inv, dzielenie lewostronne \ oraz det).
2. Treść laboratorium
Zad. 1. Napisać skrypt programu, który dla wartości n wczytanej z klawiatury generuje układ n - równań liniowych o n niewiadomych postaci:
gdzie: - macierz losowo wygenerowanych współczynników,
- wektor wyrazów wolnych .
Sprawdź czy macierz współczynników jest nieosobliwa (det(A)≠0).
Porównaj czas trwania i dokładność rozwiązania układu równań wykorzystując:
- na ocenę dobry – dwie poznane funkcje w Matlabie.
- na ocenę bardzo dobry – trzy poznane funkcje w Matlabie.
Zad. 2. Napisać skrypt programu, który dla wartości n wczytanej z klawiatury wczytuje współczynniki wielomianu postaci:
oraz znajduje pierwiastki tego wielomianu wykorzystując:
- na ocenę dobry – dwie poznane funkcje w Matlabie.
- na ocenę bardzo dobry – napisaną samodzielnie procedurę numerycznego rozwiązywania równań nie liniowych.
Zad. 3. Napisać skrypt programu, który wyznacza miejsca zerowe funkcji
gdzie n – numer w dzienniku.
Opis:
Zadanie 1
Rozwiązanie układu równań liniowych o postaci:
[1]
polega na znalezieniu wartości zmiennych jeśli znane są wartości współczynników i .
Układ [1] można zapisać za pomocą sumy:
lub w postaci macierzowej:
AX=B
gdzie:
A = B = X =
Jeśli macierz A jest nieosobliwa (det A ≠ 0) to układ [1] posiada tylko jedno rozwiązanie. W całym rozdziale zakładamy, że macierz A i wektor B są rzeczywiste.
Istnieje wiele metod znajdowania rozwiązania układu [1].
wzory Cramera,
metoda Gaussa.
b)Wzory Cramera
Jeśli macierz A jest nieosobliwa to układ [1] jest oznaczony i można wykazać, że rozwiązania dokładne ma postać:
gdzie:
Ai =
jest macierzą utworzoną z macierzy A, w której w miejsce i-tej kolumny wstawiono wektor B. Metoda oparta na wzorach Cramera wymaga obliczenia wartości n+1 wyznaczników. Dla dużych układów równań metoda ta jest mało efektywna ze względu na dużą złożoność obliczeniową oraz istotny wpływ błędów operacji arytmetycznych.
Metoda eliminacji Gaussa.
Metoda eliminacji Gaussa jest najbardziej efektywną metodą rozwiązywania dowolnych układów równań liniowych. Metoda eliminacji Gaussa polega na sprowadzeniu układu równań AX=B do układu o postaci A(n)X=B(n) gdzie A(n) jest macierzą trójkątną górną, a następnie rozwiązaniu tego trójkątnego układu równań.
Niech dany będzie układ równań:
zakładając że pomnóżmy pierwsze równanie przez i odejmijmy od i-tego równania , otrzymamy wtedy
gdzie , .
Następnie pomnóżmy drugie równanie przez () i odejmijmy od i-tego równania , otrzymamy więc
gdzie , .
Kontynuując takie postępowanie otrzymamy układ trójkątny
gdzie , ,
.
Rozwiązanie tego układu równań jest proste. Rozwiązujemy go od „tyłu” tzn. obliczamy kolejno wg wzorów:
.
Zadanie 2
Przy rozwiązywaniu równań poszukujemy pierwiastków równań, maksimów i minimów funkcji. Pierwiastki rzeczywiste równania, (czyli miejsca zerowe) →f(x)=0. W Matlabie funkcja fzero wyszukuje pierwiastek równania w pobliżu zadanej wartości zmiennej. Czyli do znalezienia wszystkich pierwiastków równania trzeba podać okolice gdzie ma on występować.
W przypadku wielomianów wartości funkcji wyszukuje się poprzez funkcje roots(c), gdzie c jest wektorem współczynników wielomianu.
Zadanie 3
Program ma za zadanie znaleźć miejsce zerowe funkcji f(x) = $\frac{1}{n}$x2 + sin(nx) – n
w pobliżu miejsca, które poda użytkownik. Ponadto program wykorzystuje funkcję, która przez obliczanie wartości funkcji znacząco usprawnia działanie programu. Skrypt rysuje również pomocniczy wykres, dzięki któremu użytkownik może w łatwy sposób podać przybliżoną wartość miejsca zerowego, która jest niezbędna w funkcji fzero.
Algorytmy
Zadanie 1
Zadanie 2
Zadanie 3
Kod źródłowy programu
Zadanie 1
%zadanie 1
clc
clear
n=input('Wprowadź wartość n= ');
%Tworzenie Macierzy kwadratowej A
for j=1:n
for i=1:n
A(i,j)=7*randn;
end
end
A
%skrypt generujący macierz B
B=sum(A.');
B=B';
%Przyrównanie wyznacznika do zera (macierz osobliwa)
o=det(A);
if o==0
disp('Macierz współczynników jest osobliwa!')
disp('Nie można obliczyć wartości macierzy niewiadomych X')
else
disp('Macierz jest nie osobliwa');
tic %zaczyna mierzyć czas
X1=inv(A)*B;
t1=toc; %kończy mierzyć czas pierwszej metody
%Metoda 2
tic %zaczyna mierzyć czas obliczeń
X2=A\B;
t2=toc; %kończy mierzyć czas obliczeń drugiej metody
%Wyświetleie wyników
disp('Wynik układu równań:')
disp('Wynik dla macierzy odwrotnej');
X1
disp('Wynik dla metody lewostronnej odwrotnej');
X2
disp(['Czas metody t1= ',num2str(t1),' s. Czas metody t2= ', num2str(t2),' s.'])
X1c=0;
X2c=0;
for i=1:n
X1c=(1-X1(i))^2+X1c;
end
for i=1:n
X2c=(1-X2(i))^2+X2c;
end
disp([' '])
disp(['dokladnosc dla x1= ', num2str(X1c)])
disp(['dokladnosc dla x2= ', num2str(X2c)])
end
if X1c>X2c'
disp('Metoda liczenia za pomocą dzielenia lewostronnego jest dokładniejsza.')
else
disp('Metoda liczenia za pomocą dzielenia lewostronnego jest dokładniejsza.')
end
Zadanie 2
clc;
clear;
disp('zadanie 2')
n=input('podaj wartosc n: ');
for i=1:n+1
a(i)=input('wprowadz wspolczynnik: ');
end
save dane2
% wykorzystanie funkcji roots
pier1=roots(a)
f=-15:0.001:15;
y=polyval(a,f);
plot(f,y)
xlabel('x')
ylabel('y')
grid on
% wykorzystanie funkcji fzero
u=1;
i=1;
while u~=0
disp('Odczytaj z wykresu przybliżone miejsce zerowe')
x0=input('i wprowadz mniejsce rozpoczęcia poszukiwań: ');
disp(' ')
pier2(i)=fzero('W',x0);
i=i+1;
disp('Wprowadz 0 aby wyświetlic wszytkie policzone pierwiastki');
u=input('lub inna liczbe aby ponownie wprowadzic miejsce poszukiwan pierwiastka ');
disp(' ')
end
disp('Pierwiastki danego wielomianu wynosza :')
disp([num2str(pier2)])
podprogram
function y = w(x)
load dane2
j=n;
y=0;
for i=1:n+1
y=y+a(i).*x.^j;
j=j-1;
end
end
Zadanie 3
clc
clear
n=input('wprowadz numer z dziennika: ');
while n==0
disp('nie mozna dzielic przez 0')
n=input('podaj jeszcze raz numer z dziennika: ');
end
save wartosc
hold on
grid on
x=-10:0.01:10;
y=(1/n)*(x.^2)+sin(n*x)-n;
plot(x,y)
x0=input('podaj argument ktory okresli poczatkowe przyblezenia wartosci szukanego miejsca zerowego: ');
pier=fzero(@g,x0);
disp(['miejsce zerowo w okolicy podanej wartości to: ',num2str(pier)]);
podprogram
function h=g(x)
load wartosc
h=(1/n)*(x.^2)+sin(n*x)-n;
end
Przykłady i wyniki obliczeń
Zadanie 1
A =
-1.1135 1.1174 0.0859 0.7481 0.4882 1.5877
-0.0068 -1.0891 -1.4916 -0.1924 -0.1774 -0.8045
1.5326 0.0326 -0.7423 0.8886 -0.1961 0.6966
-0.7697 0.5525 -1.0616 -0.7648 1.4193 0.8351
0.3714 1.1006 2.3505 -1.4023 0.2916 -0.2437
-0.2256 1.5442 -0.6156 -1.4224 0.1978 0.2157
Macierz nie jest osobliwa
Wynik układu równań:
X1 =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
X2 =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
Czas metody t1= 6.4343e-005 s. Czas metody t2= 4.0145e-005 s.
Błąd obliczeń przy wykorzystaniu macierzy odwrotnej wynosi 4.4409e-016
Błąd obliczeń przy wykorzystaniu dzielenia lewostronnego wynosi 8.8818e-016
Metoda liczenia za pomocą dzielenia lewostronnego jest dokładniejsza.
Zadanie 2
Wprowadź wartość n= 4
Podaj wartość współczynnika a1 dla x^4 : 3
Podaj wartość współczynnika a2 dla x^3 : 3
Podaj wartość współczynnika a3 dla x^2 : 2
Podaj wartość współczynnika a4 dla x^1 : 1
Podaj wartość współczynnika a5 dla x^0 : 3
Podaj miejsce początku poszukiwań: 4
Exiting fzero: aborting search for an interval containing a sign change
because or Inf function value encountered during search.
(Function value at -0.75792e+078 is Inf Check function or try again with a different starting value. .) (wystąpił taki komunikat ponieważ fzero nie liczy pierwiastków liczb zespolonych)
Miejsce zerowe wielomianu w pobliżu punktu x0: NaN
Miejsca zerowe znalezione za pomocą funkcji roots:
-0.8153 + 0.6405i
-0.8153 - 0.6405i
0.3153 + 0.7216i
0.3153 - 0.7216i
Zadanie 3
wprowadz mniejsce rozpoczęcia poszukiwań 13
Miejsce zerowe wielomianu w pobliżu punktu x0: 12.7719
Analiza wyników i wnioski
Zadanie 1
Najprostszym sposobem obliczania równania macierzowego A*X=B to sposób drugi, tzn. mnożenie przez odwrotność macierzy, gdzie: A* A-1=I, I macierz jednostkowa równa 1. Co pozwala na wykonać działanie A* A-1*X=B, czyli X= B* A-1. Odwrócenie macierzy ułatwia mi funkcja w Matlabie „inv(A)”, jeśli wyznacznik macierzy A (det(A)) jest różne od 0. Funkcje „tic” oraz „toc” służą do pomiaru czasu wykonywania działań. Dzięki tym funkcją użytym w zadaniu okazało się, iż rozwiązanie owego równania sposobem drugim, czyli przez pomnożenie równania przez macierz odwrotną jest szybsze co za tym idzie skuteczniejsze.
Zadanie 2
Program miał za zadanie policzenie pierwiastków wielomianu postaci:
W(x,a) = a1xn + a2xn-1 + a3xn-2 + … + anx + an+1
przy czym stopień n i współczynniki a podawane są przez użytkownika. Do wykonania zadania została użyta funkcja fzero i roots. Podstawowa różnica pomiędzy tymi funkcjami polega na tym, że za pomocą funkcji roots jesteśmy w stanie policzyć wszystkie pierwiastki wielomianu włącznie z pierwiastkami zespolonymi, natomiast funkcja fzero wyłącznie pierwiastek rzeczywisty. Dodatkowo musimy znać przybliżoną wartość miejsca zerowego wielomianu, gdyż funkcja fzero działa na zasadzie szukania miejsca zerowego w pobliżu podanej przez użytkownika wartości. Podsumowując funkcja roots jest wygodniejsza w użytkowaniu, a dodatkowo uzyskiwane dzięki niej wyniki są dokładniejsze niż w przypadku funkcji fzero.
Zadanie 3
Program miał za zadanie obliczyć miejsce zerowe funkcji f(x) = $\frac{1}{n}$x2 + sin(nx) – n
W programie została użyta funkcja fzero, w której wartość funkcji liczona jest w podprogramie, natomiast drugi parametr podawany jest przez użytkownika. Minusem tej funkcji jest to, że można jednorazowo za pomocą tej funkcji policzyć tylko jedno miejsce zerowe co bardzo utrudnia pracę i znacznie wydłuża czas pracy z programem.
Funkcja fzero jest mało efektywną metodą obliczania pierwiastków funkcji oraz dokładność tej funkcji jest mniejsza niż w przypadku innych metod.