Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
Przesunięty przez: Tajan
17-01-2019, 12:30
Tablicowanie funkcji
Autor Wiadomość
ITme
forumowicz


Posty: 19
Wysłany: 17-01-2019, 11:11   Tablicowanie funkcji

Witam.
Dostaliśmy na zaliczenie projekt, którego totalnie nie ogarniam :/ (pomijając fakt, że nie jest to raczej związane z naszym kierunkiem... no ale cóż :( )

Zadanie wygląda tak:

"Projekt polega na przygotowaniu skryptu (makra) w języku VB, które będzie realizować tablicowanie funkcji w określonym przedziale z wykorzystaniem jej wartości dokładnych i przybliżonych z rozwinięcia w szereg nieskończony.
W podstawowej wersji projektu dane wejściowe w postaci a - początku przedziału, b - końca przedziału, n - liczby podziałów przedziału i є - dokładności wartości przybliżonej powinny być pobierane z arkusza kalkulacyjnego, a dane wyjściowe w postaci otrzymanych wyników powinny być do niego zapisywane.

PRZYKŁAD REALIZACJI PROJEKTU:
Poniżej przedstawiono przykładową realizację projektu dla funkcji e^x, której rozwinięcie w szereg nieskończony ma następującą postać: ZAŁĄCZNIK 1;

Załącznik 2 zawiera wyniki zwracane przez skrypt dla danych wejściowych znajdujących się w wierszu nr. 1. Kolejne kolumny zawierają następujące dane:

A- numer podziału zadanego przedziału, w którym tablicowana jest zadana funkcja - od wartości a do b ze skokiem d= (a-b)/n
B- Wartość, dla której obliczana jest wartość zadanej funkcji: x=a, a+d, a+2d, ... , b-d, b
C- Wartość dokładna Wd, obliczana przy użyciu wbudowanych funkcji - tutaj exp(x)
D - różnica między wartością dokładną a przybliżoną: |Wd - Wp|
E- wartość przybliżona Wp, obliczana z rozwinięcia w szereg
F- procentowy błąd względny: (|wd-Wp|)/Wd * 100%
G- liczba wyrazów szeregu, które należało zsumować, aby uzyskać wynik z zadaną dokładnością."

Ktoś wie jak to rozpocząć? Nie proszę o rozwiązanie zadania, tylko o pomoc w jego zrozumieniu i jak to przekształcić w skrypt VB.

Pozdrawiam :)

Zalacznik 1.jpg
Plik ściągnięto 1 raz(y) 82.75 KB

zalacznik 2.jpeg
Plik ściągnięto 11 raz(y) 211.6 KB

ID posta: 360664 Skopiuj do schowka
 
 
Waldek 
ExcelSpec


Pomógł: 121 razy
Posty: 579
Wysłany: 18-01-2019, 00:33   

Prawdę mówiąc nie wiem o co chodzi z tym "tablicowaniem funkcji". W każdym razie ten wzór na e^x bardzo łatwo jest napisać w VBA. Np. można to zrobić w postaci funkcji użytkownika, przykład poniżej:
Kod:
Function EDOX(x As Double, n As Long) As Double
Dim i As Long
Dim j As Variant
Application.Volatile True
j = 1
EDOX = 1
For i = 1 To n - 1
EDOX = EDOX + (x ^ i) / j
j = j * (i + 1)
Next i
End Function

Można taką funkcję wywołać w arkuszu, realizuje ona wzór z załącznika 1, gdzie x to x a n to zadana ilość wyrazów szeregu. Można tą funkcję EDOX porównać do formuły:
Kod:
=EXP(A1)

Nie jest to rozwiązanie tego zadania, ale dla mnie jakieś przedziały ze skokiem to nieporozumienie, kiedy można dodawać wyrazy szeregu tak jak jest we wzorze.
ID posta: 360768 Skopiuj do schowka
 
 
ąćęłńóś
Excel Expert


Pomógł: 193 razy
Posty: 881
Wysłany: 18-01-2019, 01:54   

Logarytmy ostatnio w modzie ze szczególnym uwzględnieniem funkcji wykładniczej i eksponencjalnej, czyli szereg potęgowy oraz panowie Taylor i Maclaurin w natarciu ... :shock: ... na sam widok dostaję Parkinsona ... :-? ... a to tablicowanie, to po prostu wsadzanie do tablic wcześniej przygotowanych danych ... tylko trza je wcześniej poobliczać ... matematycy proszeni do dyżurki ... :->
ID posta: 360771 Skopiuj do schowka
 
 
Waldek 
ExcelSpec


Pomógł: 121 razy
Posty: 579
Wysłany: 18-01-2019, 09:38   

Jeszcze raz przeczytałem zadanie i widzę, że te punkty od A do G należy wykonać w arkuszach Excela a nie w VBA. Jest to tylko porównanie i policzenie błędów obliczeń skryptu w VBA w zależności od ilości wyrazów szeregu. Autor tematu powinien sobie poradzić.
ID posta: 360781 Skopiuj do schowka
 
 
ITme
forumowicz


Posty: 19
Wysłany: 21-01-2019, 14:39   

Dzięki za odpowiedzi :)
dodaję w załączniku pełną stronę ze strukturą skryptu.
"czyszczenie arkusza", "pobieranie danych z arkusza", "obliczanie skoku" to jest jasne, kiedy dochodzę do wnętrza pętli For i napotykam "Obliczenia" to już nie bardzo... Moje pytanie: Jakie obliczenia tu trzeba wykonać? Dla każdego przebiegu pętli obliczać x^0/0!, x^1/1! itd?

zalacznik 3.jpeg
Plik ściągnięto 39 raz(y) 470.87 KB

ID posta: 360970 Skopiuj do schowka
 
 
Waldek 
ExcelSpec


Pomógł: 121 razy
Posty: 579
Wysłany: 21-01-2019, 16:58   

ITme napisał/a:
...
dodaję w załączniku pełną stronę ze strukturą skryptu.
"czyszczenie arkusza", "pobieranie danych z arkusza", "obliczanie skoku" to jest jasne...

Dla mnie nie jasne. Jakiego skoku? Co to za dane z arkusza? Niestety nie było mnie na tej lekcji. :-(
ID posta: 360978 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1248 razy
Posty: 4291
Wysłany: 22-01-2019, 11:16   

W pętli zewnętrznej
Kod:
For J = 0 To N
obliczasz wartość bieżącą x
Kod:
x = XP + J * DX
inicjujesz licznik wyrazów szeregu
Kod:
LW = 0
i inicjujesz zmienne wynik i wyraz
Kod:
wynik = 1
wyraz = 1
"Zerowy" wyraz szeregu ma zawsze wartość 1, więc nie ma potrzeby go obliczać. W pętli wewnętrznej Do … Loop obliczasz bieżący numer wyrazu LW, kolejne wyrazy szeregu i dodajesz do wyniku:
Kod:
LW = LW + 1
wyraz = wyraz * x/LW
wynik = wynik + wyraz
W warunku Until sprawdzasz, czy wyraz jest już dostatecznie mały
Kod:
wyraz < 0.5 * EPS
Na wszelki wypadek dodałem czynnik 0,5, bo szereg jest rosnący, więc odrzucamy nie tylko następny wyraz, ale i wszystkie kolejne. Wyrazy obliczamy w taki sposób (iteracyjnie), bo nie ma predefiniowanej funkcji Silnia, a jej obliczanie jest nieopłacalne. Po zakończeniu pętli obliczasz dokładną wartość funkcji dla danego x, błąd wyniku, liczbę wyrazów masz w zmiennej LW. Wyniki wyprowadzasz na ekran w odpowiednim wierszu (J+3) - to będzie końcówka pętli zewnętrznej. Wszystkie zmienne powinny być na początku zadeklarowane.
ID posta: 361000 Skopiuj do schowka
 
 
ITme
forumowicz


Posty: 19
Wysłany: 22-01-2019, 20:32   

Maciej Gonet napisał/a:
W pętli zewnętrznej
W warunku Until sprawdzasz, czy wyraz jest już dostatecznie mały
Kod:
wyraz < 0.5 * EPS
Na wszelki wypadek dodałem czynnik 0,5, bo szereg jest rosnący, więc odrzucamy nie tylko następny wyraz, ale i wszystkie kolejne. Wyrazy obliczamy w taki sposób (iteracyjnie), bo nie ma predefiniowanej funkcji Silnia, a jej obliczanie jest nieopłacalne. Po zakończeniu pętli obliczasz dokładną wartość funkcji dla danego x, błąd wyniku, liczbę wyrazów masz w zmiennej LW. Wyniki wyprowadzasz na ekran w odpowiednim wierszu (J+3) - to będzie końcówka pętli zewnętrznej. Wszystkie zmienne powinny być na początku zadeklarowane.


Wszystko super, dziękuję Ci bardzo. Mam jeszcze jedno pytanie... Jak do tego podpiąć wzór?
Przykładowo
Kod:

sin(2*x) = 2 * x - (2^3 * x^3) / 3! + (2^5 * x^5 )/ 5! - (2^7 * x^7) / 7! + (2^9 * x^9) / 9! - ...


W przykładzie w kolumnie C jest "lewa strona równania - to obliczam w pętli dla każdego x i wyświetlam później... W kolumnie E jest "prawa strona równania" i nie bardzo wiem jak to obliczyć za pomocą VBA :/
ID posta: 361061 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1248 razy
Posty: 4291
Wysłany: 23-01-2019, 10:31   

Obliczasz w analogiczny sposób. Musisz porównywać kolejne wyrazy szeregu i obliczać kolejny wyraz na podstawie poprzedniego, który jest pamiętany. W tym przypadku pierwszy:
Kod:
wyraz = 2 * x
Następne wyrazy obliczamy iteracyjnie:
Kod:
wyraz = -wyraz * (2*x)^2/(2*LW-2)/(2*LW-1)
LW jest bieżącym numerem wyrazu. W tym przypadku szereg jest naprzemienny, więc w warunku zakończenia pętli nie jest potrzebny współczynnik 0,5 (bo błąd jest mniejszy od pierwszego odrzuconego wyrazu), natomiast jest potrzebna wartość bezwzględna:
Kod:
Abs(wyraz) < EPS

Numerację wyrazów można tez alternatywnie zwiększać o 2. Wtedy numery kolejnych wyrazów będą 1, 3, 5, …
Wtedy pierwszy wyraz bez zmian, a potem
Kod:
LW = LW+2
wyraz = -wyraz * (2*x)^2/(LW-1)/LW
ID posta: 361100 Skopiuj do schowka
 
 
ITme
forumowicz


Posty: 19
Wysłany: 23-01-2019, 15:12   

Chyba już wszystko rozumiem :) Dziękuję ci za pomoc.
Jeszcze jedno pytanie, po uruchomieniu makra otrzymuję błąd:
Kod:
Compile error:
Sub or Function not defined


