Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.07 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from math import pi
  4. from math import cos, sin, exp
  5. from math import log
  6.  
  7.  
  8. def func(x):
  9.     u = 0.5 -2*pi*x+sin(2*pi*x)
  10.     return u
  11.  
  12.  
  13. def B_k(k):# ДЛЯ ТОЧНОГО РЕШЕНИЯ ИЩУ КОЭФФИЦИЕНТЫ B_k
  14.     A = 4 * sin(pi * k) / (2 * k - 1)
  15.     B = 128 * (cos(pi * k)) / ((pi * pow((1 - 2 * k),2) * (4 * pow(k, 2) - 4 * k - 15)))
  16.  
  17.     return 2 * (A - B)
  18.  
  19.  
  20. def exactsolution(X, t): # НАХОЖДЕНИЕ ТОЧНОГО РЕШЕНИЯ, РЯД ДО 1000, X - начальная сетка, t-время
  21.     u = np.zeros(len(X))
  22.     for j in range(len(u)):
  23.         sum = 0
  24.         for i in range(1, 40):
  25.             sum = sum + B_k(i) * exp(-t * pow(pi * (2 * i - 1) / 2, 2)) * sin(pi * X[j] * (2 * i - 1) / 2)
  26.         u[j] = sum + 0.5
  27.     return u
  28.  
  29.  
  30.  
  31. def exactsolutioncheck(X, t): # НАХОЖДЕНИЕ ТОЧНОГО РЕШЕНИЯ, РЯД ДО 1000, X - начальная сетка, t-время
  32.     sum = 0
  33.     for i in range(1, 40):
  34.         sum = sum + B_k(i) * exp(-t * pow(pi * (2 * i - 1) / 2, 2)) * cos(pi * X * (2 * i - 1) / 2)*(pi*(2*i-1)/2)
  35.         u = sum + 0.5
  36.     return u
  37.  
  38. def progonka(G, x):
  39.     h = 1. / (len(x) - 1) # шаг по сетке
  40.     tau = h/100
  41.     A = (1. / (12. * tau)) - (1. / (2. * h * h))
  42.     B = (5. / (6. * tau)) + (1. / (h * h))
  43.     C = A
  44.     P = np.zeros(len(x)-1)
  45.     Q = np.zeros(len(x)-1)
  46.     u = np.zeros(len(x))
  47.     P[0] = 0.
  48.     Q[0] = 1/2
  49.     for j in range(1, len(x) - 1):
  50.         P[j] = -C / (A * P[j - 1] + B) # пользуюсь учебником Михайлова, с.66
  51.         Q[j] = (G[j] - A * Q[j - 1]) / (A * P[j - 1] + B)
  52.     k = len(x) - 1
  53.     u[k] = (4. * Q[k - 1] - P[k - 2] * Q[k - 1] - Q[k - 2]) / (3. - 4. * P[k - 1] + P[k - 2] * P[k - 1])
  54.     while (k != 0):
  55.         u[k - 1] = P[k - 1] * u[k] + Q[k - 1]
  56.         k = k - 1
  57.     return u
  58.  
  59. def Find_max_and_estab_time(e, t, x):#
  60.     h = 1. / (len(x) - 1)
  61.     tau = h/100
  62.     firstcoeff = (1. / (12. * tau)) + (1. / (2. * h * h))
  63.     secondcoeff = (5. / (6. * tau)) - (1. / (h * h))
  64.     u_prev = np.zeros(len(x))
  65.     G0 = np.zeros(len(x))
  66.     for j in range(len(x)):
  67.         u_prev[j] = func(x[j])
  68.     u_next = u_prev
  69.     L=0
  70.     maX=0.
  71.     if (e==0):
  72.         while t > L*tau:
  73.             L=L+1
  74.             u_prev = u_next
  75.             for j in range(1, len(x) - 1):
  76.                 G0[j] = u_prev[j + 1] * firstcoeff + u_prev[j] * secondcoeff + u_prev[j - 1] * firstcoeff
  77.             u_next = progonka(G0, x)
  78.             u_exact = exactsolution(x,L*tau)
  79.             if max(np.abs(u_next - u_exact))>maX:
  80.                 maX = max(np.abs(u_next- u_exact))
  81.         return maX
  82.     if (e==1):
  83.         for j in range(1, len(x) - 1):
  84.             G0[j] = u_prev[j + 1] * firstcoeff + u_prev[j] * secondcoeff + u_prev[j - 1] * firstcoeff
  85.         u_next = progonka(G0, x)
  86.         while max(np.abs(u_next - u_prev)) > epsilon:
  87.             L = L + 1
  88.             u_prev = u_next
  89.             for j in range(1, len(x) - 1):
  90.                 G0[j] = u_prev[j + 1] * firstcoeff + u_prev[j] * secondcoeff + u_prev[j - 1] * firstcoeff
  91.             u_next = progonka(G0, x)
  92.         return (L*tau)
  93.  
  94.  
  95. def Graphics(t, x):# попробую вернуть максимум
  96.     #вывод значения на k-м слое для tau = h*h/4
  97.     h = 1. / (len(x) - 1.)
  98.     tau=h/100
  99.     firstcoeff = (1. / (12. * tau)) + (1. / (2. * h * h))
  100.     secondcoeff = (5. / (6. * tau)) - (1. / (h * h)) # коэффициенты перед u[j-1],u[j],u[j+1] для нижнего слоя
  101.     u_prev = np.zeros(len(x))
  102.     for j in range(len(x)):
  103.         u_prev[j] = 0.5 - 2. * pi * x[j] + sin(2. * pi * x[j])
  104.     u_next=u_prev
  105.     G0 = np.zeros(len(x))
  106.     L=0
  107.     while ((t/tau)-L) >0 :# получаю значения на нужном слое
  108.         #print(t/tau)
  109.         u_prev = u_next
  110.         for j in range(1, len(x) - 1):
  111.             G0[j] = u_prev[j + 1] * firstcoeff + u_prev[j] * secondcoeff + u_prev[j - 1] * firstcoeff
  112.         u_next = progonka(G0, x)
  113.         L=L+1
  114.     return u_next
  115.  
  116. A = np.zeros
  117. epsilon = 0.0000001
  118. x10 = np.linspace(0., 1., 11)
  119. x20 = np.linspace(0., 1., 21)
  120. x15 = np.linspace(0.,1.,16)
  121. x30 = np.linspace(0.,1.,31)
  122. x25 = np.linspace(0., 1., 26)
  123. x40 = np.linspace(0.,1.,41)
  124. x80 = np.linspace(0.,1.,81)
  125. e_t2 =Find_max_and_estab_time(1, 10, x10)
  126. e_t3 = Find_max_and_estab_time(1, 10, x15)
  127. e_t4 = Find_max_and_estab_time(1, 10, x20)
  128. e_t5 = Find_max_and_estab_time(1, 10, x30)
  129. e_t6 = Find_max_and_estab_time(1, 10, x40)
  130. e_t7 = Find_max_and_estab_time(1, 10, x80)
  131. #print(e_t2, "Время установления для 10 узлов")
  132. #print(e_t3, "Время установления для 15 узлов")
  133. #print(e_t4, "Время установления для 20 узлов")
  134. #print(e_t5, "Время установления для 30 узлов")
  135. #print(e_t6, "Время установления для 40 узлов")
  136. #print(e_t7, "Время установления для 80 узлов")
  137. n10=Find_max_and_estab_time(0, e_t2, x10)
  138. n15=Find_max_and_estab_time(0, e_t3, x15)
  139. n20=Find_max_and_estab_time(0, e_t4, x20)
  140. n30=Find_max_and_estab_time(0, e_t5, x30)
  141. n40=Find_max_and_estab_time(0, e_t6, x40)
  142. n80 = Find_max_and_estab_time(0, e_t7, x80)
  143. print(log(n10/n20,2.),"Порядок сходимости при N=10")
  144. print(log(n15/n30,2),"Порядок сходимости при N=15")
  145. print(log(n20/n40,2.),"Порядок сходимости при N=20")
  146. print(log(n40/n80,2),"Порядок сходимости при N=40\n")
  147. print(n10,"Погрешность на сетке из 10 узлов")
  148. print(n15,"Погрешность на сетке из 15 узлов")
  149. print(n20,"Погрешность на сетке из 20 узлов")
  150. print(n30,"Погрешность на сетке из 30 узлов")
  151. print(n40,"Погрешность на сетке из 40 узлов")
  152. plt.ioff()
  153. fig, (ax1, ax2,ax3) = plt.subplots(nrows=1, ncols=3, figsize=(19,5))
  154. t1=0
  155. t2=1
  156. t3=2
  157. ax1.set_title("t=0")
  158. ax2.set_title("t=1")
  159. ax3.set_title("t=2")
  160. ax1.plot(x80,exactsolution(x80,t1))
  161. ax1.plot(x10, Graphics(t1,x10))
  162. ax1.plot(x15, Graphics(t1,x15))
  163. ax1.plot(x20, Graphics(t1,x20))
  164. ax1.plot(x30, Graphics(t1,x30))
  165. ax1.plot(x40, Graphics(t1,x40))
  166. ax1.plot(x80, Graphics(t1,x80))
  167. ax2.plot(x80,exactsolution(x80,t2))
  168. ax2.plot(x10, Graphics(t2,x10))
  169. ax2.plot(x15, Graphics(t2,x15))
  170. ax2.plot(x20, Graphics(t2,x20))
  171. ax2.plot(x30, Graphics(t2,x30))
  172. ax2.plot(x40, Graphics(t2,x40))
  173. ax2.plot(x80, Graphics(t2,x80))
  174. ax3.plot(x80,exactsolution(x80,t3))
  175. ax3.plot(x10, Graphics(t3,x10))
  176. ax3.plot(x15, Graphics(t3,x15))
  177. ax3.plot(x20, Graphics(t3,x20))
  178. ax3.plot(x30, Graphics(t3,x30))
  179. ax3.plot(x40, Graphics(t3,x40))
  180. ax3.plot(x80, Graphics(t3,x80))
  181. ax1.grid()
  182. ax2.grid()
  183. ax3.grid()
  184. lgnd = ax1.legend(['Точное решение','N=10','N=15','N=20','N=30','N=40','N=80'],)
  185. lgnd = ax2.legend(['Точное решение','N=10','N=15','N=20','N=30','N=40','N=80'],)
  186. lgnd = ax2.legend(['Точное решение','N=10','N=15','N=20','N=30','N=40','N=80'],)
  187.  
  188. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement