REM heat1d-i.bas
REM 陰解法による1次元熱方程式 (同次ディリクレ境界条件)
REM u_t(x,t)=u_{xx}(x,t), (x,t)∈(0,1)×(0,∞)
REM u(0,t)=u(1,t)=0, t∈(0,∞)
REM u(x,0)=f(x), x∈[0,1]
REM ---------------------------------------------
DECLARE EXTERNAL FUNCTION f
DECLARE EXTERNAL SUB trilu,trisol
INPUT PROMPT "分割数: ": N
IF N <= 0 THEN
LET N=20
LET lambda=0.5
LET theta=0.5
LET Tmax=1
LET dt=0.01
ELSE
INPUT PROMPT "λ: ": lambda
INPUT PROMPT "θ: ": theta
INPUT PROMPT "最終時刻: ": Tmax
INPUT PROMPT "Δt: ": dt
END IF
DIM u(0 TO N),ff(N-1),al(N-1),ad(N-1),au(N-1)
FOR i=1 TO N-1
LET al(i)=-theta*lambda
LET ad(i)=1+2*theta*lambda
LET au(i)=-theta*lambda
NEXT i
CALL trilu(N-1,al,ad,au)
SET WINDOW -0.2,1.2,-0.2,1.2
PLOT TEXT ,AT 0.4,0.8: "熱方程式"
PLOT TEXT ,AT 0.4,0.7 ,USING "N=### λ=##.#### θ=##.####":N,lambda,theta
LET h=1/N
LET tau=lambda*h*h
LET SKIP=INT(dt/tau)
LET nmax=Tmax/tau
FOR i=0 TO N
LET u(i)=f(i*h)
NEXT i
FOR i=0 TO N
PLOT LINES: i*h,u(i);
NEXT i
LET c3=1-2*(1-theta)*lambda
LET c4=(1-theta)*lambda
FOR k=1 TO nmax
FOR i=1 TO N-1
LET ff(i)=c3*u(i)+c4*(u(i+1)+u(i-1))
NEXT i
CALL trisol(N-1,al,ad,au,ff)
FOR i=1 TO N-1
LET u(i)=ff(i)
NEXT i
LET u(0)=0.0
LET u(N)=0.0
IF MOD(k,SKIP)=0 THEN
FOR i=0 TO N
PLOT LINES: i*h,u(i);
NEXT i
END if
NEXT k
END
REM **************** 初期データ *****************
EXTERNAL FUNCTION f(x)
IF (x < 0.5) THEN
LET f=x
ELSE
LET f=1-x
END IF
END FUNCTION
REM *************** LU分解 **********************
EXTERNAL SUB trilu(n,al(),ad(),au())
FOR i=1 TO n-1
LET al(i+1) = al(i+1) / ad(i)
LET ad(i+1) = ad(i+1) - au(i) * al(i+1)
NEXT i
END SUB
REM *********************************************
EXTERNAL SUB trisol(n,al(),ad(),au(),b())
FOR i=1 TO n-1
LET b(i+1) = b(i+1) - b(i) * al(i+1)
NEXT i
LET b(n) = b(n) / ad(n)
FOR i=n-1 TO 1 STEP -1
LET b(i) = (b(i) - au(i) * b(i+1)) / ad(i)
NEXT i
END SUB