Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class FunctionResult:
- def __init__(self, y, x):
- self.x = x
- self.y = y
- class QuadroInterpolation:
- def __init__(self, func, x_1, delta, eps, eps_1):
- self.func = func
- self.x_1 = x_1
- self.delta = delta
- self.eps = eps
- self.eps_1 = eps_1
- def compute(self):
- self.x_2 = self.x_1 + self.delta
- self.left_border = FunctionResult(self.func(self.x_1), self.x_1)
- self.right_border = FunctionResult(self.func(self.x_2), self.x_2)
- self.x_3 = self.x_1 + 2 * self.delta if self.right_border.y < self.left_border.y else self.x_1 - self.delta
- self.center = FunctionResult(self.func(self.x_3), self.x_3)
- self.compute_2()
- def compute_2(self):
- temp = sorted((self.left_border, self.right_border, self.center), key=lambda v: v.y)[0]
- F_MIN = getattr(temp, 'y')
- x_min = temp.x
- x_hat = self.interpolation_polynomial()
- if x_hat:
- print(abs((F_MIN - self.func(x_hat)) / self.func(x_hat)) < self.eps and abs(
- (x_min - x_hat) / x_hat) < self.eps_1)
- if abs((F_MIN - self.func(x_hat)) / self.func(x_hat)) < self.eps and abs(
- (x_min - x_hat) / x_hat) < self.eps_1:
- self.res = x_hat
- return
- else:
- if self.x_1 <= x_hat <= self.x_3:
- self.x_1, self.x_2, self.x_3 = sorted([self.x_1, self.x_2, self.x_3, x_hat, x_min])[:3]
- self.left_border = FunctionResult(self.func(self.x_1), self.x_1)
- self.right_border = FunctionResult(self.func(self.x_2), self.x_2)
- self.center = FunctionResult(self.func(self.x_3), self.x_3)
- self.compute_2()
- else:
- self.x_1 = x_hat
- self.compute()
- else:
- return {
- }
- def square_diff(self, x, y):
- return x ** 2 - y ** 2
- def interpolation_polynomial(self):
- try:
- return 0.5 * (
- (
- self.square_diff(self.x_2, self.x_3)
- * self.left_border.y + self.square_diff(self.x_3, self.x_1)
- * self.right_border.y + self.square_diff(self.x_1, self.x_2)
- * self.center.y
- )
- /
- (
- (self.x_2 - self.x_3) * self.left_border.y
- + (self.x_3 - self.x_1) * self.right_border.y
- + (self.x_1 - self.x_2) * self.center.y
- )
- )
- except ZeroDivisionError:
- return 0
- def func(x):
- 2 * x ** 2 + 16 / x
- a = QuadroInterpolation(func, 1, 1, 0.003, 0.03)
- a.compute()
- print(a.res)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement