2017-11-10 4 views
0

免責事項:私はFortranプログラミングには非常に新しいので、多分ここにかなりの間違いがあります。Fortran 95 Taylorシリーズプログラムの予期しない動作

目的はsin(x)関数のためにテイラー級数を実行することです:多項式の次数と評価されるべき点(真の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'まで延び、ベクトルの 'i'番目の要素に値が割り当てられます。 'n> = 2'のとき、コードは存在しない' vector'の要素に書き込みます( 'vector(3)'など)。これはFortranの時には驚くべき機能の1つで、このエラーはデフォルトでは実行中に捕捉されません。 *配列の境界チェック*を有効にして、再実行してからコードを再コンパイルしてみてください。私はこれがここにある(多くの)他の質問と重複していると確信しています。 –

+0

いくつかの空行を使用すると良いですが、これはあまりにも多くあります。コードはコードウィンドウに収まらないため、それを見るためにはスクロールする必要があります。各コード行の後に空の行は必要ありません。 –

答えて

0

(それはすでにisn't場合)スペイン語ドント内のビットは、それが不可解作る願っています。例えば、私は、iの値を代入する行の直前の行に配列iの値と配列 'vector'のサイズを出力する行を入力しますベクトル(i)。このライン "印刷*、I、大きさ(ベクトル)" と

は、私が取得:

 1   3 
     2   3 
     3   3 
     4   3 
     5   3 

は、だから私> 3で、あなたは、Vector内に存在しない場所に値を割り当てます。配列を割り当てを解除しようとすると、あなたのコードは 'SIGABRT'エラーをスローします。

このループの構造を調整して、値をベクター境界にのみ入力する必要があります。