Fortran: Gauss Jordan, Metoda połowienia przedziału - objaśnienie dwóch kodów.

0

Witam.
Czy mógłbym prosić kogoś o objaśnienie krok po kroku tych dwóch programów poniżej?
Jutro mam częściowe zaliczenie metod numerycznych ,a niestety nie jestem wybitny w programowaniu - dlatego też zwracam się z prośbą o pomoc tutaj.
Nie wiem kompletnie nic, dlatego prosiłbym o proste objaśnienie, najlepiej skomentowanie każdej z linii.

program polowienieprzedzialow
	a=1
	b=4
	ex=1e-6
	ef=1e-6
	x=(a+b)/2
	fx=f(x)
	fa=f(a)
do while ((b-a)/2 > ex .AND. abs(fx) > ef)
if (fa*fx<0) then
  b=x
else 
  a=x
  fa=fx
endif
x=(a+b)/2
fx=f(x)
end do

write (*,*)x
end

function f(x)
	f=sin(x)
end
program gauss
dimension r(10,11),x(10)
integer x
open(3,file='dane.txt')
read(3,*)n
do i=1,n
  read(3,*)(r(i,j),j=1,n+1)
enddo
close(3) /*wczytanie danych z pliku

! R=[A b] 
do i=1,n /*ustawienie jedynek na przekatnej
  	c=r(i,i)
	do k=i,n+1 /*podzielenie z obustronne i odjecie w i-tym wierszu wartosci z niewiadomych
    	r(i,k)=r(i,k)/c 
    enddo
    do j=1,n
        c=r(j,i)
        if (i/=j) then
            do k=1,n+1
            r(j,k)=r(j,k)-r(i,k)*c     
            enddo
        endif
    enddo
enddo
! R=[I x]



open(4,file='x.txt')
do i=1,n
write(*,*)(r(i,j),j=1,n+1)
enddo
close(4)

end
0

Ad. 1.: Opis metody http://www.algorytm.edu.pl/algorytmy-maturalne/metoda-polowienia-przedzialow.html

program polowienieprzedzialow
    ! a, b - końce przedziału [a, b].
    a = 1
    b = 4
    ! Epsilony maszynowe dla dziedziny i wartości funkcji.
    ex = 1e-6
    ef = 1e-6
    ! Początkowa wartość x - docelowo znajdzie się w niej rozwiązanie (miejsce
    ! zerowe f).
    x = (a + b) / 2
    ! Zmienne pomocnicze, żeby nie wołać f(x) w kółko.
    fx = f(x)
    fa = f(a)

    ! Pętla przerywana dwoma warunkami:
    ! 1) długość przedziału nie większa od ex
    ! 2) wartość f(x) różna co do wartości bezwzględnej od zera o nie więcej
    !    niż ef.
    ! Po mojemu warunek (2) załatwia sprawę, ale nie będę się kłócił.
    do while ((b - a) / 2 > ex .AND. abs(fx) > ef)
        ! Krytyczna rzecz - sprawdzamy, który z końców przedziału mamy
        ! "przesunąć". Efektywnie ten krok zbliża nas do rozwiązania.
        if (fa * fx < 0) then
                b = x
        else
                a = x
                fa = fx
        endif
        ! Dla nowo wybranych końców przedziału wyznaczamy środek i zaczynamy
        ! zabawę od kolejnego obiegu pętli.
        x = (a + b) / 2
        fx = f(x)
    end do

    write (*,*)x
end

! Funkcja, której miejsca zerowego szukamy
function f(x)
    f = sin(x)
end
0

Ad. 2. Tutaj opis metody: http://eduinf.waw.pl/inf/alg/001_search/0076.php

program gauss

        dimension r(10,11), x(10)
        integer x

        open(3,file='dane.txt')
        read(3,*)n
        ! Czytamy dane z pliku. Trzeba uważać, bo r ma wymiary 10x11, a
        ! my tu mamy jakieś n podawane z palca.
        do i = 1, n
                read(3,*) (r(i, j), j = 1, n + 1)
        enddo
        close(3)

        ! R = [A b]
        ! To powyżej oznacza, że jak masz równanie Ax = b, to macierz A i wektor
        ! b znalazły się w jednej macierzy R :)
        do i = 1, n
                ! Bierzemy sobie wartość z przekątnej.
                c = r(i, i)
                do k = i, n + 1
                        ! Skalowanie całego wiersza - czyli dzielimy cały i-ty
                        ! wiersz przez wartość na przekątnej.
                        r(i, k) = r(i, k) / c
                enddo
                do j = 1, n
                        ! Ponieważ zeskalowaliśmy wiersz, to teraz jesteśmy w
                        ! stanie wykonać przeliczenie pozostałej części
                        ! macierzy.
                        c = r(j, i)
                        if (i /= j) then
                                do k = 1, n + 1
                                        r(j, k) = r(j, k) - r(i, k) * c
                                enddo
                        endif
                enddo
        enddo

        ! R=[I x]
        ! W efekcie po przejściu algorytmu w macierzy R powinniśmy mieć macierz
        ! jednostkową oraz rozwiązanie.

        ! Tutaj w zasadzie leci tylko zapis wynikowej macierzy r.
        open(4, file='x.txt')
        do i = 1, n
                write(4,*) (r(i, j), j = 1, n + 1)
        enddo
        close(4)

end

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