Programowanie w VBA

advertisement
Programowanie
w VBA
Metody numeryczne część 1.
Rozwiązywanie układów równań liniowych.
Krztyna teorii
Układ równań liniowych niejednorodnych:
a11x1 
a1m xn
 b1
a21x1  a22 x2  ...  a2 j x j  ...  a2 m xn
 b2
...
ai1 x1 
...
a12 x2  ... 
...
...
ai 2 x2  ... 
...
...
an1 x1  an 2 x2  ... 
a1 j x j  ... 
...
...
...
...
aij x j 
... 
aim xn
 bi
...
...
...
...
anj x j  ...  anm xn
 bn
x – niewiadoma
a i b – współczynniki wyliczane lub uzyskiwane
doświadczalnie
Krztyna teorii c.d.
Analityczne rozwiązanie polega na sprowadzeniu układu
równań do postaci:
x1  c1
x2
 c2
...
...
xi
 ci
...
...
xn
 cn
zwykle za pomocą mniej lub bardziej zorganizowanych
działań na równaniach (mnożenie obu stron przez stałe,
odejmowanie stronami, podstawianie jednych wyliczonych
niewiadomych do innych równań itd.).
Krztyna teorii c.d.
 a11 a12
a
 21 a22
 ... ...

 ai1 ai 2
 ... ...

an1 an 2
... a1 j
... a1m
... a2 j
... a2 m
...
...
...
...
aij
... aim
...
...
...
... anj
...
...
... anm
Macierz współczynników
 a11 a12
a
 21 a22
 ... ...

 ai1 ai 2
 ... ...

an1 an 2
... a1 j
... a1m
... a2 j
... a2 m
...
...
...
...
aij
... aim
...
...
...
... anj
...
...
... anm









 x1 
x 
 2
 ... 
 
 xi 
 ... 
 
 xn 
Macierz rozwiązań
b1 
b2 
... 

bi 
... 

an 
Macierz rozszerzona układu równań
 b1 
b 
 2
 ... 
 
 bi 
 ... 
 
bn 
Macierz wyrazów wolnych
AX  B
Równanie macierzowe
Metoda Gaussa-Jordana
Polega na przekształceniu macierzy rozszerzonej
do macierzy jednostkowej (tzw. metoda eliminacji macierzy)
poprzez działanie na wszystkich wierszach następująco:
1. Normowanie wiersza względem wyrazu głównego
(położonego na przekątnej – aii): wszystkie elementy wiersza
i są dzielone przez element aii, aby był on równy 1.
2. Jeśli aii=0, szukamy najbliższego elementu akl≠0 o k>i
i l>i, i zamieniamy wiersze i i k ze sobą. Jeśli taki element nie
zostanie znaleziony, dalsza eliminacja niemożliwa.
3. Odejmujemy wiersz i od pozostałych wierszy tyle razy,
żeby w całej kolumnie i wszystkie wyrazy poza aii były
równe 0.
Na koniec zostaje macierz jednostkowa, a wektor wyrazów
wolny jest równy macierzy rozwiązań.
Zbieżność i cyfrowy zapis liczb
Zadanie:
1. Wpisz w komórkę A1 cyfrę "1";
2. Wpisz w komórkę A2 formułę "=A1/3"
3. Zaznacz obie powyższe komórki, sformatuj ich
zapis liczbowy tak, żeby miały 20 cyfr po
przecinku.
4. Zmodyfikuj formułę w komórce A2 na: "A1/11"
Zbieżność i cyfrowy zapis liczb
Liczba rzeczywista jest zapisana w pamięci
komputera w postaci binarnej z ograniczoną ilością
bitów przeznaczoną na zapis cyfr znaczących (dla
Double – 52 bitów, reszta przeznaczona jest na znak
i potęgę "przesunięcia" zapisu, tak jak w zapisie
naukowym liczb: 1,2E02 oznacza 120).
W praktyce można więc zapisać zaledwie 15-16 cyfr
znaczących. Stąd każdy zapis jest obarczony błędem
na "końcu" zapisu cyfr, który może rosnąć w miarę
obliczeń. Dlatego przyjęcie pożądanej dokładności
wyniku na mniej niż 10^-10 może spowodować, że
algorytm numeryczny nigdy nie osiągnie tej
dokładności – sam błąd wynikający z błędu zapisu
może być podobnego rzędu. Dodatkowo można
ograniczyć liczbę iteracji (np. 100 – dlaczego tyle?).
Metoda odwracania macierzy
Pamiętając o tym, że iloczyn macierzy nie jest
przemienny i że macierzowy iloczyn "A A-1 = I"
(gdzie I to macierz jednostkowa), można wyliczyć
wektor rozwiązań X za pomocą przekształcenia
równania "A X = B" do równania "X = A-1 B".
W arkuszu kalkulacyjnym mamy funkcje
tablicowe bloków:
- MACIERZ.ODW(macierz)
- MACIERZ.ILOCZYN(macierz1;macierz2)
Uwaga na błędy zaokrągleń zapisu binarnego
liczb! Liczba 10-16 to numeryczne zero (rząd
ostatniego bitu)!
Metoda Cramera
a11 ... ai1 ... am1
Wyznacznik macierzy A (DetA)
zapisujemy tak:
...
det A  a1 j
...
...
...
...
... aij
... amj
...
...
...
a1n
... ain ... amn
...
...
DetA≠0 dla układu równań liniowo niezależnych,
co jest warunkiem koniecznym rozwiązania układu
równań, z którego współczynników jest macierz A.
Macierz A z kolumną i zastąpioną
wektorem wyrazów wolnych układu
równań oznaczamy jako macierz Ai:
a11 ... b1
...
det Ai  a1 j
... am1
... ... ...
... b j
...
... amj
...
... ... ...
a1n
... bn
...
... amn
Metoda Cramera c.d.
Kolejne elementy wektora rozwiązań X są
równe: xi = detAi/detA .
Metoda Cramera pozwala na identyfikacje
problemów przy rozwiązywaniu układu
równań. Dla DetA=0 układ jest nieoznaczony
lub sprzeczny, a konkretnie:
- Jeśli detAi=0 dla wszystkich i, to układ jest
nieoznaczony;
- Jeśli dla przynajmniej jednego i detAi≠0,
to układ jest sprzeczny.
Programowanie
w VBA
Metody numeryczne część 2.
Rozwiązywanie równań nieliniowych.
Krztyna teorii
Rozwiązanie równania to w formie graficznej
znalezienie przecięcia wykresy funkcji z osią
X. Dana jest ciągła w otoczeniu pierwiastka
funkcja, gdzie rozwiązanie ma ogólną
postać: f(x)=0
Nie dla każdego rodzaju funkcji wystarczają
do rozwiązania metody analityczne
(algebraiczne). W większości przypadków
potrzebne są metody numeryczne do
otrzymania przybliżonego wyniku.
Metoda bisekcji
Przypadek, gdzie f(x)*f(a)<0
czyli między x i a zmienił się znak,
czyli jest miejsce zerowe.
Y
Y
Przypadek, gdzie f(x)*f(a)>0,
czyli między x i a nie zmienił się
znak, czyli nie ma miejsca zerowego.
Nie ma miejsca zerowego
między x i a, więc x to nowe a
f(b)
f(x)
a
x=(a+b)/2 b
a:=x
X
a
b:=x
f(a)
Nie ma miejsca zerowego
między x i b, więc x to nowe b
f(b) X
x=(a+b)/2 b
f(x)
f(a)
Metoda bisekcji
1. Wyznaczamy przedział [a,b] z tylko jednym miejscem
zerowym;
2. Obliczamy f(a) i f(b), gdzie f(a)*f(b)<0
(musi być tylko jeden pierwiastek);
3. Przybliżenie to środek przedziału: xi=(a+b)/2;
4. Liczymy f(xi) - jeśli wartość jest mniejsza niż założona
dokładność docelowa rozwiązania εx, to xi jest
numerycznym rozwiązaniem, jeśli f(xi) jest większa niż
docelowa dokładność, to sprawdzamy f(a)*f(xi)<0 – jeśli
prawda, to b:=xi, jeśli nie, to a:=xi;
5. Powtarzamy punkty 3 i 4, aż przedział a-b będzie
węższy niż docelowa dokładność εx.
Metoda bisekcji
START
f(a)∙f(b)<0
NIE
TAK
xi=(a+b)/2
TAK
|xi-xi-1|<εx
NIE
f(a)∙f(x)<0
NIE
TAK
b:=x
NIE
b-a<εx
TAK
KONIEC; x=xi
a:=x
KONIEC,
błąd;
Metoda bisekcji (połowienia
przedziału) jest zawsze
zbieżna, o ile w początkowym
przedziale funkcja ma
dokładnie jedno miejsce
zerowe i jest w tym obszarze
ciągła. Każda iteracja (krok w
pętli) zmniejsza dwukrotnie
przedział [a,b] – dając pewność
równomiernego zwiększenia
dokładności w iteracji.
Metoda interpolacji liniowej
Przypadek, gdzie f(x)*f(a)<0
czyli między x i a zmienił się znak,
czyli jest miejsce zerowe.
Y
Y
Przypadek, gdzie f(x)*f(a)>0,
czyli między x i a nie zmienił się
znak, czyli nie ma miejsca zerowego.
Nie ma miejsca zerowego
między x i a, więc x to nowe a
f(b)
f(x)
a
X
x
f(a)
a:=x
b
x
a
b:=x
f(a)
Nie ma miejsca zerowego
między x i b, więc x to nowe b
f(x)
f(b) X
b
Metoda interpolacji liniowej
1. Wyznaczamy przedział [a,b] z tylko jednym miejscem
zerowym;
2. Obliczamy f(a) i f(b), gdzie f(a)*f(b)<0
(musi być tylko jeden pierwiastek);
3. Przybliżenie to środek przedziału:
xi=b-f(b)*(b-a)/(f(b)-f(a));
4. Liczymy f(xi) - jeśli wartość jest mniejsza niż założona
dokładność docelowa rozwiązania εx, to xi jest
numerycznym rozwiązaniem, jeśli f(xi) jest większa niż
docelowa dokładność, to sprawdzamy f(a)*f(xi)<0 – jeśli
prawda, to b:=xi, jeśli nie, to a:=xi;
5. Powtarzamy punkty 3 i 4, aż przedział a-b będzie
węższy niż docelowa dokładność εx.
Metoda interpolacji liniowej
START
f(a)∙f(b)<0
NIE
TAK
xi=b-f(b)∙(b-a)/(f(b)-f(a)
TAK
|xi-xi-1|<εx
NIE
f(a)∙f(x)<0
NIE
TAK
b:=x
NIE
b-a<εx
TAK
KONIEC; x=xi
a:=x
KONIEC,
błąd;
Metoda interpolacji liniowej jest
co do zasady identyczna z
metodą bisekcji, poza
przybliżeniem, które wynika z
interpolacji liniowej. Metoda ta
jest zazwyczaj szybciej zbieżna
niż metoda bisekcji, aczkolwiek
w nielicznych przypadkach
może być wolniejsza – nie daje
gwarancji równomiernego
zwiększania dokładności.
Metoda Newtona
Y
Metoda Newtona jest potencjalnie
najszybciej zbieżna z przedstawionych
f'(x0)
metod. Wymaga ona jednak
f(x0)
znajomości pierwszej pochodnej danej
f'(x1)
f(x1)
funkcji, oraz ciągłych i nie
X
zmieniających znaku pierwszej i drugiej
x2 x1 x0
pochodnej między miejscem zerowym
a punktem startowym. Czyli funkcja
musi być w całym zakresie działania
START
monotoniczna i albo tylko wklęsła albo
x:=x0-f(x0)/f'(x0)
tylko wypukła. Dodatkowo w punkcie
TAK KONIEC startowym musi być spełnione
|x-x0|<εx
x=xi
równanie f(x)∙f'(x)>0, aby przybliżanie w
NIE
miarę iteracji było na osi X w kierunku
x0:=x
miejsca zerowego, a nie w przeciwnym.
Metoda Newtona
1. Podajemy wartość początkową
pierwiastka (x0), w którym jest spełnione
równanie f(x)*f'(x)>0;
2. Pochodna w punkcie startowym to:
f'(x)=f(x0)/(x0-x1), więc: x1=x0-(f(x0)/f'(x0))
3. Obliczona wartość x1 to punkt startowy
dla następnej iteracji: x0=x1.
4. Powtarzamy punkty 3 i 4 aż |xi-xi-1|<εx
Download