6
I created a code that uses 3 methods to determine the roots of a function, the direct method of kicking x, Newton-Raphson and secant values. In the direct method, I set x values close to the roots, and I used while to add increments of 0.1 to these values until the moment the function changed signal, proximity situation of f(x) = 0. Only as a result, my program gets inifitamente inside those of while and does not run the rest. Here is my code
  program raizes
     implicit none
     integer n, i           !escolha dos chutes iniciais para cada raiz
     real*8, parameter :: r1=-3.d0/10.d0,r2=1.d0/10.d0,r3=4.d0/10.d0
     real*8 r1d, r2d, r3d, xd !novos valore de x a serem testados no
                               !método direto
     real*8 r1_nr, r2_nr, r3_nr, nr1, nr2, nr3 !variáveis do método 
                                               !Newton-Raphson
     real*8 r1_si,r2_si,r3_si,r1_s,r2_s,r3_s,sec1,sec2,sec3 !variáveis do
                                        !método das secantes
     read(*,*)n
     open(10,file="tab3_out.dat")
     xd = 0.d0
     do i = 0, n-1
     !Método Iteração direta
        xd =xd + 1.d0/10.d0 !incremento do chute inicial do método direto
        do while (f(r1d).ge.0.d0) !situação em que a função quase muda 
                                  !de sinal
           r1d = r1 - xd !como a raíz está em -0.5, o r1 deve ser 
                         !diminuído
        end do
        do while (f(r2d).ge.0.d0)
           r2d = r2 + xd !como a raíz está em 0.33,o r2 deve ser   
                       !aumentado        
        end do
        do while (f(r3d).le.0.d0)!situação em que a função está quase 
                                 !mudando de sinal
           r3d = r3 + xd !como a raíz está em 0.66, o r3 deve ser 
                         !aumentado
        end do
     !Método Newton-Raphson (N-R)
        r1_nr = r1 !----------valores iniciais de x
        r2_nr = r2
        r3_nr = r3
        nr1 = r1_nr - f(r1_nr)/df(r1_nr) !equação de N-R
        nr2 = r2_nr - f(r2_nr)/df(r2_nr) !equação de N-R
         nr3 = r3_nr +f(r3_nr)/df(r3_nr) !equação de N-R
        r1_nr = nr1 !alterando os valores iniciais de x para a 
        r2_nr = nr2 !próxima iteração
        r3_nr = nr3
     !Método Secante
        r1_si = -2.d0/10.d0 !valores xi-1 na equação do método da secante
        r2_si =  0.d0
        r3_si =  3.d0/10.d0
        r1_s = r1           !valores xi na equação
        r2_s = r2
        r3_s = r3
        sec1 = r1_s - f(r1_s)*(r1_s - r1_si)/(f(r1_s)-f(r1_si)) !fórmula
                                                    !método das secantes
        sec2 = r2_s - f(r2_s)*(r2_s - r2_si)/(f(r2_s)-f(r2_si))
        sec3 = r3_s - f(r3_s)*(r3_s - r3_si)/(f(r3_s)-f(r3_si))
        r1_si = r1_s  !alterando os valores de xi-1 e xi para a próxima 
                       !iteração
        r2_si = r2_s
        r3_si = r3_s
        r1_s = sec1
        r2_s = sec2
        r3_s = sec3
        write(10,*) i,r1d,r2d,r3d,nr1,nr2,nr3,sec1,sec2,sec3
     end do
     close(10)
     contains !----------definições da função e de sua derivada
        real*8 function f(x)
     real*8 x
          f = 18.d0*(x**3.d0)-9.d0*(x**2.d0)-5.d0*x+2.d0
     end function f
     real*8 function df(x)
     real*8 x
          df = 54.d0*(x**2.d0)-18.d0*x-5.d0
     end function df
  end program raizes
I would like a suggestion to solve that while problem.
The values of the variables
r1d,r2dandr3ddo not change within the responses loopings (while). Probably, or the values of the variablesr1,r2andr3or the value ofxdshall be updated within loopings for them to finish.– Gomiero
I’ll try to get them updated, thanks for the tip.
– Lívia Dantas