Last active
June 30, 2022 11:43
-
-
Save Gladozzz/0facb0bc495bf42dfafe84c47b344025 to your computer and use it in GitHub Desktop.
траектория
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Задача #1 | |
# Есть кусочно заданная линейная функция. Функция задаётся точками (x,y), которые соединяются прямыми. | |
# Необходимо получать значение этой функции при определённом значении x. | |
# Так же оценить сложность алгоритма вычисления значения функции в нотации О-большое. | |
# Реализация на любом удобном языке, без использования библиотек. | |
# | |
# Эта кусочно линейная функция заданная двумя точками | |
# Точки с одинаковым х переписывают друг друга | |
# Входящие точки: x=0,y=100 и x=10,y=122 | |
# | |
# F = piecewise_func(0,100)(10,122) #.. и т.д | |
# | |
# Добавим еще одну точку, к примеру, x=30, y=0 | |
# | |
# F = F(30, 0) | |
# | |
# Вычислим значение от x = 5 | |
# F.y(5) | |
# Результат: y = 111 | |
# | |
# | |
# Дополнительная задача. Реализовать функцию получения таблицы.Необходимо получить таблицу вида: | |
# --------------------------- | |
# | x1 | x2 | a | b | | |
# --------------------------- | |
# | | | | | | |
# --------------------------- | |
# | | | | | | |
# | |
# Где x1, x2 - это границы интервала, a и b - коэффициенты линейной функции. | |
class Piecewise_func: | |
'''кусочно заданная линейная функция''' | |
dots = [] | |
def __init__(self,x,y): | |
self.dots = [[x,y]] | |
def y(self,x): | |
'''O(n) — линейная сложность''' | |
if len(self.dots) < 2: | |
return None # недостаточно точек для кусочно-линейной функции | |
def calc(i1,i2): | |
'''i1 - индекс первой точки | |
i2 - индекс второй точки | |
A x + B y + C = 0''' | |
A = self.dots[i2][1] - self.dots[i1][1] # y2 - y1 | |
B = self.dots[i1][0] - self.dots[i2][0] # x1 - x2 | |
C = self.dots[i2][0]*self.dots[i1][1] - self.dots[i1][0]*self.dots[i2][1] # x2*y1 - x1*y2 | |
return (-A*x - C) / B | |
for i, v in enumerate(self.dots): | |
if v[0] > x: | |
if i == 0: | |
return calc(0,1) | |
else: | |
return calc(i-1,i) | |
if v[0] == x: | |
return v[1] | |
last_i = len(self.dots)-1 | |
return calc(last_i-1,last_i) | |
def table(self): | |
print('-----------------------------') | |
print('| x1 | x2 | a | b |') | |
print('-----------------------------') | |
for i in range(1,len(self.dots)): | |
A = self.dots[i][1] - self.dots[i-1][1] # y2 - y1 | |
B = self.dots[i-1][0] - self.dots[i][0] # x1 - x2 | |
print('| {} | {} | {} | {} |'.format(self.dots[i-1][0],self.dots[i][0],A,B)) | |
print('-----------------------------') | |
def __call__(self, x, y): | |
for i, v in enumerate(self.dots): | |
if v[0] > x: | |
self.dots.insert(i,[x,y]) | |
return self | |
elif v[0] == x: | |
self.dots = self.dots[i] | |
self.dots.append([x,y]) | |
return self | |
F = Piecewise_func(0,100)(10,122) | |
F = F(30,0) | |
print(F.dots) | |
print(F.y(5)) | |
F.table() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment