면책 조항 : 저는 포트란 프로그래밍에 새로운 것이므로 여기에 상당한 실수가있을 것입니다.Fortran 95 테일러 시리즈 프로그램 예기치 않은 동작
목적은 sin (x) 함수에 대해 Taylor 시리즈를 실행하는 것입니다. 다항식의 차수와 평가 될 점 (실제 sin (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
나는 'n'은 당신이 찾는 해결책의 정도라고 추측합니다. 코드는 길이'n'에'vector'를 할당합니다. 첫번째 do 루프에서 인덱스 (i)는 '1'에서 '2n-1'까지이며, 'vector'의 i 번째 요소에는 값이 할당됩니다. 'n> = 2' 일 때, 코드는 존재하지 않는'vector'의 요소들에 쓰게됩니다 (예를 들어'vector (3)'). 이 오류는 기본적으로 실행 중에 발견되지 않는 Fortran의 놀라운 기능 중 하나입니다. * 배열 범위 검사 *를 사용하여 코드를 다시 컴파일하고 다시 실행 한 다음 수정하십시오. 나는 이것이 여기에 (많은) 다른 질문들의 중복임을 확신한다. –
빈 줄을 사용하는 것이 좋지만 너무 많습니다. 그런 다음 코드는 코드 창에 맞지 않으므로 스크롤해야 많이 볼 수 있습니다. 각 코드 행 다음에 빈 행이 필요하지 않습니다. –