2017-11-10 2 views
0

면책 조항 : 저는 포트란 프로그래밍에 새로운 것이므로 여기에 상당한 실수가있을 것입니다.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 
+0

나는 'n'은 당신이 찾는 해결책의 정도라고 추측합니다. 코드는 길이'n'에'vector'를 할당합니다. 첫번째 do 루프에서 인덱스 (i)는 '1'에서 '2n-1'까지이며, 'vector'의 i 번째 요소에는 값이 할당됩니다. 'n> = 2' 일 때, 코드는 존재하지 않는'vector'의 요소들에 쓰게됩니다 (예를 들어'vector (3)'). 이 오류는 기본적으로 실행 중에 발견되지 않는 Fortran의 놀라운 기능 중 하나입니다. * 배열 범위 검사 *를 사용하여 코드를 다시 컴파일하고 다시 실행 한 다음 수정하십시오. 나는 이것이 여기에 (많은) 다른 질문들의 중복임을 확신한다. –

+0

빈 줄을 사용하는 것이 좋지만 너무 많습니다. 그런 다음 코드는 코드 창에 맞지 ​​않으므로 스크롤해야 많이 볼 수 있습니다. 각 코드 행 다음에 빈 행이 필요하지 않습니다. –

답변

0

내가 문제를 발견 생각이 이해할 수 있도록 바랍니다. 2보다 큰 차수의 배열 바깥 쪽에서 배열 벡터를 수정하려고합니다. 예를 들어, ani의 값을 할당 한 줄 바로 앞 줄에 'vector'배열의 크기와 i 값을 출력하는 라인을 입력합니다. 벡터 (i). 이 라인 "인쇄 *, 난, 크기 (벡터)"와

, 내가 얻을 :

 1   3 
     2   3 
     3   3 
     4   3 
     5   3 

그래서 난> 3 당신이 벡터에 존재하지 않는 위치에 값을 할당에서. 배열을 할당 해제하려고하면 코드에서 'SIGABRT'오류가 발생합니다.

벡터 경계에 값만 입력하도록이 루프의 구조를 조정해야합니다.