Advertisement
Guest User

Untitled

a guest
Feb 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.11 KB | None | 0 0
  1. import numpy as np #библиотека для матриц, векторов и т.д.
  2. import random as rand #ну, бля, догадался, думаю
  3.  
  4. max = 10 #максимальные и минимальные значения для рандома
  5. min = -10
  6. d = 1. #число d позволяет управлять кол-вом точек в исходных значениях (на вычисления не влияет)
  7. N = 5 #кол-во элементов в массиве
  8.  
  9. #рандомим основные векторы
  10. a = np.random.randint(min, max, N-1)/d
  11. b = np.random.randint(min, max, N)/d
  12. c = np.random.randint(min, max, N-1)/d
  13.  
  14. #рандомим N-1-ый и N-ый столбец, но учитываем общие точки с векторами диагоналей
  15. p = np.random.randint(min, max, N)/d
  16. p[N-1] = a[N-2]
  17. p[N-2] = b[N-2]
  18. p[N-3] = c[N-3]
  19. q = np.random.randint(min, max, N)/d
  20. q[N-1] = b[N-1]
  21. q[N-2] = c[N-2]
  22. x1 = np.ones(N) #массив из единиц размера N (будет являться решением нашей системы)
  23.  
  24. def Gen (N, mat, x): #имея на руках матрицу СЛАУ и вектор-решение (x - который будем потом искать) генерируем правый вектор столбец
  25.     f = np.zeros(N)
  26.     for i in range(N):
  27.         sum = 0
  28.         for j in range(N):
  29.             sum = sum + mat[i, j]*x[j]
  30.         f[i] = sum
  31.     return f
  32. def PrinAll (a, b, c, p, q, f): #информация о том, что у тебя сейчас есть - нахуй не надо по сути
  33.     print("Векторы диагонали:")
  34.     print(a)
  35.     print(b)
  36.     print(c)
  37.     print("Правый вектор-столбец: ", f)
  38.     print("Обидная строка и столюец: ")
  39.     print(p)
  40.     print(q)
  41.     print()
  42.     pass
  43. def Mat (N, a, b, c, p, q): #генерация двумерного массива из всех этих векторов
  44.     A = np.zeros((N, N))
  45.     A[0, 0] = b[0]
  46.     A[0, 1] = c[0]
  47.     A[0, N-1] = q[0]
  48.     A[0, N-2] = p[0]
  49.     for i in range(1, N):
  50.             A[i, i-1] = a[i-1]
  51.             A[i, i] = b[i]
  52.             if i<N-1:  A[i, i+1] = c[i]
  53.             A[i, N-1] = q[i]
  54.             A[i, N-2] = p[i]
  55.     return A
  56. f = Gen (N, Mat(N, a, b, c, p, q), x1)
  57.  
  58. def Step1 (N, a, b, c, p, q, f): #ПЕРВЫЙ ШАГ
  59.     for i in range(N-2):
  60.         R = 1/b[i]
  61.         b[i] = 1
  62.         c[i] = c[i]*R
  63.         if i == N-3: p[N-3] = c[N-3]
  64.         else: p[i] = p[i]*R
  65.         q[i] = q[i]*R
  66.         f[i] = f[i]*R
  67.         R = a[i]
  68.         a[i] = 0
  69.         b[i+1] = b[i+1] - R*c[i]
  70.         if i==N-3:
  71.             p[N-2] = b[N-2]
  72.         else:
  73.             p[i+1] = p[i+1] - R*p[i]
  74.             if i==N-4: c[N-3] = p[N-3]
  75.         q[i+1] = q[i+1] - R*q[i]
  76.         if i==N-3: c[N-2] = q[N-2]
  77.         f[i+1] = f[i+1] - R*f[i]
  78.     pass
  79. def Step2 (N, a, b, c, p, q, f): #ВТОРОЙ ШАГ
  80.     R = 1/b[N-1]
  81.     b[N-1] = 1
  82.     q[N-1] = b[N-1]
  83.     a[N-2] = a[N-2]*R
  84.     p[N-1] = a[N-2]
  85.     f[N-1] = f[N-1]*R
  86.     R = c[N-2]
  87.     c[N-2] = 0
  88.     q[N-2] = c[N-2]
  89.     b[N-2] = b[N-2] - R*a[N-2]
  90.     p[N-2] = b[N-2]
  91.     f[N-2] = f[N-2] - R*f[N-1]
  92.     pass
  93. def Step3 (N, a, b, c, p, q, f): #ТРЕТИЙ ШАГ
  94.     f[N-2] = f[N-2]/b[N-2]
  95.     b[N-2] = 1
  96.     p[N-2] = b[N-2]
  97.     f[N-1] = f[N-1] - f[N-2]*p[N-1]
  98.     p[N-1] = 0
  99.     a[N-2] = 0
  100.     for i in range(N-3, -1, -1):
  101.             f[i] = f[i] - f[N-2]*p[i]
  102.             p[i] = 0
  103.             if i==N-3: c[N-3] = p[N-3]
  104.             f[i] = f[i] - f[N-1]*q[i]
  105.             q[i] = 0
  106.     pass
  107. def Step4 (N, a, c, f): #ХУЙ
  108.     x = np.zeros(N)
  109.     for i in range(N-1, N-4, -1):
  110.         x[i] = f[i]
  111.     for i in range(N-4, -1, -1):
  112.         x[i] = f[i]-c[i]*x[i+1]
  113.     return x
  114.  
  115. def solution(N, a, b, c, p, q, f): #Основная функция
  116.     Step1 (N, a, b, c, p, q, f)
  117.     Step2 (N, a, b, c, p, q, f)
  118.     Step3 (N, a, b, c, p, q, f)
  119.     return Step4 (N, a, c, f)
  120.  
  121. def ErrorsCal(n, mea, tr): #вычисляет n-мерный массив из относительных погрешностей
  122.     er = np.zeros(n)
  123.     for i in range(n):
  124.         absolute = mea[i]-tr[i]
  125.         er[i] = absolute/mea[i]
  126.     return er
  127.  
  128. def Average(n, a): #вычисляет среднее арифметическое (в сочетании с предыдущей функцией найдет среднюю относительную погрешность)
  129.     sum = 0
  130.     for i in a:
  131.         sum = sum + i
  132.     return sum/n
  133. print()
  134. PrinAll (a, b, c, p, q, f)
  135.  
  136. A = Mat (N, a, b, c, p, q)
  137. print(A) #пялимся на случайную матрицу
  138. y = solution(N, a, b, c, p, q, f) #решаем
  139. print()
  140. print("Правильный ответ: ", x1) #сравниваем результат визуально (питон округляет очень маленькие погрешности при выводе)
  141. print("Результат: ", y)
  142. print()
  143. print(Average(N, ErrorsCal(N, y, x1))) #получаем точную среднюю относительную погрешность
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement