MaPV

3_VP_1_crank-nicolson

Dec 12th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.38 KB | None | 0 0
  1. import pylab
  2. import numpy
  3. from matplotlib import mlab
  4. from mpl_toolkits.mplot3d import Axes3D
  5. from matplotlib import cm
  6.  
  7. #точное решение
  8. def ft(t,x):
  9.     return - x**4 + x + t*x + t**2 - t*numpy.exp(x)
  10. #начальное условие (x,0)
  11. def fn(x):
  12.     return - x**4 + x
  13. #левое граничное условие (0,t)
  14. def fl(t):
  15.     return t**2 - t
  16. #правое граничное условие  (1,t)
  17. def fr(t):
  18.     return t + t**2 - t*numpy.exp(1);
  19.  
  20. #функция f
  21. def f(t,x):
  22.     return x + 2*t - numpy.exp(x) - a*(-12*x**2-t*numpy.exp(x))
  23. #используется в вычислении прогоночных коэффициентов  beta
  24. def e(j, k):
  25.     return U[j][k] + c*(U[j][k+1] - 2*U[j][k] + U[j][k-1]) +  f(t*(j+1/2), h*k) * t
  26.  
  27. #--------------main_part
  28. t_knots = 11
  29. x_knots = 11
  30. a = 0.019
  31.  
  32. t = 1/(t_knots-1) #шаг по t
  33. h = 1/(x_knots-1) #шаг по х
  34.  
  35.  
  36. #начальные условия
  37. U = [[0]*x_knots for i in range(t_knots)]
  38. for k in range (x_knots):
  39.    U[0][k]=fn(k*h)
  40. #метод
  41.    #значения для вычисления прогоночных коэффициентов
  42. c = (a*t)/(2*h**2)
  43. A = -c
  44. B = 1 + 2*c
  45.  
  46. for j in range(1, t_knots):
  47.     #alpha - коэффициенты
  48.     alpha = []
  49.     alpha.append(0)
  50.     #beta - коэффициенты
  51.     beta = []
  52.     beta.append(fl(j*t))
  53.     for k in range(1, x_knots-1):
  54.         alpha.append(-A/(B+A*(alpha[k-1])))
  55.         beta.append((e(j - 1, k) - A*beta[k - 1])/(B + A*alpha[k - 1]))
  56.     #правое граничное условие
  57.     U[j][x_knots-1]=fr(j*t)
  58.  
  59.     #обратный ход
  60.     for k in range(x_knots - 2, -1, -1):
  61.         U[j][k] = alpha[k]*U[j][k + 1] + beta[k]
  62.  
  63.  
  64. print ('матрица приближенного решения :')
  65. for j in range(t_knots):
  66.     for k in range (x_knots):
  67.         print("%.4f" %U[j][k] ,end = ' ')
  68.     print()
  69.  
  70.  
  71. #вычисление погрешности
  72. max = 0
  73. for j in range(t_knots):
  74.     for k in range(x_knots):
  75.         if max < numpy.fabs(U[j][k] - ft(j*t, k*h)):
  76.             max = numpy.fabs(U[j][k] - ft(j*t, k*h))
  77. print()
  78. print("h^2 + t^2:", h**2 + t**2, " максимальная погрешность: ", max)
  79.  
  80. #------------рисование------------
  81. x = 0.5
  82. a = 0
  83. b = 1
  84. #рисование приближенного решения
  85. tlist = mlab.frange(a, b, t)
  86. zlist = [U[t][round(1/h*x)] for t in range (t_knots)]
  87. pylab.plot(tlist, zlist, color = "red",label = 'Приближенное решение')
  88.  
  89. #точное решение
  90. tlist = mlab.frange(a,b,t) #массив значений t
  91. flist = [ft(t,x) for t in tlist]  #х=0.5, t идет от 0 до 1 по 0.1
  92. print('Точное решение для х =', x, 'и для значений t от',a ,'до',b,'с шагом', t , ':')
  93. for i in range(0,t_knots):
  94.     print(i/(t_knots-1) , " : ", "%.4f" % flist[i])
  95. pylab.plot(tlist,flist, label = 'Точное решение')
  96. pylab.legend()
  97. pylab.xlabel('t')
  98. pylab.show()
  99.  
  100. #точное решение 3Д
  101. x = numpy.arange(a, b + h, h)
  102. y = numpy.arange(a, b + t, t)
  103. xgrid, ygrid = numpy.meshgrid(x, y) #двумерная матрица-сетка
  104. zgrid = ft(ygrid, xgrid) #значения в узлах сетки    
  105. fig = pylab.figure()
  106. axes = Axes3D(fig)
  107. axes.plot_surface(xgrid, ygrid, zgrid,  cmap=cm.jet)
  108. pylab.xlabel('x')
  109. pylab.ylabel('t')
  110. pylab.show()
Add Comment
Please, Sign In to add comment