[VB] Funkcja celu, złoty podział

Arowek
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 24 cze 2009, o 17:37
Płeć: Mężczyzna
Podziękował: 3 razy

[VB] Funkcja celu, złoty podział

Post autor: Arowek »

Witam,
mam pewne zadanie optymalizacyjne z matematyki, w którym muszę znaleźć funkcję celu oraz wykorzystać metodę złotego podziału do znalezienia pewnego minimum. Ma to być zrobione w visual basicu.
Kod programu, który napisałem:

Kod: Zaznacz cały

Sub makro_1()

Dim a As Double
Dim b As Double
Dim E As Double    'Dokładność obliczeń'
Dim k As Double    'Stały współczynnik k, o który zmniejszana jest wielkość przedziałów w kolejnych krokach'
Dim xL As Double
Dim xR As Double

a = InputBox("Podaj przedział [a;b] w którym poszukiwane jest minimum:                    a=")
b = InputBox("Podaj przedział [a;b] w którym poszukiwane jest minimum:                    b=")
E = InputBox("Określ dokładność obliczeń:")

k = (Math.Sqr(5) - 1) / 2
xL = b - k * (b - a)          'Lewa próbka'
xR = a + k * (b - a)          'Prawa próbka'

Do While ((b - a) > E)
    If (f(xL) < f(xR)) Then    'Porównanie wartości funkcji celu dla lewej i prawej próbki'
        b = xR
        xR = xL
        xL = b - k * (b - a)
    Else
        a = xL
        xL = xR
        xR = a + k * (b - a)
    End If
Loop
Range("G2").Value = (a + b) / 2

End Sub

Function f(x)
f = 0.03 * x ^ 2 + 480 / x
End Function
Jednak przy oddawaniu tego zadania gościu przyczepił mi się do wywoływania funkcji. Teraz wywołuje się 2 razy podczas pętli, a prawdopodobnie powinna więcej razy. Od razu mówię, że nie jest zbyt lotny w programowaniu, prosty program potrafię napisać, ale nic więcej. Czy mógłbyś ktoś pomóc w rozwiązaniu tego problemu? Pozdrawiam
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VB] Funkcja celu, złoty podział

Post autor: OShon »

A to zależy jakie liczby wpiszesz do obliczenia.
Przy a = 123, b = 321 i dokładności 0,01 masz 21 przelotów pętli:
  • Powtórzenie: 1 wynik: 122,370729772479 (123;245,370729772479) dokł: 0,01
    Powtórzenie: 2 wynik: 75,6292702275208 (123;198,629270227521) dokł: 0,01
    Powtórzenie: 3 wynik: 46,7414595449584 (123;169,741459544958) dokł: 0,01
    Powtórzenie: 4 wynik: 28,8878106825624 (123;151,887810682562) dokł: 0,01
    Powtórzenie: 5 wynik: 17,8536488623959 (123;140,853648862396) dokł: 0,01
    Powtórzenie: 6 wynik: 11,0341618201666 (123;134,034161820167) dokł: 0,01
    Powtórzenie: 7 wynik: 6,81948704222933 (123;129,819487042229) dokł: 0,01
    Powtórzenie: 8 wynik: 4,21467477793722 (123;127,214674777937) dokł: 0,01
    Powtórzenie: 9 wynik: 2,60481226429211 (123;125,604812264292) dokł: 0,01
    Powtórzenie: 10 wynik: 1,6098625136451 (123;124,609862513645) dokł: 0,01
    Powtórzenie: 11 wynik: 0,99494975064701 (123;123,994949750647) dokł: 0,01
    Powtórzenie: 12 wynik: 0,614912762998088 (123;123,614912762998) dokł: 0,01
    Powtórzenie: 13 wynik: 0,380036987648921 (123;123,380036987649) dokł: 0,01
    Powtórzenie: 14 wynik: 0,234875775349167 (123;123,234875775349) dokł: 0,01
    Powtórzenie: 15 wynik: 0,145161212299769 (123;123,1451612123) dokł: 0,01
    Powtórzenie: 16 wynik: 8,97145630493981E-02 (123;123,089714563049) dokł: 0,01
    Powtórzenie: 17 wynik: 5,54466492503707E-02 (123;123,05544664925) dokł: 0,01
    Powtórzenie: 18 wynik: 3,42679137990274E-02 (123;123,034267913799) dokł: 0,01
    Powtórzenie: 19 wynik: 2,11787354513433E-02 (123;123,021178735451) dokł: 0,01
    Powtórzenie: 20 wynik: 1,30891783476699E-02 (123;123,013089178348) dokł: 0,01
    Powtórzenie: 21 wynik: 8,08955710367343E-03 (123;123,008089557104) dokł: 0,01

Kod: Zaznacz cały

y = y + 1
    Debug.Print "Powtórzenie: " & y & " wynik: " & (b - a) & " (" & a & ";" & b & ") dokł: " & E
w rezultacie w "g2" otrzymujesz 123,0040448
Arowek
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 24 cze 2009, o 17:37
Płeć: Mężczyzna
Podziękował: 3 razy

[VB] Funkcja celu, złoty podział

Post autor: Arowek »

Czyli musiałbym zrobić jakieś założenia, co do wpisywanych a i b?
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VB] Funkcja celu, złoty podział

Post autor: OShon »

W oknie immediate [Ctrl+G] masz informacje zwracaną przez komendę Debug.print, a więc można zwracać dane początkowe oraz śledzić ich przebieg w pętli.
Podobnie w okno Locals (w tym że w tym przypadku aby zauważyć zamiany niezbędne jest zatrzymanie kodu i realizacja krokowa).

Sprawdź czy twój kod jest optymalny i realizuje dokładnie to co chcesz.
Dobierz wartości dla których pętla realizuje > niż minimalną, oczekiwaną ilość transformacji.
Arowek
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 24 cze 2009, o 17:37
Płeć: Mężczyzna
Podziękował: 3 razy

[VB] Funkcja celu, złoty podział

Post autor: Arowek »

Nie rozumiem
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VB] Funkcja celu, złoty podział

Post autor: OShon »

Pow podałem ci linijkę, która zaczyna się od polecenia Debug.print
Doczytaj sobie do czego ona służy (np. w dostępnym helpie).
Przeczytaj jeszcze raz post i spróbuj przetestować, a otworzysz przed sobą możliwość bieżącego testowania napisanego kodu.
ODPOWIEDZ