Help, me!! 誰か、オレにこの怪現象の解決法を教えるケロ!! [ひとこと言わねば]
ネムネコ、プログラミングで予期せぬ事態に遭遇し、当惑する。
parameter (ns=100,ns1=101)
real x(0:ns), y(0:ns)
data x,y/ns1*0.,ns1*0/
n=10
x0=0.; xn=1. ! 境界のx座標
x(0)=x0; x(n)=xn
y(0)=2.; y(n)=0. ! 境界条件
call Solver(x,y,ns,n)
!write(6,*) 'main'
do i=0, n
! write(6,*) i, x(i), y(i)
end do
end
function f(x)
f=-14./x
end
function g(x)
g=x**3
end
function h(x)
h=2*x**3
end
! ここより下はいじると危険
! ブラックボックスとして使うにゃ
subroutine Solver(x,y,ns,n)
real a(ns),b(ns),c(ns),d(ns)
real x(0:ns), y(0:ns)
n1=n-1
dx=(x(n)-x(0))/n
do i=i,n1
x(i)=x(0)+i*dx
end do
do i=1,n1
a(i)=1-dx/2.*f(x(i))
b(i)=-(2-dx*dx*g(x(i)))
c(i)=1+dx/2.*f(x(i))
d(i)=dx*dx*h(x(i))
end do
d(1)=d(1)-a(1)*y(0)
d(n1)=d(n1)-c(n1)*y(n)
call tdma(a,b,c,d,n1)
do i=1,n1
y(i)=d(i)
end do
write(6,*) 'subroutine'
do i=0, n
write(6,*) i, x(i), y(i)
end do
end
subroutine tdma(a,b,c,d,n)
real a(n), b(n), c(n),d(n)
do i=1,n-1
ratio=a(i+1)/b(i)
b(i+1)=b(i+1)-ratio*c(i)
d(i+1)=d(i+1)-ratio*d(i)
end do
d(n)=d(n)/b(n)
do i=n-1,1,-1
d(i)=(d(i)-c(i)*d(i+1))/b(i)
end do
end
これだと、正しい計算結果を表示してくれるにゃ。
なのにだよ、
parameter (ns=100,ns1=101)
real x(0:ns), y(0:ns)
data x,y/ns1*0.,ns1*0/
n=10
x0=0.; xn=1. ! 境界のx座標
x(0)=x0; x(n)=xn
y(0)=2.; y(n)=0. ! 境界条件
call Solver(x,y,ns,n)
write(6,*) 'main'
do i=0, n
! write(6,*) i, x(i), y(i)
end do
end
function f(x)
f=-14./x
end
function g(x)
g=x**3
end
function h(x)
h=2*x**3
end
! ここより下はいじると危険
! ブラックボックスとして使うにゃ
subroutine Solver(x,y,ns,n)
real a(ns),b(ns),c(ns),d(ns)
real x(0:ns), y(0:ns)
n1=n-1
dx=(x(n)-x(0))/n
do i=i,n1
x(i)=x(0)+i*dx
end do
do i=1,n1
a(i)=1-dx/2.*f(x(i))
b(i)=-(2-dx*dx*g(x(i)))
c(i)=1+dx/2.*f(x(i))
d(i)=dx*dx*h(x(i))
end do
d(1)=d(1)-a(1)*y(0)
d(n1)=d(n1)-c(n1)*y(n)
call tdma(a,b,c,d,n1)
do i=1,n1
y(i)=d(i)
end do
write(6,*) 'subroutine'
do i=0, n
write(6,*) i, x(i), y(i)
end do
end
subroutine tdma(a,b,c,d,n)
real a(n), b(n), c(n),d(n)
do i=1,n-1
ratio=a(i+1)/b(i)
b(i+1)=b(i+1)-ratio*c(i)
d(i+1)=d(i+1)-ratio*d(i)
end do
d(n)=d(n)/b(n)
do i=n-1,1,-1
d(i)=(d(i)-c(i)*d(i+1))/b(i)
end do
end
と、赤いところを変更すると、計算結果の出力がおかしくなる。
なぜ、このようなことが起きるんだろう(・・?
オレが悪いのか、ネムネコの使っているFortranコンパイラーが悪いのか(・・?
ネムネコのFortranはC言語に汚染されているから、プログラム中でちょっと危ないことをしているのかもしれないけれど、それにしたって、なぜ、write(6,*) 'main'の一文を入れると、それ以前のものまでおかしくなるのか、理解できないにゃ。
この怪現象が何故起きるのか、分かる奴は教えるにゃ。
Fortranコンパイラを持っている奴は、コンパイルして、オレと同じような現象に見舞われるか、試してみるにゃ。そして、変なことが起きなければ、起きないと教えて欲しいにゃ。
2017-11-10 23:52
nice!(0)
コメント(3)
まず現象を切り分けましょう。
「!」はコメント記号ですよね?。そうするとます、
!write(6,*) 'main'
do i=0, n
! write(6,*) i, x(i), y(i)
end do
では、そもそも何にも出力されないような気がします。
「write(6,*) i, x(i), y(i)」の前の「!」は誤植?。
まずは、そこから・・・(^^)。
by ddtddtddt (2017-11-11 22:30)
do i=i,n1 ← i=i ではなく 1 の間違いだろうと思いまちゅでちゅ
x(i)=x(0)+i*dx
end do
by プリプリちぃちゃん (2017-11-11 22:38)
do i=i,n1 ← i=i ではなく 1 の間違いだろうと思いまちゅでちゅ
x(i)=x(0)+i*dx
end do
あっ、ほんとだ、間違っている(>_<)
「プリプリちいちゃん」さん、ありがとうございます。
致命的とも言える間違いを犯しているのに、なぜ、これで計算できたのだろう・・・。
iはこの時点でゴミの値が入っているのだから、プログラムの実行時にエラーが起きてもおかしくないのに・・・。
それはそれとしまして、
間違いがわかり、おかしな値が出なくなりました。
ありがとうございますm(__)m
by nemurineko (2017-11-12 13:09)