Fortran 95 Taylor系列程序意外行为

时间:2017-11-10 01:45:53

标签: fortran gfortran fortran90

免责声明:我对fortran编程很新,所以这里可能会有很多错误。

目标是为sin(x)函数运行泰勒级数:多项式的次数和评估它的点(与真实的罪(x)相比)将通过程序输入命令pannel。

然后程序应该比较sin(x)函数和给定点的多项式的值,如果两者之间的差值大于开头给出的“容差”值,则为用户提供完成程序或为用于计算多项式的向量输入更多数量的项(从而增加其程度和精度 - 相应地 - )。

在任何情况下,当程序结束时,它应该在taylor.dat文件中写入结果(sin(x)在给定的点,该点的多项式的值和它们的差的绝对值)。

问题是,它将编译并正常工作,但如果输入的度数大于2,则在输入数据并退出程序后将不执行任何操作。 ¿有什么办法可以解决这个问题吗?

希望西班牙语中的一些东西不会让它变得难以理解(如果它还没有)

program taylor

implicit none

integer :: ierr, n, i, j, k, b, z, y 
real*8 :: x, tol, a, ani, puntoE, taylorn, err
real*8, allocatable :: Vector(:)
open(unit=12,file='Taylor.dat',status='new',iostat=ierr)
print*, ierr
print*, 'DESARROLLO DE TAYLOR PARA LA FUNCION sen(x) CENTRADO EN 0'
    print*,
    10 print*, 'Introducir numero de terminos del vector usado para el 
    desarrollo'
    read*, N 
    z=N+(N-1)
    print*, 'El grado del desarrollo sera=', z
    print*, 
    print*, 'Introducir x'
    read*, x 
    print*, 'Introducir tolerancia'
    read*, tol

allocate(Vector(n))


do i= 1, N+(N-1)                                       
    a= (-1)**(i-1)                                     ! a = (-1)**(n)
    b= 1
    do j= 1, (2*(i-1)+1)
        b= b*j                                         ! b = (2*n+1)!
    end do 
    !print*, 'a=', a 
    !print*, 'b=', b
    ani= a/b                                           ! Término del vector 
    !print*, 'ani=', ani 
    Vector(i)=ani 
    !print*, 'vector=', Vector
end do 


puntoE=x

do k= 1, N
    taylorn=taylorn+puntoE*Vector(k)                   ! Valor del desarrollo
end do 
err= abs(sin(x)-taylorn)

deallocate(Vector)

print*, 'Valor del sen(x) en x=', sin(x)
print*, 'Valor del polinomio con grado',z,'en',x,'=',taylorn
print*, 'Error en la aproximacion=', err
print*,

if(err>tol)then 
    print*, 'La precision es menor que la especificada: introducir un mayor numero de terminos "N"'
    print*,
    print*, 'Para introducir un numero mayor de terminos, pulse 1'
    print*, 'Para finalizar el programa, pulse 2'
    read*, y 

if(y==1) then
  go to 10
  else
  stop
end if

end if 

write(12, *) 'Valor del sen(x) en x=' 
write(12, *) sin(x)
write(12, *)
write(12, *) 'Valor del polinomio con grado',z,'en',x,'=' 
write(12, *) taylorn
write(12, *)
write(12, *) 'Error en la aproximacion=' 
write(12, *) err

end program taylor

1 个答案:

答案 0 :(得分:0)

我想我找到了你的问题。对于大于2的阶数,您正在修改其边界之外的数组向量。例如,我输入一行打印i的值和紧接在将ani的值赋给的行之前的行中的数组'vector'的大小矢量(i)。

用这行“print *,i,size(Vector)”,我得到:

       1           3
       2           3
       3           3
       4           3
       5           3

因此,在i> 3中,您将值分配给Vector中不存在的位置。当我尝试释放数组时,您的代码会抛出'SIGABRT'错误。

您必须将此循环的结构调整为仅向Vector bounds输入值。