Hans Petter Langtangen 11 年之前
父节点
当前提交
76e56e9575
共有 2 个文件被更改,包括 35 次插入4 次删除
  1. 23 0
      examples/finite_differences.py
  2. 12 4
      examples/mesh_function.py

+ 23 - 0
examples/finite_differences.py

@@ -43,6 +43,22 @@ mesh = Composition({
         set_linecolor('black').set_linewidth(1)}),
     })
 
+# 1D mesh with three points for Crank-Nicolson
+mesh_cn = Composition({
+    'tnm1': Text('$t_{n}$', pb0 - point(0, 0.3)),
+    'tn': Text(r'$t_{n+\frac{1}{2}}$', p0 - point(0, 0.3)),
+    'tnp1': Text('$t_{n+1}$', pf0 - point(0, 0.3)),
+    'axis': Composition({
+        'hline': Line(pf0-point(3,0), pb0+point(3,0)).\
+        set_linecolor('black').set_linewidth(1),
+        'tick_m1': Line(pf0+point(0,tick), pf0-point(0,tick)).\
+        set_linecolor('black').set_linewidth(1),
+        'tick_n':  Line(p0+point(0,tick), p0-point(0,tick)).\
+        set_linecolor('black').set_linewidth(1),
+        'tick_p1': Line(pb0+point(0,tick), pb0-point(0,tick)).\
+        set_linecolor('black').set_linewidth(1)}),
+    })
+
 # Vertical dotted lines at each mesh point
 vlinec = Line(p, p0).set_linestyle('dotted').\
          set_linecolor('blue').set_linewidth(1)
@@ -108,5 +124,12 @@ for fig in forward, backward, centered, all:
     mesh.draw()
     drawing_tool.display()
     drawing_tool.savefig('fd_'+fig.get_name())
+# Crank-Nicolson around t_n+1/2
+drawing_tool.erase()
+centered.draw()
+mesh_cn.draw()
+drawing_tool.display()
+drawing_tool.savefig('fd_centered_CN')
+
 raw_input()
 

+ 12 - 4
examples/mesh_function.py

@@ -26,9 +26,9 @@ drawing_tool.set_linecolor('black')
 r = 0.005*(t_max-t_min)     # radius of circles placed at mesh points
 u_discrete = Composition({i: Composition(dict(
     circle=Circle(point(t, u(t)), r).set_filled_curves('black'),
-    u_point=Text('$u_%d$' % i,
-                 point(t, u(t)) + (point(0,5*r)
-                                   if i > 0 else point(-5*r,0))),
+    u_point=Text('$u^%d$' % i,
+                 point(t, u(t)) + (point(0,3*r)
+                                   if i > 0 else point(-3*r,0))),
     )) for i, t in enumerate(t_mesh)})
 
 interpolant = Composition({
@@ -56,16 +56,24 @@ illustration.draw()
 drawing_tool.display()
 drawing_tool.savefig(illustration.get_name())
 
-# Exact u line (u is a Spline Shape that applies 500 intervals by default
+# Add exact u line (u is a Spline Shape that applies 500 intervals by default
 # for drawing the curve)
 exact = u.set_linestyle('dashed').set_linewidth(1)
 exact.draw()
 drawing_tool.display()
 drawing_tool.savefig('%s_ue' % illustration.get_name())
 
+# Add linear interpolant
 interpolant.draw()
 drawing_tool.display()
 drawing_tool.savefig('%s_uei' % illustration.get_name())
 
+# Linear interpolant without exact, smooth line
+drawing_tool.erase()
+illustration.draw()
+interpolant.draw()
+drawing_tool.display()
+drawing_tool.savefig('%s_ui' % illustration.get_name())
+
 raw_input()