Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- from numpy import linalg as lg
- #разностная схема для новой i,j точки *Finite difference method*
- def FDM(U,UU,i,j,x,y):
- 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))
- def FDM_NN(U,i,j):
- 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)
- def TOCHNOE(UT,i,j):
- 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)
- #начальные значения
- a=0.7
- b=1.1
- h_knots = 21 #узлы вместе с нулевыми
- Delta = 0.00001
- h = 1/(h_knots-1) #шаг
- U=[[0]*h_knots for i in range(h_knots)] #матрицы из нулей
- UU=[[0]*h_knots for i in range(h_knots)]
- UUU=[[0]*h_knots for i in range(h_knots)]
- UUUU=[[0]*h_knots for i in range(h_knots)]
- UT=[[0]*h_knots for i in range(h_knots)]
- #заполняем матрицу единичками внутри нашей области
- for i in range (1,h_knots-1):
- for j in range (1,i):
- U[i][j]=1
- #заполняем границу граничными решениями
- for i in range (h_knots):
- U[i][0] = np.sin(i*h) * np.sin(0)
- U[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
- U[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
- UU[i][0] = np.sin(i*h) * np.sin(0)
- UU[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
- UU[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
- print ('начальная ненормированная матрица')
- for i in range(h_knots):
- for j in range (h_knots):
- print("%.4f" % U[i][j], end=' ')
- print()
- for i in range (1,h_knots-1):
- for j in range(1,i):
- UT[i][j]=TOCHNOE(UT,i,j)
- #основной цикл -----------------------------------------------
- n=0
- diff = 1
- while diff >=Delta:
- n+=1 #счетчик прост
- for i in range (1,h_knots-1): #считаем тут B*U^n слой (следующий для B), слой B считается теперь ^n+1 слоем
- for j in range (1,i):
- UU[i][j]=FDM(U,UU,i,j,i*h,j*h)
- for i in range (1,h_knots-1): #матрица для условия на выход
- for j in range (1,i):
- UUU[i][j] = FDM_NN(U,i,j)
- for i in range(h_knots):
- for j in range(h_knots):
- UUUU[i][j]=UUU[i][j]-UT[i][j]
- for i in range (h_knots):
- for j in range (h_knots):
- U[i][j]=UU[i][j]
- diff = lg.norm(UUUU)*h
- print('\nзначение невязки на выходе из зоны\n',diff)
- #считаем точность
- for i in range(h_knots):
- UT[i][0] = np.sin(i*h) * np.sin(0)
- UT[h_knots-1][i] = np.sin((h_knots-1)*h) * np.sin(i*i*h*h)
- UT[i][i] = np.sin(i*h) * np.sin(i*h*i*h)
- for i in range (h_knots): #матрица для проверки
- for j in range (h_knots):
- UUU[i][j] = abs((UU[i][j]-UT[i][j]))
- diff = lg.norm(UUU)*h
- print (n+1,'cлой матрицы U:','\n----------------')
- for i in range(h_knots):
- for j in range (h_knots):
- print("%.4f" %UU[i][j] ,end = ' ')
- print()
- print ('точность',Delta, '; количество итераций',n, '; шаг 1 /',h_knots-1, '\n')
- print('точность решения по сравнению с аналитическим решением:',diff)
- print('на этом шаге достигается нужная нам точность')
- #переписать для условия на l_min
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement