Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import matplotlib.pyplot as plt
- def sum_aij(x=[]): # k-степень от 1 до 9 включительно
- sum = [] # считаем коэффициенты матрицы
- for i in range(9):
- sum.append([])
- for j in range(9):
- a = 0
- for k in range(20): # просматриваем все 20 точек
- a += x[k]**(i+j)
- sum[i].append(a)
- return sum
- def sum_b(x=[], y=[]): # считаем свободные члены нашей матрицы
- b = []
- for i in range(9):
- sum = 0
- for k in range(20):
- sum += x[k]**i * y[k]
- b.append(sum)
- return b
- def function(x, a=[]): # апроксимирующий полином
- sum = 0
- for i in range(9):
- sum += a[i]*x**i
- return sum
- lst_x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
- lst_y = [5, 6, 8, 10, 12, 13, 12, 10, 8, 10, 8, 11, 7, 9, 11, 10, 9, 12, 11, 6]
- aij = sum_aij(lst_x)
- b = sum_b(lst_x, lst_y)
- for k in range(9): # приведение к треугольному виду
- for i in range(k+1, 9):
- M = aij[i][k]/aij[k][k]
- for j in range(k, 9):
- aij[i][j] -= M * aij[k][j]
- b[i] -= M * b[k]
- i = 9
- a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- while i >= 0: # считаем ai их 9 штук
- i -= 1
- s = 0
- for j in range(i, 9): # в первой итерации этот цикл не выполняется, потому что мы сразу может найти a9
- s += aij[i][j] * a[j] # далее находим ai через известное предыдущее (a8 находим, зная а9)
- a[i] = (b[i] - s) / aij[i][i]
- for i in range(9): # вывод коэффициентов итогового полинома
- print(a[i])
- x = 1
- lst_x_a = []
- lst_y_a = []
- while x < 20:
- lst_x_a.append(x)
- lst_y_a.append(function(x, a))
- x += 0.5
- lst_x_a.append(20)
- lst_y_a.append(function(20, a))
- plt.plot(lst_x, lst_y, lst_x_a, lst_y_a)
- plt.show()
Add Comment
Please, Sign In to add comment