Advertisement
Guest User

Untitled

a guest
Jun 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Sub interpolacja()
  2.  
  3. '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'
  4.  
  5. 'mamy 5 punktów (x, y), przez które będzie przechodzić funkcja, to są zmienne na te punkty:'
  6. Dim x(5) As Double
  7. Dim y(5) As Double
  8.  
  9. 'to są zmienne, które liczą ile razy wykonują się pętle'
  10. Dim i, j As Integer
  11.  
  12. 'to jest argument x, dla którego szukamy wartości interpolowanej funkcji'
  13. Dim wartosc_interpolowana As Double
  14.  
  15. 'to jest wynik programu, interpolacja wartości, jest też sumą wielomianów'
  16. Dim suma As Double
  17.  
  18. 'to jest zmienna, która będzie przechowywała wartość pośredniego wielomianu'
  19. Dim wielomian As Double
  20.  
  21. 'ustawiamy sumę na 0, bo będziemy do niej dodawać pośrednie wielomiany'
  22. suma = 0
  23. wartosc_interpolowana = 1000
  24.  
  25. 'wczytywanie wartości z arkusza do zmiennych x, y'
  26. For i = 0 To 4
  27.     x(i) = Cells(2 + i, 2).Value
  28.     y(i) = Cells(2 + i, 3).Value
  29. Next
  30.  
  31. 'Główna pętla, liczy od 0 do 4 włącznie, wykonuje się 5 razy (tyle ile jest punktów w arkuszu)'
  32. For i = 0 To 4
  33.     wielomian = 1
  34.     'wielomian na początku ma wartość 1'
  35.     'bo jest wynikiem mnożenia takich ułamków -> (x - x(j))/(x(i) - x(j))'
  36.     'gdzie x to nasz argument, dla którego szukamy wartości funkcji'
  37.     'x(i) to jest punkt pobrany z arkusza (linijka 27), gdzie "i" to kolejny numer wielomianu'
  38.     'dla pierwszego wielomianu i=0'
  39.     'czyli ułamek wygląda tak: (x - x(j))/(x(0) - x(j))'
  40.     'wartość x(0) pobrana z komórki B2 jest równa 1, więc ułamek to: (x - x(j))/(1 - x(j))'
  41.     '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)'
  42.     '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.'
  43.     'więc dla i=0, cały wielomian wygląda tak:'
  44.     '(dla czytelności pominąłem nawiasy i zamiast x(0) piszę x0)'
  45.     '(x - x1)/(x0 - x1) * (x - x2)/(x0 - x2) * (x - x3)/(x0 - x3) * (x - x4)/(x0 - x4)'
  46.     '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.'
  47.     'podstawiając wartości z tabelki, ułamek wygląda tak:'
  48.     '(x - 2)/(1 - 2) * (x - 3)/(1 - 3) * (x - 4)/(1 - 4) * (x - 5)/(1 - 5)'
  49.     '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'
  50.     '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ą'
  51.     '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.'
  52.     '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.'
  53.     'więc cechy szczególne wielomianu dla i=0 są takie:'
  54.     'dla x = x(0), wielomian ma wartość 1'
  55.     'dla x = x(1), lub x(2), lub x(3), lub x(4), wielomian ma wartość 0'
  56.     'analogiczna sytuacja wyjdzie, gdy stworzy się wielomian przy i=1'
  57.     'ułamek będzie równy 1 gdy za x podstawisz x(1), oraz będzie równy 0 dla reszty x(j)'
  58.     'wracając do kodu, jesteśmy w środku pętli "i", więc tworzy się wielomian dla pewnego "i", na początku = 0'
  59.     'teraz następuje iteracja po całej x(j) i mnożenie ułamków:'
  60.     For j = 0 To 4
  61.         If i <> j Then
  62.         wielomian = wielomian * (wartosc_interpolowana - x(j)) / (x(i) - x(j))
  63.         End If
  64.     Next
  65.     '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'
  66.  
  67.     'więc teraz został stworzony wielomian, który dla i=0 ma identyczną wartość jak rozpisałem kilka linijek temu'
  68.     '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)'
  69.     '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'
  70.     suma = suma + wielomian * y(i)
  71.  
  72.     'gdy za pierwszym razem do sumy zostanie dodany wielomian, to suma będzie równa wielomianowi'
  73.     '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.'
  74.     'gdy teraz dodamy do siebie dwa wielomiany, jeden dla i=0, i drugi dla i=1, zadzieje się następująca rzecz:'
  75.     '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).
  76.     '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).'
  77.     '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.'
  78.  
  79.  
  80.     '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'
  81. Next
  82. MsgBox (suma)
  83.  
  84.  
  85. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement