Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # исходная функция
- f = lambda x,y: x * x + 2 * y * y + 2 * x - 4 * y + 1
- # производная по x
- fdx = lambda x,y: 2 * x + 2
- # производная по y
- fdy = lambda x,y: 4 * y - 4
- def calc1(x, y, eps):
- """
- Метод спуска
- :param x: начальное приближение по x
- :param y: начальное приближение по y
- :param eps: точноть
- """
- print("Метод спуска")
- dx, dy = fdx(x, y), fdy(x, y)
- i = 0 # номер итерации
- while max(abs(dx), abs(dy)) >= eps:
- k = ((2 * x + 2) * dx + (4 * y - 4) * dy) / (2 * (dx ** 2 + 2 * dy ** 2))
- x, y = x - k * dx, y - k * dy # новое приблежение
- i += 1
- print('Итерация {:d}, значения x = {:.4f}, y = {:.4f}'.format(i, x, y))
- dx, dy = fdx(x, y), fdy(x, y)
- def calc2(x, y, eps):
- """
- Метод сопряженных градиентов
- :param x: начальное приближение по x
- :param y: начальное приближение по y
- :param eps: точноть
- """
- print("Метод сопряженных градиентов")
- s = [(fdx(x, y), fdy(x, y))]
- i = 0 # номер итерации
- print('Итерация {:d}, значения x = {:.4f}, y = {:.4f}, s = ({:.4f}, {:.4f})'.format(i, x, y, s[-1][0], s[-1][1]))
- while max(map(abs, s[-1])) >= eps:
- dx, dy = s[-1] # dx[k-1]
- k = ((2 * x + 2) * dx + (4 * y - 4) * dy) / (2 * (dx ** 2 + 2 * dy ** 2))
- x, y = x - k * dx, y - k * dy # новое приблежение
- i += 1
- w = (fdx(x, y) ** 2 + fdy(x, y) ** 2) / (dx ** 2 + dy ** 2)
- s.append((-fdx(x, y) + w * dx, -fdy(x, y) + w * dy))
- print('Итерация {:d}, значения x = {:.4f}, y = {:.4f}, w = {:.4f}, s = ({:.4f}, {:.4f})'.format(i, x, y, w,
- s[-1][0],
- s[-1][1]))
- eps = 0.01
- x0, y0 = -0.9, 0.9
- calc1(x0, y0, eps)
- calc2(x0, y0, eps)
Advertisement
Add Comment
Please, Sign In to add comment