Autor Tema: Programacion en fortran 90/95

0 Usuarios y 1 Visitante están viendo este tema.

08 Febrero, 2014, 07:10 pm
Leído 2322 veces

la luna

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 39
  • Karma: +0/-0
  • Sexo: Femenino
Hola.

Comienzo a familiarizarme con la programación y me gustaría hacer un programa para calcular la raíz de una función mediante el método de la tangente. Utilizando lenguaje de fortran90 o 95. Agradecería mucho si me explican cómo puedo hacerlo.

\( f(x)=-x^3+x\cos(x)+4 \)

08 Febrero, 2014, 08:14 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Primero tendrías que expresar matemáticamente cómo quedaría la sucesión de valores que se aproximan a la solución.
Si la sucesión la llamamos \( x_n \), hay que expresar el "siguiente" elemento de la sucesión \( x_{n+1} \) a partir del valor \( x_n \).

Primero hay que hacer eso, y sólo después el programa, que es una mera transcripción a código del planteo matemático.

Saludos

09 Febrero, 2014, 12:00 am
Respuesta #2

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,447
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Tal como dijo argentinator, primero necesitas encontrar la sucesión que define el método de Newton, que es la que tienes aquí. Una vez que tengas esa ecuación recursiva, el código es inmediato. Yo jamás programé en FORTRAN, pero mirando por arriba la sintaxis llegué a este código:

FUNCTION df(x)
  IMPLICIT NONE
  REAL :: x, df
  df = -3*x**2 + cos(x) - x*sin(x)
END FUNCTION df

FUNCTION f(x)
  IMPLICIT NONE
  REAL :: x, f
  f = -x**3 + x*cos(x) + 4
END FUNCTION f

FUNCTION Newton(iterations, seed) RESULT(res)
  IMPLICIT NONE
  INTEGER :: i, iterations
  REAL :: res, seed
  REAL, EXTERNAL :: f, df
  res = seed
  DO i = 1, iterations-1
     res = res - f(res)/df(res)
  ENDDO
END

PROGRAM main
    IMPLICIT NONE
    REAL :: seed
    INTEGER :: iterations
    REAL, EXTERNAL :: f, df, Newton
    PRINT *, 'Semilla (introduzca un numero real): '
    READ *, seed
    PRINT *, 'Numero de iteraciones (introduzca un numero entero): '
    READ *, iterations
    PRINT *, Newton(iterations, seed)
END PROGRAM main

Saludos.

P.D. Esta solución es meramente orientativa; puede que no respete prácticas de buena programación en FORTRAN, porque como dije, no estoy familiarizado a este lenguaje. Tampoco es necesario que uses un número fijo de iteraciones como condición de parada, podría ser que la diferencia en valor absoluto con el término anterior sea menor que cierta tolerancia, etc.
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

13 Febrero, 2014, 02:47 am
Respuesta #3

la luna

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 39
  • Karma: +0/-0
  • Sexo: Femenino
Muchas gracias pabloN. Lo que me cuesta trabajo es saber como desarrollar el código.
Ahora es mucho más claro  ;D

13 Febrero, 2014, 06:10 am
Respuesta #4

mathtruco

  • Moderador Global
  • Mensajes: 5,598
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
P.D. Esta solución es meramente orientativa; puede que no respete prácticas de buena programación en FORTRAN, porque como dije, no estoy familiarizado a este lenguaje.

El programa respeta las buenas prácticas de Fortran 90/95  ;)    Como Fortran existe casi desde la creación de los computadores, hay que ser cuidadosos con los códigos que uno pilla en internet, ya que aunque pueden correr podrían tener mañas de programación obsoletas, como bien advierte pabloN.

Sobre como escribir un código, lo mejor (creo yo) es tomar un ejemplo sencillo y hacer los cálculos a mano para dos o tres iteraciones. Con eso sabrás qué paso debe hacerse antes que otro, qué variables debes definir y los bucles aparecerán solos. Nunca es buena idea escribir un programa sin entender sus pasos. Esto además te permitirá tener un ejemplo para verificar que las cuentas salen bien.