¼ø¶È»ñÎÁ/04 ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î¸½ºß¤È¤Îº¹Ê¬(No.2)


  • Äɲ䵤줿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
  • ºï½ü¤µ¤ì¤¿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
* ¾ïÈùʬÊýÄø¼°¤Îµá²ò [#ua9e43bb]

¤³¤³¤Ç¤Ï¡¢n ³¬¤Î¾ïÈùʬÊýÄø¼°¤Ï°ì³¬¤Î¾ïÈùʬÊýÄø¼°¤ËÊÑ·Á¤·¡¢u(t) = f(u,t) ¤È¤¤¤¦·Á¼°¤È¤·¤Æ¼è¤ê°·¤¦¤³¤È¤Ë¤·¤Æ¤ª¤¯¡¥

¤µ¤Æ¡¢¾ïÈùʬÊýÄø¼°¤Îµá²ò¤Ë¤Ï¡¢Â绨ÇĤ˸À¤Ã¤Æ
- °ìÃÊË¡: ¤¢¤ë»þÅÀ t ¤Î¥Ç¡¼¥¿ u(t) ¤¬Í­¤ì¤Ð¡¢¦¤t ¤À¤±·Ð¤Ã¤¿¼¡¤Î»þ´Ö t+¦¤t ¤Î¶á»÷ÃÍ u(t+¦¤t) ¤¬·×»»¤Ç¤­¤ëÊýË¡
- °ìÃÊË¡: u(t) ¤Î¶á»÷Ãͤò·×»»¤¹¤ë¤¿¤á¤Ë¡¢u(t-¦¤t) ¤Î¥Ç¡¼¥¿¤À¤±¤¢¤ì¤ÐºÑ¤àÊýË¡¡¥
- ¿ÃÊË¡: u(t) ¤Î¶á»÷Ãͤò·×»»¤¹¤ë¤¿¤á¤Ë¡¢u(t-¦¤t) ¤À¤±¤Ç¤Ï¤Ê¤¯¡¢u(t-2¦¤t), u(t-3¦¤t) ¤Ê¤É¡¢Ê£¿ô¤Î²áµî¥Ç¡¼¥¿¤òɬÍפȤ¹¤ëÊýË¡

¤ÎÆó¼ïÎब¤¢¤ë¡¥

** °ìÃÊË¡ [#re808e45]

´Êñ¤À¤¬°ÂÄêÀ­¤ÈÀºÅÙ¤ËÆñ¤¢¤ê¤Î Euler Ë¡¤È¡¢´è·ò¤Ê Runge-Kutta Ë¡¤ÎÆó¤Ä¤ò¼ø¶È¤Ç¤ÏÀâÌÀ¤·¤¿¡¥
°Ê²¼¡¢¥×¥í¥°¥é¥à¤òºÜ¤»¤Æ¤ª¤³¤¦¡¥

*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à: Euler Ë¡ 1 [#n03818b6]

¿Í¸ýÌäÂê¤ËÂФ¹¤ë¤«¤Ê¤ê¥·¥ó¥×¥ë¤Ê¥â¥Ç¥ëÊýÄø¼°¤Ç¤¢¤ë
du/dt = u(1-u) ¤È¤¤¤¦¾ïÈùʬÊýÄø¼°¤ËÂФ·¤Æ Euler Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥

// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Euler method program for the initial value problem (1).
include Math

##### constants #####
# calculation t from 0 to Tmax.
Tmax = 10.0

# Delta t
Dt = 1.0/10

# Initial value of u
IniU = 0.4

##### functions #####
# Right hand side of ODE
def f(u)
  return u*(1.0-u)
end

# update of the approximate solution
def new_by_euler(u)
  return u + Dt * f(u)
end

# result
def print_result(u,t)
  printf("%.6f  %.6f\n", t, u)
end

##### main program #####
# initialization
u = IniU
print_result(u, 0.0)

# main loop
for i in (1..(Tmax/Dt).ceil )
  u = new_by_euler(u)
  print_result(u, i*Dt)
end
}}

*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à: Euler Ë¡ 2 [#vaac1276]

¥µ¥á¤Èµû¤Î¤è¤¦¤Ê¡¢Èï¿©¼Ô-Êá¿©¼Ô¤Î´Ø·¸¤¬¤¢¤ë¤È¤­¤Î¤½¤Î¼ï¤Î¿ô¤ÎÊÑÆ°¤Ë´Ø¤¹¤ë¥·¥ó¥×¥ë¤Ê¥â¥Ç¥ë¾ïÈùʬÊýÄø¼°¤ËÂФ·¤Æ Euler Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥
ÊýÄø¼°¤Ï µûÁêÅö¤Î¼ï¤Îɤ¿ô¤ò u(t), ¥µ¥áÁêÅö¤Î¼ï¤Îɤ¿ô¤ò v(t) ¤È¤¹¤ë¤È 
&br;   
du/dt = (2-v)u, 
&br;   
dv/dt = (2u-3)v, &br;
¤È¤¤¤¦Ï¢Î©°ì³¬¾ïÈùʬÊýÄø¼°¤Ç¤¢¤ë¡¥

// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Euler method program for the initial value problem (2).
include Math

##### constants #####
# calculation t from 0 to Tmax.
Tmax = 10.0

# Delta t
Dt = 1.0/100

# Initial value of u
IniU = [4.0, 1.0]

##### functions #####
# Right hand side of ODE
def f(u)
  a = u[0]
  b = u[1]
  return [ (2.0-b)*a, (2.0*a-3.0)*b ]
end

# update of the approximate solution
def new_by_euler(u)
  v = f(u)
  return [ u[0] + Dt*v[0], u[1] + Dt*v[1] ]
end

# result
def print_result(u,t)
  printf("%.4f  %.4f  %.4f\n", t, u[0], u[1])
end

##### main program #####
# initialization
u = IniU
print_result(u, 0.0)

# main loop
for i in (1..(Tmax/Dt).ceil )
  u = new_by_euler(u)
  print_result(u,i*Dt)
end
}}

*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à: Runge-Kutta Ë¡ 1 [#r95c9463]

ƱÍͤË
du/dt = u(1-u) ¤È¤¤¤¦¾ïÈùʬÊýÄø¼°¤ËÂФ·¤Æ Runge-Kutta Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥

// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Runge--Kutta method program for the initial value problem (1).
include Math

##### constants #####
# calculation t from 0 to Tmax.
Tmax = 10.0

# Delta t
Dt = 1.0/10

# Initial value of u
IniU = 0.4

##### functions #####
# Right hand side of ODE
def f(u)
  return u*(1.0-u)
end

# update of the approximate solution
def new_by_rk(u)
  f1 = f(u)
  f2 = f(u + 0.5*Dt*f1)
  f3 = f(u + 0.5*Dt*f2)
  f4 = f(u + Dt*f3)
  return u + Dt*(f1/6.0 + f2/3.0 + f3/3.0 + f4/6.0)
end

# result
def print_result(u,t)
  printf("%.6f  %.6f\n", t, u)
end

##### main program #####
# initialization
u = IniU
print_result(u, 0.0)

# main loop
for i in (1..(Tmax/Dt).ceil )
  u = new_by_rk(u)
  print_result(u, i*Dt)
end
}}

*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à: Runge-Kutta Ë¡ 2 [#ye83643e]

ƱÍͤË
&br;   
du/dt = (2-v)u, 
&br;   
dv/dt = (2u-3)v, &br;
¤È¤¤¤¦Ï¢Î©°ì³¬¾ïÈùʬÊýÄø¼°¤ËÂФ¹¤ë Runge-Kutta Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥

// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Runge--Kutta method program for the initial value problem (2).
include Math

##### constants #####
# calculation t from 0 to Tmax.
Tmax = 10.0

# Delta t
Dt = 1.0/100

# Initial value of u
IniU = [4.0, 1.0]

##### functions #####
# Right hand side of ODE
def f(u)
  a = u[0]
  b = u[1]
  return [ (2.0-b)*a, (2.0*a-3.0)*b ]
end

# update of the approximate solution
def new_by_rk(u)
  f1 = f(u)
  f2 = f([ u[0]+0.5*Dt*f1[0], u[1]+0.5*Dt*f1[1] ])
  f3 = f([ u[0]+0.5*Dt*f2[0], u[1]+0.5*Dt*f2[1] ])
  f4 = f([ u[0]+Dt*f3[0], u[1]+Dt*f3[1] ])
  a = u[0] + Dt * (f1[0]/6.0 + f2[0]/3.0 + f3[0]/3.0 + f4[0]/6.0)
  b = u[1] + Dt * (f1[1]/6.0 + f2[1]/3.0 + f3[1]/3.0 + f4[1]/6.0)
  return [ a,b ]
end

# result
def print_result(u,t)
  printf("%.4f  %.4f  %.4f\n", t, u[0], u[1])
end

##### main program #####
# initialization
u = IniU
print_result(u, 0.0)

# main loop
for i in (1..(Tmax/Dt).ceil )
  u = new_by_rk(u)
  print_result(u,i*Dt)
end
}}


** ¿ÃÊË¡ [#r0fc4e7e]

°ìÃÊË¡¤Î Runge-Kutta Ë¡¤ÈƱÍͤËÀºÅÙ¤ò(ÍýÏÀŪ¤Ë¤Ï)¼«Í³¤Ë¤¢¤²¤é¤ì¤ë¿ÃÊË¡¤È¤·¤Æ¡¢Àþ·Á¿Ãʳ¬Ë¡¤ò¼ø¶È¤ÇÀâÌÀ¤·¤¿¡¥
Àþ·Á¿Ãʳ¬Ë¡¤Ï¡¢·×»»ÀºÅÙ¤ò¤¢¤²¤Æ¤âÈ¡¿ô·×»»¤È¤·¤Æ¤Î·×»»Î̤¬Áý¤¨¤Ê¤¤¤È¤¤¤¦ÂçÊѤ¹¤°¤ì¤¿À­¼Á¤¬¤¢¤ë¡¥
¤¿¤À¤·¡¢²ò¤ÎÈ¡¿ô¤¬¤¢¤ëÄøÅÙ³ê¤é¤«¤Ç¤¢¤ë¤³¤È¤¬Á°Äó¤È¤µ¤ì¤ë¤³¤È¤ä¡¢²áµî¤Î°ìÄê¤Î¥Ç¡¼¥¿¤ÎÊݸ¤¬É¬Íפʤ³¤È¡¢»þ´ÖÎ¥»¶Éý ¦¤t ¤ò¤½¤Î¾ì¤½¤Î¾ì¤ÇÊѹ¹¤·¤è¤¦¤È¤¹¤ë¤ÈÂçÊѤʤ³¤È¡¢¤È¤¤¤¦¤¢¤¿¤ê¤¬Âå¤ï¤ê¤ËÍ׵ᤵ¤ì¤ë¡¥

¤³¤ì¤Ë¤Ä¤¤¤Æ¤â¥×¥í¥°¥é¥àÎã¤ò¤¢¤²¤Æ¤ª¤³¤¦¡¥


*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à 1 [#d604cf70]

¾å¤ÈƱÍͤË
du/dt = u(1-u) ¤È¤¤¤¦¾ïÈùʬÊýÄø¼°¤ËÂФ¹¤ëÀþ·Á¿Ãʳ¬Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥
// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Linear multistep method with 4 stages to the initial value problem 1).
include Math

##### constants #####
Tmax = 10.0
Dt = 1.0/10
IniU = 0.4

##### functions #####
# Right hand side of ODE
def f(u)
  return u*(1.0-u)
end

# update of the approximate solution (Runge-Kutta)
def new_by_rk(u)
  f1 = f(u)
  f2 = f(u + 0.5*Dt*f1)
  f3 = f(u + 0.5*Dt*f2)
  f4 = f(u + Dt*f3)
  return u + Dt*(f1/6.0 + f2/3.0 + f3/3.0 + f4/6.0)
end

# predictor
def predictor(old_u,old_f)
  return old_u + Dt * ((55.0/24.0)*old_f[0] - (59.0/24.0)*old_f[1] + (37.0/24.0)*old_f[2] - (3.0/8.0)*old_f[3])
end

# corrector
def corrector(old_u,old_f,new_f)
  return old_u + Dt * ((3.0/8.0)*new_f + (19.0/24.0)*old_f[0] - (5.0/24.0)*old_f[1] + (1.0/24.0)*old_f[2])
end

# result
def print_result(u,t)
  printf("%.6f  %.6f\n", t, u)
end

##### main program #####
# initialization
u = IniU
old_f = [f(u)]
print_result(u,0.0)

# we make more three initial values by Runge-Kutta method
for i in (1..3)
  u = new_by_rk(u)
  old_f.unshift(f(u))
  print_result(u,i*Dt)
end

# main loop by a LM with PECE cycle
for i in (4..N = (Tmax/Dt).ceil)
  new_u = predictor(u,old_f)       # P: prediction
  new_f = f(new_u)                 # E: Evaluation
  new_u = corrector(u,old_f,new_f) # C: Correction
  new_f = f(new_u)                 # E: Evaluation

  u = new_u
  old_f.unshift(new_f)
  old_f.delete_at(4)
  print_result(u,i*Dt)
end
}}


*** ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à 2 [#jfc36af8]

ƱÍͤË
&br;   
du/dt = (2-v)u, 
&br;   
dv/dt = (2u-3)v, &br;
¤È¤¤¤¦Ï¢Î©°ì³¬¾ïÈùʬÊýÄø¼°¤ËÂФ¹¤ëÀþ·Á¿Ãʳ¬Ë¡¤Ç¤Î¥×¥í¥°¥é¥à¡¥

// programu source ɽµ­
#highlighter(language=ruby,number=on,cache=off){{
# Linear multistep method with 4 stages to the initial value problem 2).
include Math

##### constants #####
Tmax = 10.0
Dt = 1.0/100
IniU = [4.0, 1.0]

##### functions #####
# Right hand side of ODE
def f(u)
  a = u[0]
  b = u[1]
  return [ (2.0-b)*a, (2.0*a-3.0)*b ]
end

# update of the approximate solution (Runge-Kutta)
def new_by_rk(u)
  f1 = f(u)
  f2 = f([ u[0]+0.5*Dt*f1[0], u[1]+0.5*Dt*f1[1] ])
  f3 = f([ u[0]+0.5*Dt*f2[0], u[1]+0.5*Dt*f2[1] ])
  f4 = f([ u[0]+Dt*f3[0], u[1]+Dt*f3[1] ])
  a = u[0] + Dt * (f1[0]/6.0 + f2[0]/3.0 + f3[0]/3.0 + f4[0]/6.0)
  b = u[1] + Dt * (f1[1]/6.0 + f2[1]/3.0 + f3[1]/3.0 + f4[1]/6.0)
  return [ a,b ]
end

# predictor
def predictor(old_u,old_f)
  a = old_u[0] + Dt * ((55.0/24.0)*old_f[0][0] - (59.0/24.0)*old_f[1][0] + (37.0/24.0)*old_f[2][0] - (3.0/8.0)*old_f[3][0])
  b = old_u[1] + Dt * ((55.0/24.0)*old_f[0][1] - (59.0/24.0)*old_f[1][1] + (37.0/24.0)*old_f[2][1] - (3.0/8.0)*old_f[3][1])
  return [a,b]
end

# corrector
def corrector(old_u,old_f,new_f)
  a = old_u[0] + Dt * ((3.0/8.0)*new_f[0] + (19.0/24.0)*old_f[0][0] - (5.0/24.0)*old_f[1][0] + (1.0/24.0)*old_f[2][0])
  b = old_u[1] + Dt * ((3.0/8.0)*new_f[1] + (19.0/24.0)*old_f[0][1] - (5.0/24.0)*old_f[1][1] + (1.0/24.0)*old_f[2][1])
  return [a,b]
end

# result
def print_result(u,t)
  printf("%.4f  %.4f  %.4f\n", t, u[0], u[1])
end

##### main program #####
# initialization
u = IniU
old_f = [f(u)]
print_result(u,0.0)

# we make more three initial values by Runge-Kutta method
for i in (1..3)
  u = new_by_rk(u)
  old_f.unshift(f(u))
  print_result(u,i*Dt)
end

# main loop by a LM with PECE cycle
for i in (4..(Tmax/Dt).ceil)
  new_u = predictor(u,old_f)       # P: prediction
  new_f = f(new_u)                 # E: Evaluation
  new_u = corrector(u,old_f,new_f) # C: Correction
  new_f = f(new_u)                 # E: Evaluation

  u = new_u
  old_f.unshift(new_f)
  old_f.delete_at(4)
  print_result(u,i*Dt)
end
}}

// ¨¬¨­¨®¨¯¨°¨±¨²¨³¨´¨µ¨¶

// ¥³¥Þ¥ó¥É¥é¥¤¥óÆþÎϤϡֹÔƬ¤ò > ¤Ç»Ï¤á¤ë¡×.
// ¥³¥Þ¥ó¥É¥é¥¤¥ó½ÐÎϤϡֹÔƬ¤ò¥Ö¥é¥ó¥¯¤Ç»Ï¤á¤ë¡×.

// ¼Â½¬¥¢¥¤¥³¥ó
// &ref(/materials/notes.png); 

// Ãí°Õ¥¢¥¤¥³¥ó
// &ref(/materials/warning.png);

// Link ¥¢¥¤¥³¥ó
// &ref(/materials/JNorth_arrow-right-sm.png); 

// OK ¥¢¥¤¥³¥ó
// &ref(/materials/OK.png);

// NG ¥¢¥¤¥³¥ó
// &ref(/materials/NG.png);

// ¥µ¥ó¥×¥ë¥¢¥¤¥³¥ó
// &ref(/materials/Gnome-Preferences.png);

// Âçʸ»ú¤Ç¤Î¶¯Ä´ 
// CENTER:&size(24){''¤Û¤²¤Û¤²''};

// programu source ɽµ­
// #highlighter(language=ruby,number=on,cache=on){{}}

// ¥Ñ¥¤¥×
// ¦#contents