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 边界。
免责声明:我对 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 边界。