免責事項:私は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
私はあなたが求める解決の程度が「n」であると推測します。コードは長さ 'n'に' vector'を割り当てます。最初の 'do'ループでは、インデックス(' i')は '1'から' 2n-1'まで延び、ベクトルの 'i'番目の要素に値が割り当てられます。 'n> = 2'のとき、コードは存在しない' vector'の要素に書き込みます( 'vector(3)'など)。これはFortranの時には驚くべき機能の1つで、このエラーはデフォルトでは実行中に捕捉されません。 *配列の境界チェック*を有効にして、再実行してからコードを再コンパイルしてみてください。私はこれがここにある(多くの)他の質問と重複していると確信しています。 –
いくつかの空行を使用すると良いですが、これはあまりにも多くあります。コードはコードウィンドウに収まらないため、それを見るためにはスクロールする必要があります。各コード行の後に空の行は必要ありません。 –