Algorytmy numeryczne

Całkowanie numeryczne

Całkowanie numeryczne, program mocno niedoskonały. Na zajęciach. Link do opisu: tutaj. Program liczy dla całki z pojedynczego łuku.

Sub Trapezu()
    'Początek
    Dim xp As Single
    xp = InputBox("Podaj początkową wartość xp")
    
    'Koniec
    Dim xk As Single
    xk = InputBox("Podaj końcową wartość xk")
    
    'Liczba trapezów
    Dim n As Single
    n = InputBox("Podaj ilość trapezów, przedziałów,")
    
    'Wysokość trapezów, zawsze jest taka sama
    Dim h As Single
    h = (xk - xp) / n
    
    MsgBox "Wysokość d(x) = " & h
    
    'Wartość początkowa, początek iteracji
    Dim d As Double
    d = 0
    
    'Do jednego dodaje wartość całki ze środkowych trapezów
    For i = 1 To n - 1
        d = d + f(xp + i * h)
    Next
    
    'Dodaje do sumy trapezy końcowe
    d = (d + ((f(xp) / 2) + (f(xk) / 2))) * h
    
    MsgBox "Całka wynosi = " & d
End Sub

Public Function f(x)
    f = 2 * x
End Function

Obliczanie pierwiastka n-tego stopnia

Wychodzimy z prostego założenia PIERW.ST(N)z(X) = X ^ 1/N

Function Pierw(liczba As Single, st_pierw As Integer) As Single
    Pierw = liczba ^ (1 / st_pierw)
End Function

Co warte uwagi:

  • Single | liczba zmiennopozycyjna | 4 bajty | Ujemne:-3.402823E38 do -1.401298E-45 | Dodatnie: 1.401298E-45 do 3.402823E38
  • Integer | całkowita |2 bajty | -32,768 do 32,767


Gotowa funkcja szybko załatwia sprawę ale by mieć kontrolę nad wszystkim należy zastosować metodę stycznych Newtona, którą świetnie opisuje Dział E-learningu Politechniki Wrocławskiej

Przykład:

Założenie:

x^3 = 3
f(x) = x^3 - 3
f(x) = 0
Alfa e (1, 2)
f(Alfa) = 0
f'(x) = 3x^2
f''(x) = 6x
f''(x) > 0

Poszukiwanie pierwiastka sprowadza się do rozwiązania równania trzeciego stopnia, jego rozwiązanie wyznacza nam x0 punkt przecięcia stycznej krzywej z osią X układu współrzędnych stąd korzystamy ze wzoru x1 = x0 - f(x0)/f'(x0)

Alfa jest przedziałem, który określamy na początku [1^3 > 0 && 2^3 > 0] - jest prawdziwe stąd (1,2)

Realizacja algorytmu:

x0 = 2
x1 = x0 - f(x0)/f'(x0) = 2 - (2^3 - 3)/(3*2^2) = 2 - 5/12 ~= 1,58
x2 = x1 - f(x1)/f'(x1) = 1,58 - (1,58^3 - 3)/(3*1,58^2) = 1,58 - 0,94/7,49 ~= 1,454
x3 = x2 - f(x2)/f'(x2) = 1,454 - (1,454^3 - 3)/(3*1,454^2) = 1,454 - 0,074/6,342 ~= 1,454 - 0,011 ~= 1,443 

Wynikiem działań będzie przybliżone rozwiązanie.

Opis algorytmu:

  1. Ustalenie przedziału zawierającego pierwiastek a równania f(x) = 0
  2. Zbadanie znaku funkcji f(x) i f(x) w przedziałach [a, a), (a, b]
  3. Wybór punktu x0 (f(x) * f(x) > 0)
  4. Obliczenie x1 - miejsca zerowego stycznej w p. (x0, f(x0)); x1 = x0 - f(x0)/f'(x0)
  5. Obliczenie kolejnych miejsc stycznych w p.(xn, f(xn)); xn+1 = xn - f(xn)/f'(xn); n=1,2,3
  6. Wybór rozwiązania przybliżonego xn równania f(x) = 0