Advertisement
MaPV

vp_3_zeidel_clear

May 23rd, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. import numpy as np
  2. from numpy import linalg as lg
  3.  
  4.  
  5. #разностная схема для новой i,j точки *Finite difference method*
  6. def FDM(U,UU,i,j,x,y):  
  7.   return ( a*UU[i-1][j]+b*UU[i][j-1]+a*U[i+1][j] + b*U[i][j+1] + h*h*( np.sin(x)*np.sin(y*y)*(0.7+4.4*y*y) - 2.2*np.sin(x)*np.cos(y*y) ) ) / (2*(a+b))
  8.  
  9. def FDM_NN(U,i,j):
  10.   return (-a)*(U[i-1][j]-2*U[i][j]+U[i+1][j])/(h*h)+(-b)*(U[i][j-1]-2*U[i][j]+U[i][j+1])/(h*h)
  11.  
  12. def TOCHNOE(UT,i,j):
  13.   return np.sin(i*h)*np.sin(j*h*j*h)*(0.7+4.4*j*h*j*h) - 2.2*np.sin(i*h)*np.cos(j*h*j*h)
  14.  
  15. #начальные значения
  16. a=0.7
  17. b=1.1
  18. h_knots = 21 #узлы вместе с нулевыми
  19. Delta = 0.00001
  20. h = 1/(h_knots-1) #шаг
  21.  
  22.  
  23. U=[[0]*h_knots for i in range(h_knots)] #матрицы из нулей
  24. UU=[[0]*h_knots for i in range(h_knots)]
  25. UUU=[[0]*h_knots for i in range(h_knots)]
  26. UUUU=[[0]*h_knots for i in range(h_knots)]
  27. UT=[[0]*h_knots for i in range(h_knots)]
  28. #заполняем матрицу единичками внутри нашей области  
  29. for i in range (1,h_knots-1):
  30.     for j in range (1,i):
  31.         U[i][j]=1
  32.        
  33.  
  34. #заполняем границу граничными решениями
  35. for i in range (h_knots):
  36.     U[i][0] = np.sin(i*h) * np.sin(0)
  37.     U[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
  38.     U[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
  39.  
  40.     UU[i][0] = np.sin(i*h) * np.sin(0)
  41.     UU[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
  42.     UU[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
  43.  
  44.  
  45. print ('начальная ненормированная матрица')
  46. for i in range(h_knots):
  47.     for j in range (h_knots):
  48.         print("%.4f" % U[i][j], end=' ')
  49.     print()
  50. for i in range (1,h_knots-1):
  51.   for j in range(1,i):
  52.     UT[i][j]=TOCHNOE(UT,i,j)
  53.  
  54. #основной цикл -----------------------------------------------
  55. n=0
  56. diff = 1
  57.  
  58. while diff >=Delta:
  59.     n+=1 #счетчик прост
  60.     for i in range (1,h_knots-1): #считаем тут B*U^n слой (следующий для B), слой B считается теперь ^n+1 слоем
  61.         for j in range (1,i):
  62.             UU[i][j]=FDM(U,UU,i,j,i*h,j*h)
  63.  
  64.     for i in range (1,h_knots-1): #матрица для условия на выход
  65.         for j in range (1,i):
  66.           UUU[i][j] = FDM_NN(U,i,j)
  67.          
  68.     for i in range(h_knots):
  69.       for j in range(h_knots):
  70.         UUUU[i][j]=UUU[i][j]-UT[i][j]
  71.  
  72.     for i in range (h_knots):
  73.       for j in range (h_knots):
  74.         U[i][j]=UU[i][j]
  75.     diff = lg.norm(UUUU)*h
  76. print('\nзначение невязки на выходе из зоны\n',diff)
  77. #считаем точность
  78. for i in range(h_knots):
  79.   UT[i][0] = np.sin(i*h) * np.sin(0)
  80.   UT[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
  81.   UT[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
  82.  
  83. for i in range (h_knots): #матрица для проверки
  84.         for j in range (h_knots):
  85.           UUU[i][j] = abs((UU[i][j]-UT[i][j]))
  86. diff = lg.norm(UUU)*h
  87.  
  88.  
  89. print (n+1,'cлой матрицы U:','\n----------------')
  90. for i in range(h_knots):
  91.     for j in range (h_knots):
  92.         print("%.4f" %UU[i][j] ,end = '  ')
  93.     print()
  94.  
  95.  
  96. print ('точность',Delta, ';  количество итераций',n, ';  шаг 1 /',h_knots-1, '\n')
  97. print('точность решения по сравнению с аналитическим решением:',diff)
  98. print('на этом шаге достигается нужная нам точность')
  99.  
  100.  
  101.  
  102.  
  103.  
  104. #переписать для условия на l_min
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement