Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Sub interpolacja()
- 'To jest komentarz, umieść ten kod w skrypcie, to komentarze powinny mieć inny kolor niż kod programu. nie zmieniłem kodu, dodałem tylko komentarze'
- 'mamy 5 punktów (x, y), przez które będzie przechodzić funkcja, to są zmienne na te punkty:'
- Dim x(5) As Double
- Dim y(5) As Double
- 'to są zmienne, które liczą ile razy wykonują się pętle'
- Dim i, j As Integer
- 'to jest argument x, dla którego szukamy wartości interpolowanej funkcji'
- Dim wartosc_interpolowana As Double
- 'to jest wynik programu, interpolacja wartości, jest też sumą wielomianów'
- Dim suma As Double
- 'to jest zmienna, która będzie przechowywała wartość pośredniego wielomianu'
- Dim wielomian As Double
- 'ustawiamy sumę na 0, bo będziemy do niej dodawać pośrednie wielomiany'
- suma = 0
- wartosc_interpolowana = 1000
- 'wczytywanie wartości z arkusza do zmiennych x, y'
- For i = 0 To 4
- x(i) = Cells(2 + i, 2).Value
- y(i) = Cells(2 + i, 3).Value
- Next
- 'Główna pętla, liczy od 0 do 4 włącznie, wykonuje się 5 razy (tyle ile jest punktów w arkuszu)'
- For i = 0 To 4
- wielomian = 1
- 'wielomian na początku ma wartość 1'
- 'bo jest wynikiem mnożenia takich ułamków -> (x - x(j))/(x(i) - x(j))'
- 'gdzie x to nasz argument, dla którego szukamy wartości funkcji'
- 'x(i) to jest punkt pobrany z arkusza (linijka 27), gdzie "i" to kolejny numer wielomianu'
- 'dla pierwszego wielomianu i=0'
- 'czyli ułamek wygląda tak: (x - x(j))/(x(0) - x(j))'
- 'wartość x(0) pobrana z komórki B2 jest równa 1, więc ułamek to: (x - x(j))/(1 - x(j))'
- 'zmienna wielomian jest wynikiem mnożenia 4 takich ułamków, gdzie x(j) to każda wartość x pobrana z arkusza, która nie równa się x(i)'
- 'ponieważ jeśli i=0 i j=0, to ułamek będzie wyglądał: (x - x(0))/(x(0) - x(0)) i w mianowniku będzie zero.'
- 'więc dla i=0, cały wielomian wygląda tak:'
- '(dla czytelności pominąłem nawiasy i zamiast x(0) piszę x0)'
- '(x - x1)/(x0 - x1) * (x - x2)/(x0 - x2) * (x - x3)/(x0 - x3) * (x - x4)/(x0 - x4)'
- 'ten cały ułamek jest pewnym wielomianem, bo dla ogólnego przypadku x jest argumentem funkcji, a wartości od x0 do x4, są znane z tabelki z arkusza.'
- 'podstawiając wartości z tabelki, ułamek wygląda tak:'
- '(x - 2)/(1 - 2) * (x - 3)/(1 - 3) * (x - 4)/(1 - 4) * (x - 5)/(1 - 5)'
- 'w naszym programie przyjmujemy, że x = 1000, bo taka wartość nas teraz interesuje do interpolacji, jednak ten ułamek jako funkcję można narysować na układzie współrzędnych dla wszystkich liczb z osi x'
- 'jak spojrzysz na ten ułamek jak na pewną matematyczną funkcję, to możesz zauważyć, że dla x=1, wszystkie ułamki się skracają'
- 'ten ułamek został stworzony dla i=0, oraz j=wszystko poza 0. Chodzi tutaj o to, że jeśli podstawisz teraz za x wartość x(0), to ułamek będzie równy 1.'
- 'co też jest ważne, ułamek zeruje się gdy podstawisz za x dowolną inną wartość x(j), bo jeden licznik w ułamku będzie równy 0.'
- 'więc cechy szczególne wielomianu dla i=0 są takie:'
- 'dla x = x(0), wielomian ma wartość 1'
- 'dla x = x(1), lub x(2), lub x(3), lub x(4), wielomian ma wartość 0'
- 'analogiczna sytuacja wyjdzie, gdy stworzy się wielomian przy i=1'
- 'ułamek będzie równy 1 gdy za x podstawisz x(1), oraz będzie równy 0 dla reszty x(j)'
- 'wracając do kodu, jesteśmy w środku pętli "i", więc tworzy się wielomian dla pewnego "i", na początku = 0'
- 'teraz następuje iteracja po całej x(j) i mnożenie ułamków:'
- For j = 0 To 4
- If i <> j Then
- wielomian = wielomian * (wartosc_interpolowana - x(j)) / (x(i) - x(j))
- End If
- Next
- 'instrukcja If ... Then, w tym przypadku działa tak, że jeśli "i" jest różne od "j", to dokonaj mnożenia ułamków, w przeciwnym wyrazie nic nie rób'
- 'więc teraz został stworzony wielomian, który dla i=0 ma identyczną wartość jak rozpisałem kilka linijek temu'
- 'dla i=0, wielomian ma wartość 1 w punkcjie x(0), więc jeśli przemnożymy cały wielomian o wartość y(0), to w punkcie x(0), będzie równy y(0)'
- 'czyli cała ta matematyka była potrzebna, żeby stworzyć pewien wielomian, który dla x(0) ma wartość y(0), oraz dla reszty x(j), ma wartość 0'
- suma = suma + wielomian * y(i)
- 'gdy za pierwszym razem do sumy zostanie dodany wielomian, to suma będzie równa wielomianowi'
- 'jednak po stworzeniu drugiego wielomianu dla i=1, wielomian będzie w punkcjie x(1) miał wartość 1, czyli po przemnożeniu przez y(1), będzie miał wartość y(1), a dla każdego innego x(j) (czyli 0, 2, 3, 4) będzie miał wartość 0.'
- 'gdy teraz dodamy do siebie dwa wielomiany, jeden dla i=0, i drugi dla i=1, zadzieje się następująca rzecz:'
- 'pierwszy wielomian w x(0) ma wartość y(0), a drugi w x(0) ma wartość 0, więc po dodaniu, suma wielomianów w x(0) będzie miała wartość y(0).
- 'pierwszy wielomian w x(1) ma wartość 0, a drugi w x(1) ma wartość y(1), więc po dodaniu, suma wielomianów w x(1) będzie miała wartość y(1).'
- 'po dodaniu wszystkich wielomianów, zostanie stworzona suma wielomianów, która w punkcie x(0) ma wartość y(0), w x(1), y(1), w x(2), y(2) i tak dalej dla każdego punktu. O to właśnie chodziło w interpolacji, żeby stworzyć taką funkcję, która będzie przechodziła przez podane punkty i będzie zachowywała się podobnie, dopasowując się do podanych punktów.'
- 'w tym programie chodziło o znalezienie interpolacji dla x=1000, więc zamiast niewiadomej x, podstawiliśmy na samym początku x=1000 i od początku wykonywaliśmy mnożenia ułamków na samych liczbach bez żadnych niewiadomych'
- Next
- MsgBox (suma)
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement