prosze o pomoc w wyjaśniniu zadania Fortran i uzasadninie pętli

0

dostalam zadanie: A function f(x) is to be evaluated at each of N equally spaced points in [0,1], where N is large. Which of the following pieces of code is prefable for yhis task? Explain.
1.
X= 0.0
H= 1.0/FLOAT(N)
DO 10 I = 1,N
X=X+H
WRITE(6,*) F(X)
10 CONTINUE

  1. H=1.0/ FLOAT(N)
    DO 10 I = 1,N
    X= FLOAT(I)H
    WRITE(6,
    ) F(X)
    10 CONTINUE

Przetłumaczyłam sobie zadanie ( nie mam pojęcia czy dobrze) że funkcja ma byc oceniona przy każdym z N rozstawionych punktów w przedzoale [0,1], gdzie N jest duze.

Szczerze to nie rozumiem o co chodzi już w tym zadaniu, nie mówiać już o przesniesieniu go program.
Bardzo prosze o pomoc. po 7 letniej przerwie w jakimkolwiek programowaniu, wróciłam na studia i jest dla mnie problemem ogarniecie co jak i po co. nie rozumiem nawet komend zawartych w programie, czy byłby ktoś tak miły, i takiemu głąbowi jak ja wyjaśnił o co chodzi, co jest do czego???

Dlaczego jest to Fortran???

proszę w razie czego o kontakt również mailowy , bo jest kilka wątpliwości ad czy faktycznie to kobieta ma ten problem

Kasia

0

przyznaje ze po kilkuletniej przerwie mam z tym problem, dlatego zwracałam sie z prośbą o pomoc

0

Czekamy na zdjęcie z karteczką "Pozdrawiam 4programmers" :)

0

w takim razie zapraszam do mnie na facebooka, moze troszke wiary ze jestem kobieta?

http://www.facebook.com/profile.php?id=100000239912659

chyba widac juz akt desperacji...

dzieki za wiare... to ze jestem głąbem to przyznałam... ale nie mam zamiaru podawac sie za osobe ktora nie jestem,..

0

A gdzie 4p w ulubionych? :P

0

jest w lubianych

nagła cisza... dzieki za pomoc

0

w przykładzie 1 w pętli jest dodawanie, w 2 jest konwersja z integer na float i mnożenie.
w 1 kumuluje się błąd zaokrągleń liczb zmiennoprzecinkowych, w drugim nie będzie tego efektu.
przykład 1 będzie prawdopodobnie działał szybciej.

0

przy dodawaniu kumuluje sie błąd w wiekszym stopniu niż przy mnożeniu? dlaczego?

0

H= 1.0/FLOAT(N)
a później
X=X+H
będzie działać dobrze ale tylko w ograniczonej liczbie przypadków
np. miły dla nas ułamek 1/10 w układzie dwójkowym jest liczbą okresową, więc nie da się go zapamiętać dokładnie bo potrzebna jest do tego pamięć o nieskończonej wielkości.

w tłumaczeniu brakło "equally spaced" oraz może nie "oceniona" lecz wyliczona

czy zapis [0,1] oznacza, że zero i jeden są zawarte czy nie, bo oba rozwiązania są podejżane

bo fortran jest dla wybranych, poczuj się wyróżniona Kasiu. nie lubię go ale chętnie popracowałbym gdzieś gdzie jest używany

0

0 i 1 są zawarte. moge zadac durne pytanie? co oznacza zapis write (6,*) F(x)?

0

Xitami, niestety nie mam przyjemności na tym pracować... cae szczescie może dla ewentualnego pracodawcy... wróciłam na studia i mam przydmiot analiza numeryczna sygnalów biomedycznych i stad takie zadanie...

0

akurat tak trafiłam, później badzie Mathlab i Maple

czyli drugi kod jest lepszy??tylko dlaczego?

0

mnożenie jest float I przez tylko 0,1???

matko... durna jestem

0

w drugim kodzie jest sformułowanie : X =Float(I)*H i moje pytanie jest takie, czy H jest określone , i jest to wartośc 0 lub 1???

Tak, H jest określone. Przecież dwie linijki wyżej masz: H=1.0/ FLOAT(N). Co oznacza: pod H podstaw 1.0 podzielone przez N przekonwertowane do typu zmiennoprzecinkowego. W Fortranie AFAIR, jak na początku programu nie ma implicit none, to wszystkie zmienne od A do H i od O-Z są typu REAL (chyba, ale przynajmniej zmiennoprzecinkowego). Więc pod H zostanie podstawiony bardzo mały ułamek, bo N jest bardzo duże.

0

jeżeli chodzi o wpis DO 10 I - to jest odliczanie od 10 do I czy od 10 o wspólczynnik I?

Nie. Tak średnio mam czas i ochotę, bo późna pora, a ja wcześnie rano do pracy wstaję ;), więc tak na szybko: http://folk.uio.no/steikr/doc/f77/tutorial/loops.html
Czyli DO 10 I = 1,N oznacza, że pętla będzie szła od i równego 1 do N zwiększając swoją wartość w każdym kroku o 1 (tutaj kroku nie ma ustalonego, więc jest domyślny).
10 oznacza nazwę tej pętli.

The number 10 is a statement label. Typically, there will be many loops and other statements in a single program that require a statement label. The programmer is responsible for assigning a unique number to each label in each program (or subprogram). Recall that column positions 2-5 are reserved for statement labels. The numerical value of statement labels have no significance, so any integer numbers can be used. Typically, most programmers increment labels by 10 at a time.

Powodzenia.

0

W podejściu nr 1 (Fortrana widzę pierwszy raz na oczy) możesz mieć problemy, jeśli N będzie wystarczająco duże żeby wypchnąć precyzję poza zakres dokładności (underflow). Czyli jeśli 1/N jest mniejsze od najmniejszego FLOAT (dla C jest to wartość 1.175494351 E – 38)

http://msdn.microsoft.com/en-us/library/hd7199ke%28v=vs.80%29.aspx

Czyli jeśli N będzie większe od 8.5 E+37 to program nie zadziała dobrze (w pierwszym rozwiązaniu).

Drugi problem nazywa się "roundoff error" - jeśli dodajesz ułamek do większej liczby, to muszą być one do siebie zbliżone.
Dlatego np. do wartości 1.0 dla float musisz dodawać wartości większe niż 1.19 E-7, by zobaczyć zmianę wartości.
Dla tego błędu N musi być mniejsze niż c.a. 8403362 (w pierwszym rozwiązaniu).

0

przy dodawaniu kumuluje sie błąd w wiekszym stopniu niż przy mnożeniu? dlaczego?

ponieważ w drugim przypadku każdy wynik jest rezultatem tylko dwóch działań zmiennoprzecinkowych: dzielenia 1.0/ FLOAT(N) oraz mnożenia FLOAT(I)*H.
w pierwszym przypadku każdy kolejny wynik jest rezultatem rosnącej liczby działań (tyle co poprzedni wynik plus kolejne dodawanie).
a im dłuższy jest łańcuch wykonanych działań tym gorzej dla dokładności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1