|
| Autor |
Mensaje |
dual
Registrado: 08 May 2009 Mensajes: 3
|
Publicado: Vie 08 May, 2009 22:38 pm
Título del mensaje: Programar en Fortran el metodo compuesto de Milne. |
|
|
Hola a todos. Os explico. Nos han pedido programar en Force (variante del Fortran) un programa que calcule una aproximación de la integral de una función por el método compuesto de milne. La verdad es que llevamos muchos dias peleando sin descanso, rompiéndonos la cabeza Y OOBSESIONADOS con el programita en cuestión y el tiempo se nos hecha encima. La cuestión es que nos da una serie de errores que no sonseguimos solucionar y mi petición es si, por favor, alguien puede echarme un cable y ayudarme a ver qué falla, a que se deben los errores. Os pongo el código del programa y la subrutina de la función, a ver si alguien más experimentado se da cuenta, ya que yo ya no sé ni qué probar!
Lo dicho, primero el código del programa:
include "func.f"
Program Milne
dimension a(20),b(20),sum1(20),n(20)
integer n,i
real a,b,sum1,func
write (*,*) "Escribe el primer valor del intervalo"
read (*,*) a
write (*,*) "Escribe el segundo valor del intervalo"
read (*,*) b
write (*,*) "Escribe el valor de n m£ltiple de 4"
read (*,*) n
h=(b-a)/n
call funcx
do i=0,n
x(i)=a+h*i
y(i)=func(i)
end do
sum1=7*(y(0)+y(n))
do i=1, n-1,mod(i,4)
if (mod(i,4).eq.1)then
sum1=sum1+32*y(i)
else if (mod(i,4).eq.3)then
sum1=sum1+32*y(i)
else if(mod(i,4).eq.2) then
sum1=sum1+12*y(i)
else
sum1=sum1+14*y(i)
end if
end do
sum1=sum1*2*h/45
write (*,*) "L'aproximacio en l'interval",a,b, "es",sum1
end
Y ahora el código de la subrutina donde está la función. Veréis que es simple, para probar, la función es F(x)=x:
real function funcx
real x
func=x
return
end
A priori dar mil y una gracias a la ayuda que me podáis prestar, sea mucha o poca. Cualquier cosilla me será vital para llegar a solucionar el problema. De veras, gracias!  |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 890 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
dual
Registrado: 08 May 2009 Mensajes: 3
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 890 Ubicación: y*width+x
|
Publicado: Lun 11 May, 2009 23:17 pm
Título del mensaje: Re: Programar en Fortran el metodo compuesto de Milne. |
|
|
jajajaja sabes que? hice un Copy/Paste al force, en este caso la v2.0, y y una vez que ejecutado, me salieron errores a punta pala, y casi todos de sintaxis... en otras palabras, quizás el código sea fortran, pero force es posible que tenga el suyo propio... aunque por ejemplo el write (*,*) no tenía ningún sentido en esa parte, así que para ayudarte tendría que aprender Force... si no te corre prisa haré un esfuerzo, de lo contrario me resultará difícil trabajar a contra reloj |
http://www.youtube.com/watch?v=DzLKIW86hmM
|
|
| Volver arriba |
|
|
Vila Usuario Iniciado

Registrado: 14 May 2010 Mensajes: 22
|
Publicado: Mie 07 Jul, 2010 21:11 pm
Título del mensaje: Re: Programar en Fortran el metodo compuesto de Milne. |
|
|
| dual escribió: | Hola a todos. Os explico. Nos han pedido programar en Force (variante del Fortran) un programa que calcule una aproximación de la integral de una función por el método compuesto de milne. La verdad es que llevamos muchos dias peleando sin descanso, rompiéndonos la cabeza Y OOBSESIONADOS con el programita en cuestión y el tiempo se nos hecha encima. La cuestión es que nos da una serie de errores que no sonseguimos solucionar y mi petición es si, por favor, alguien puede echarme un cable y ayudarme a ver qué falla, a que se deben los errores. Os pongo el código del programa y la subrutina de la función, a ver si alguien más experimentado se da cuenta, ya que yo ya no sé ni qué probar!
Lo dicho, primero el código del programa:
include "func.f"
Program Milne
dimension a(20),b(20),sum1(20),n(20)
integer n,i
real a,b,sum1,func
write (*,*) "Escribe el primer valor del intervalo"
read (*,*) a
write (*,*) "Escribe el segundo valor del intervalo"
read (*,*) b
write (*,*) "Escribe el valor de n m£ltiple de 4"
read (*,*) n
h=(b-a)/n
call funcx
do i=0,n
x(i)=a+h*i
y(i)=func(i)
end do
sum1=7*(y(0)+y(n))
do i=1, n-1,mod(i,4)
if (mod(i,4).eq.1)then
sum1=sum1+32*y(i)
else if (mod(i,4).eq.3)then
sum1=sum1+32*y(i)
else if(mod(i,4).eq.2) then
sum1=sum1+12*y(i)
else
sum1=sum1+14*y(i)
end if
end do
sum1=sum1*2*h/45
write (*,*) "L'aproximacio en l'interval",a,b, "es",sum1
end
Y ahora el código de la subrutina donde está la función. Veréis que es simple, para probar, la función es F(x)=x:
real function funcx
real x
func=x
return
end
A priori dar mil y una gracias a la ayuda que me podáis prestar, sea mucha o poca. Cualquier cosilla me será vital para llegar a solucionar el problema. De veras, gracias!  |
Nunca he usado el susodicho "Force". En un pasado, creo que ya remoto, programé en Fortran IV en Mainframes. Intento acordarme de aquel antediluviano lenguaje para poder resolver este problema.
Primer error:
Se han declarado arreglos con el mismo nombre que variables que vienen a continuación:
dimension a(20),b(20),sum1(20),n(20)
En esta línea se están definiendo arreglos a, b y n de dimensión 20, pero acto seguido aparece en el mismo programa principal la declaración:
integer n,i
real a,b,sum1,func
Donde aparecen declarados n, a y b como si fuesen variables simples de tipo entero, lo que a mi entender debe dar error de doble declaración.
Además, si las variables antes declaradas mediante Dimension son arreglos, donde quiera que se utilicen debe ser con sus subíndices, así:
a(i)
Con respecto a la función, si pretende al ser llamada pasarle un parámetro así:
y(i)=func(i)
Entonces en su declaración debe aparecer el parámetro al cual se le dará valor en el llamado, sin embargo la función aparece así declarada:
real function funcx
O sea declarada sin parámetro, a menos que el parámetro sea X en cuyo caso debería ir entre paréntesis.
Finalmente, noto que en el programa principal (main) se hace referencia a unos arreglos X y Y, como en las siguientes instrucciones:
x(i)=a+h*i
y(i)=func(i)
Pero en ninguna parte veo declaradas a X y Y como arreglos. Debería aparecer antes la línea:
Dimension X(20), Y(20)
Pero en ninguna parte la veo.
Sin ánimo de defender al Force (que coincido con WhiteSkull que es una porquería), no me extraña que cuando intenten compilarla les den errores a pasto.
Saludos |
|
|
|
| Volver arriba |
|
|