Ale nigdzie nie mogę odnaleźć działającego rozwiązania :/

Kod:
Sub zadanie()

Dim XP As Double
Dim XK As Double
Dim N As Integer
Dim Eps As Double
Dim DX As Double
Dim J As Integer
Dim x As Double
Dim LW As Integer
Dim wynik As Double
Dim wyraz As Double
Dim C As Double
Dim E As Double
Dim A As Integer

Range(Cels(3, 1), Cells(1003, 8)).Clear

XP = CDbl(Cells(1, 1).Value)
XK = CDbl(Cells(1, 2).Value)
N = CInt(Cells(1, 3).Value)
Eps = CDbl(Cells(1, 4).Value)

DX = (XK - XP) - CDbl(N)

For J = 0 To N Step 1

x = XP + J * DX
LW = 2
wynik = 1
wyraz = 1

    Do
   
    A = 3
    LW = LW + 2
    wyraz = 2 * x
    wyraz = -wyraz * (2 * x) ^ 2 / (LW - 1) / LW
   
    Cell(A, 1).Value = x
    A = A + 1
   
    Loop Until Abs(wyraz) < Eps
   
C = Sin(2 * x)

Next J

End Sub


Zadanie.xlsm
Pobierz Plik ściągnięto 18 raz(y) 16.24 KB

ID posta: 361149 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1248 razy
Posty: 4291
Wysłany: 23-01-2019, 15:45   

Bardzo niestarannie to zrobiłeś. Było kilkanaście błędów. Zaznaczyłem komentarzami. Ten błąd, który Ci sygnalizował kompilator, wynikał z literówki - niestarannie napisałeś Cells. Jak potrzebujesz jeszcze wyświetlać błędy obliczeń, to sam sobie już uzupełnij. Jawna konwersja typów jest rzadko potrzebna, jeśli masz zmienną zadeklarowaną np. jako Double, to program sam dokona konwersji. Konwersja jest potrzebna, gdy zmienna jest deklarowana jako Variant, czasem gdy chcemy uniknąć przepełnienia, ale to są sytuacje które tu nie występują.

Zadanie_tabl_funkcji.xlsm
Pobierz Plik ściągnięto 13 raz(y) 17.04 KB

ID posta: 361151 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe