Advertisement
MaPV

3VP_2_Laksa

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