Fortran 95 Taylor 系列程序意外行为

Fortran 95 Taylor series program unexpected behavior

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

objective 是 运行 sin(x) 函数的泰勒级数:多项式的次数和要计算的点(与真正的 sin( 相比x)) 将通过命令面板输入程序。

然后程序应该比较 sin(x) 函数的值和给定点的多项式,如果两者之间的差异大于开始时给定的 "tolerance" 值,则提供用户要么完成程序,要么为用于计算多项式的向量输入更多项(因此增加其次数和精度 - 假设 - )。

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

问题是,它可以正常编译运行,但如果输入的度数大于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

我想我已经找到你的问题了。您正在为大于 2 的阶数修改其边界之外的数组向量。例如,我在分配值的行之前的行中输入一行打印 i 的值和数组的大小 'vector' ani 到向量 (i).

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

       1           3
       2           3
       3           3
       4           3
       5           3

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

您必须调整此循环的结构以仅将值输入到 Vectors 边界。