Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,25 +1,49 @@
|
|||
/*REXX pgm solves example of Newton's cooling law via Euler's method (diff. step sizes).*/
|
||||
e=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138
|
||||
numeric digits length(e) - length(.) /*use the number of decimal digits in E*/
|
||||
parse arg Ti Tr cc tt ss /*obtain optional arguments from the CL*/
|
||||
if Ti='' | Ti="," then Ti= 100 /*given? Default: initial temp in ºC.*/
|
||||
if Tr='' | Tr="," then Tr= 20 /* " " room " " " */
|
||||
if cc='' | cc="," then cc= 0.07 /* " " cooling constant. */
|
||||
if tt='' | tt="," then tt= 100 /* " " total time seconds. */
|
||||
if ss='' | ss="," then ss= 2 5 10 /* " " the step sizes. */
|
||||
@= '═' /*the character used in title separator*/
|
||||
do sSize=1 for words(ss); say; say; say center('time in' , 11)
|
||||
say center('seconds' , 11, @) center('Euler method', 16, @) ,
|
||||
center('analytic', 18, @) center('difference' , 14, @)
|
||||
$=Ti; inc= word(ss, sSize) /*the 1st value; obtain the increment.*/
|
||||
do t=0 to Ti by inc /*step through calculations by the inc.*/
|
||||
a= format(Tr + (Ti-Tr)/exp(cc*t),6,10) /*calculate the analytic (exact) value.*/
|
||||
say center(t,11) format($,6,3) 'ºC ' a "ºC" format(abs(a-$)/a*100,6,2) '%'
|
||||
$= $ + inc * cc * (Tr-$) /*calc. next value via Euler's method. */
|
||||
end /*t*/
|
||||
end /*sSize*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
exp: procedure expose e; arg x; ix= x%1; if abs(x-ix)>.5 then ix=ix+sign(x); x= x-ix; z=1
|
||||
_=1; w=1; do j=1; _= _*x/j; z= (z+_)/1; if z==w then leave; w=z
|
||||
end /*j*/; if z\==0 then z= e**ix * z; return z
|
||||
-- 18 Sep 2025
|
||||
include Setting
|
||||
|
||||
say "EULER METHOD FOR ODE y'=-0.07(y-20)"
|
||||
say version
|
||||
say
|
||||
call Task 0,100,2,100
|
||||
call Task 0,100,5,100
|
||||
call Task 0,100,10,100
|
||||
call Timer
|
||||
exit
|
||||
|
||||
Task:
|
||||
-- Euler method
|
||||
procedure expose Memo.
|
||||
arg x0,xn,dx,y0
|
||||
say 'From' x0 'to' xn 'step' dx
|
||||
say ' x Calc y True y Abs error Rel error'
|
||||
x=x0; y=y0
|
||||
do until x > xn
|
||||
if x//10 = 0 then
|
||||
call Show x,y
|
||||
y+=dx*Dy(y); x+=dx
|
||||
end
|
||||
say
|
||||
return
|
||||
|
||||
Show:
|
||||
-- Display a line
|
||||
procedure expose Memo.
|
||||
arg xx,yy
|
||||
yt=True(xx)
|
||||
say Format(xx,3,0) Format(yy,3,7) Format(yt,3,7),
|
||||
Left(Std(Abs(yy-yt)),9) Left(Std(Abs(yy/yt-1)),9)
|
||||
return
|
||||
|
||||
Dy:
|
||||
-- Differential equation
|
||||
procedure
|
||||
arg yy
|
||||
return -0.07*(yy-20)
|
||||
|
||||
True:
|
||||
-- Real solution
|
||||
procedure expose Memo.
|
||||
arg xx
|
||||
return 20+(100-20)*Exp(-0.07*xx)
|
||||
|
||||
include Math
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue