Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- def get_num(min_val, max_val):
- while True:
- try:
- num = float(input().strip())
- if num <= min_val:
- print("Введенное число должно быть больше " + str(min_val))
- elif num >= max_val:
- print("Введенное число должно быть меньше " + str(max_val))
- else:
- return num
- except ValueError:
- print("Неверные входные данные! Повторите ввод")
- def func(x):
- return x * x * x - 3 * x - 3
- def find_point(a, b):
- a1 = a
- b1 = b
- eps = 0.0000000001
- while b1 - a1 >= eps:
- delta = (b1 - a1) / 4
- u1 = (a1 + b1 - delta) / 2
- u2 = (a1 + b1 + delta) / 2
- i1 = func(u1)
- i2 = func(u2)
- if i1 <= i2:
- b1 = u2
- if i1 >= i2:
- a1 = u1
- return (b1 + a1) / 2
- def find_golden_point(a, b):
- eps = 0.0000000001
- phi = (5 ** 0.5 - 1) / 2
- u1 = (b - a) * phi ** 2 + a
- u2 = (b - a) * phi + a
- i1 = func(u1)
- i2 = func(u2)
- while b - a > eps:
- if i1 > i2:
- a = u1
- u1 = u2
- i1 = i2
- u2 = phi * (b - a) + a
- i2 = func(u2)
- else:
- b = u2
- u2 = u1
- u1 = a + (b - a) * phi ** 2
- i2 = i1
- i1 = func(u1)
- u = (a + b) / 2
- return u
- # ПАРАБОЛ
- def find_point_parabola(a, b):
- u_0 = (b - a) / 2
- n = 1000
- h = (b - a) / n
- eps = 0.00000001
- w = eps * 100
- w_pred = 0
- while abs(w - w_pred) > eps:
- f0 = func(u_0)
- u_1 = u_0 + h
- f1 = func(u_1)
- if f1 < f0:
- u_2 = u_1 + h
- else:
- u_1 = u_0 - h
- f1 = func(u_1)
- u_2 = u_1 - h
- f2 = func(u_2)
- w_pred = w
- w = -0.5 * ((f1 - f0) * (u_2 ** 2) + (f0 - f2) * (u_1 ** 2) + (f2 - f1) * (u_0 ** 2)) / \
- ((f0 - f1) * u_2 + (f2 - f0) * u_1 + (f1 - f2) * u_0)
- u_0 = w
- return w
- # ГРАДИЕНТНЫЙ
- def func2(x, y):
- # return 3 * x * x + 4 * y * y + 1
- return (8 * x * x + 5 * y * y + 10) ** 0.5
- def func2_deriv_x(x, y):
- return 16 * x
- # return (func2(x + 0.0000001, y) - func2(x - 0.0000001, y)) / (2 * 0.0000001)
- def func2_deriv_y(x, y):
- return 10 * y
- # return (func2(x, y + 0.0000001) - func2(x, y - 0.0000001)) / (2 * 0.0000001)
- def norma(x, y):
- # return (x * x + y * y) ** 0.5
- return (func2_deriv_x(x, y) ** 2 + func2_deriv_y(x, y) ** 2) ** 0.5
- def find_gradient():
- x0 = 10
- y0 = 20
- h = 0.00001
- f0 = func2(x0, y0)
- eps = 0.0000000001
- while True:
- grad_x_prev = func2_deriv_x(x0, y0)
- grad_y_prev = func2_deriv_y(x0, y0)
- x1 = x0 - h * grad_x_prev
- y1 = y0 - h * grad_y_prev
- grad_x = func2_deriv_x(x1, y1)
- grad_y = func2_deriv_y(x1, y1)
- if norma((grad_x - grad_x_prev), (grad_y - grad_y_prev)) < eps:
- break
- f1 = func2(x1, y1)
- if f1 > f0:
- h = h / 10
- else:
- x0 = x1
- y0 = y1
- f0 = f1
- print("Точка: (" + str(format(x0, ".7f")) + ", " + str(format(y0, ".7f")) + ")")
- print("Значение функции: " + str(func2(x0, y0)))
- return x0, y0
- # print("Функция: x^3 - 3x + 1")
- find_gradient()
- print("Введите левую границу")
- a = get_num(sys.float_info.max * (-1), sys.float_info.max)
- print("Введите правую границу")
- b = get_num(a, sys.float_info.max)
- print("Точка минимума: " + str(find_point_parabola(a, b)))
- print("Значение функции: " + str(func(find_point_parabola(a, b))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement