Advertisement
Guest User

Untitled

a guest
May 20th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.26 KB | None | 0 0
  1. # coding=utf-8
  2. import math
  3. from mpl_toolkits.mplot3d import Axes3D
  4. import pylab
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7.  
  8. def realFunc(x,t):
  9.     return 2*math.cos(1-x-t)-x**2
  10.  
  11. def progonka(m, d):
  12.     n = len(d)
  13.     if m[0][0] == 0:
  14.         raise ("b must be non-zero")
  15.     alf = float(-m[0][1]) / m[0][0]
  16.     bet = float(d[0]) / m[0][0]
  17.     alfs, bets = [], []
  18.     alfs.append(alf)
  19.     bets.append(bet)
  20.     xs = []
  21.     for i in range(0, n):
  22.         xs.append(0.0)
  23.     for i in range(1, n):
  24.         alfs.append(float(-m[i - 1][i]) / (alfs[i - 1] * m[i][i - 1] + m[i][i]))
  25.         bets.append(float(d[i] - m[i][i - 1] * bets[i - 1]) / (m[i][i - 1] * alfs[i - 1] + m[i][i]))
  26.     xs[len(xs) - 1] = bets[len(bets) - 1]
  27.     for i in range(len(xs) - 2, -1, -1):
  28.         xs[i] = alfs[i] * xs[i + 1] + bets[i]
  29.     return xs
  30.  
  31.  
  32. # u(x,0)=2cos(1-x)-x^2
  33. def u_x_0(x):
  34.     return 2 * math.cos(1 - x) - x ** 2
  35.  
  36.  
  37. # u(0,t) = 2cos(1-t)
  38. def u_0_t(t):
  39.     return 2 * math.cos(1 - t)
  40.  
  41.  
  42. # 2u(1,t)+u_x(1,t)=(4cost-2sint-4)
  43. def xuiznaetkaknazvat(t, u_n_minus_1):
  44.     return (4*math.cos(t) - 2*math.sin(t) - 4.0 + u_n_minus_1/h)/(2.0+1.0/h)
  45.  
  46. T = 1
  47. l = 1
  48. h = 0.05
  49. t = 0.05
  50. # Количество элементов в массиве(верхний)
  51. n = int(l / h)
  52. # Количество массивов (нижний индекс)
  53. m = int(T / t)
  54. u = [
  55.     [u_x_0(i * h) for i in range(0, n)],
  56. ]
  57.  
  58. def A_i():
  59.     return t / (2 * (h ** 2))
  60.  
  61.  
  62. def B_i():
  63.     return t / (2 * (h ** 2))
  64.  
  65.  
  66. def C_i():
  67.     return -1 - 2 * A_i()
  68.  
  69.  
  70. def F_i(y_i, y_iminus1, y_iplus1, x_i):
  71.     return y_i + t * x_i + (t / (2 * h ** 2)) * (y_iminus1 - 2 * y_i + y_iplus1)
  72.  
  73. for j in range(1, m):
  74.     u.append([])
  75.     u[j].append(u_0_t(j))
  76.     M, d = [], []
  77.     M.append([C_i(), B_i()])
  78.     d.append(-F_i(u[j - 1][1], u[j - 1][0], u[j - 1][2], h))
  79.     for i in range(0, n - 4):
  80.         M[0].append(0.0)
  81.     for i in range(2, n - 2):
  82.         M.append([])
  83.         for l in range(i - 2):
  84.             M[i-1].append(0.0)
  85.         M[i-1].append(A_i())
  86.         M[i-1].append(C_i())
  87.         M[i-1].append(B_i())
  88.         for l in range(0, n - 3 - i):
  89.             M[i-1].append(0.0)
  90.         d.append(-F_i(u[j - 1][i], u[j - 1][i-1], u[j - 1][i + 1], i*h))
  91.     d.append(-F_i(u[j - 1][n-3], u[j - 1][n-4], u[j - 1][n-2], 1.0))
  92.     M.append([])
  93.     for i in range(n - 4):
  94.         M[n-3].append(0.0)
  95.     M[n-3].extend([A_i(), C_i()])
  96.     for ll in range(len(M)):
  97.         print len(M[ll])
  98.     print np.matrix(M)
  99.     u[j].extend(np.linalg.solve(np.array(M), np.array(d)))
  100.     u[j].append(xuiznaetkaknazvat(j*t,u[j][len(u[j]) - 1]))
  101.  
  102. def makeData():
  103.     x = np.arange(0,1,0.05)
  104.     y = np.arange(0,1,0.05)
  105.     xgrid, ygrid = np.meshgrid(x, y)
  106.     zgrid = np.array(u)
  107.     return xgrid, ygrid, zgrid
  108.  
  109. def makeRealData():
  110.     xs = np.arange(0,1,0.05)
  111.     ys = np.arange(0,1,0.05)
  112.     xgrid, ygrid = np.meshgrid(xs, ys)
  113.     zgrid = []
  114.     for x in xs:
  115.         zgrid.append([])
  116.         for t in ys:
  117.             zgrid[len(zgrid)-1].append(realFunc(x,t))
  118.     return xgrid, ygrid, zgrid
  119.  
  120. fig = pylab.figure()
  121. axes  = Axes3D(fig)
  122. x, y, z = makeData()
  123. print (np.matrix(z))
  124. axes.plot_surface(x,y,z)
  125.  
  126. x,y,z = makeRealData()
  127. print (np.matrix(z))
  128. axes.plot_surface(x,y,np.array(z))
  129. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement