Wojskowa Akademia Techniczna 25.01.2010r.
im. Jarosława Dąbrowskiego
Podstawy Informatyki
dr. inż. Marek Gąsiorowski
dr. inż. Leszek Baranowski
Sprawozdanie z Laboratorium nr.7.
Temat: ,,Rozwiązywanie równań nieliniowych i układów równań liniowych''
Autor: Robert Filiks
Lotnictwo i kosmonautyka
L9X2S1
Wstęp
W celu rozwiązania równań nieliniowych w programie Matlab możemy wykorzystać funkcje: fzero i roots; Aby rozwiązać układ równań liniowych możemy skorzystać z funkcji: inv, dzielenia lewostronnego / oraz det.)
fzero
x=fzero(`F',x0)
Oblicza miejsce zerowe funkcji o podanej nazwie zaczynając obliczenia z punktu startowego x0, który winien być początkowym przybliżeniem wartości szukanego miejsca zerowego.
x=fzero(`F',x0,eps,w)
W powyższym wywołaniu opcjonalny trzeci parametr eps określa żądaną dokładność, parametr „w” zaś, jeśli ma wartość nie zerową, powoduje wyświetlanie pośrednich rezultatów na ekranie.
roots
k=roots(a)
Wyznacza współczynniki a(1),a(2),…,a(n+1) wielomianu:
W(x,a)=a(1)xn+a(2)xn-1+..+a(n)x+a(n+1)
O pierwiastkach podanych w wektorze k. Jak widać współczynniki są uszeregowane wg malejących potęg zmiennej x.
inv
Inv(a) - wyznacza odwrotność macierzy A.
Macierz odwrotna - element odwrotny w pierścieniu macierzy kwadratowych. Uogólnieniem pojęcia macierzy odwrotnej jest tzw. uogólniona macierz odwrotna.
dzielenie lewostronne \
\ A.\B => B(i,j)/A(i,j)
det(A) - wyznacznik macierzy
Kod źródłowy programu Laboratorium nr.7
Zad. Nr.1.
clc
clear all
disp('zad_1');
n=input('Podaj ilosc niewiadomych (n): '); % deklaracja ilości niewiadomych
A=randn(n); % wypełniamy macierz n x n liczbami pseudolosowymi
for i=1:n % tworzymy układ n-równań liniowych o n niewiadomych
b(i,1)=0;
for j=1:n
b(i,1)=A(i,j)+b(i,1);
end
end
A,b % macierz A - macierz współczynników
% macierz b - macierz rozwiązań
if det(A)~=0 % sprawdzamy czy macierz jest nie osobliwa
disp('macierz jest nieosobliwa');
else
disp('macierz jest osobliwa');
end
disp(' ');
tic % rozpoczyna pomiar czasu potrzebny do wykonania macierzowej operacji
disp('sposob 1, MACIERZ ODWROTNA (funkcja inv)');
p=inv(A)*b;
disp('rozwiazaniem jest wektor p:');
disp(p); % rozwiązaniem jest wektor p powstały poprzez pomnożenie wektora b przez odwrotność macierzy A
toc % kończy pomiar czasu operacji, wyświetla czas
disp(' ');
tic
disp('sposob 2, "\" LEWOSKRETY, dzielenie lewoskrętne');
q=A\b;
disp('rozwiazaniem jest wektor q:');
disp(q); % rozwiązaniem jest wektor q powstały poprzez podzielenie macierzy A przez macierz b
toc
disp(' ');
Zad. Nr.2.
clc
clear all
disp('zad_2');
n=input('Podaj stopien wielomianu: ');
k=0;
for i=1:n+1
a(i)=input(['Podaj wartosc wspolczynnika przy x^',num2str(n+1-i),': ']);
while k==0
if a(1)==0
disp(' ');
disp(['Wspolczynnik przy x^',num2str(n+1-i),' nie moze byc rowny 0']);
a(1)=input(['Podaj nowa wartosc wspolczynnika przy x^',num2str(n+1-i),': ']);
disp(' ');
else
k=1;
end
end
end
disp(' ');
disp('FUNKCJA ROOTS');
pierw=roots(a) % obliczamy pierwiastki wielomianu W(x,a)=a(1)xn+a(2)xn-1+..+a(n)x+a(n+1), gdzie n jest podanym stopniem wielomianu.
Zad. Nr.3.
clc
clear
disp('zad_3');
x=0;
x1=fzero('W(x)',x) % funkcja do wyznaczania miejsc zerowych funkcji
x2=fzero('W(x)',-x1) % program wykożystuje podaną poniżej funkcje W(x)
function y = W(x)
y=(x^2/n)+sin(n*x)-n; %n nr w dzienniku
disp([num2str(n+1-i)]);
end
Wnioski
Matlab jest bardzo pomocnym programem, który pozwala szybko obliczyć rozwiązania równań nieliniowych i układów równań liniowych.
Według pomiarów czasowych wykonanych za pomocą funkcji tic toc , wnioskuję, że najszybsza jest metoda dzielenia lewostronnego. Wolniejszą metodą, jest wzór Cramera. A na miejscu ostatnim mamy macierz odwrotną.
Program jest przydatny do wielu obliczeń matematycznych, gdyż skraja czas pracy.