Реализация метода внутренних штрафных функций

207 просмотра
0
0 Комментариев

Проблема в том, что на каждой итерации должна в качестве следующей точки браться точка, полученная на предыдущей итерации оптимизации методом Ньютона. А у меня получается точка x0 не меняется. Теорию брал отсюда dit.isuct.ru/IVT/sitanov/Literatura/M171/Pages/Glava3_2.htm

import math  # подключение математической библиотеки
 
 
def f(z1, z2, r):
    return z1 ** 2 + 4 * z2 ** 2 - 8 * z1 - 8 * z2 - r * (1 / (z1 - 2) + 1 / (z1 + 2)+(1 / z2) + 1 / (z2 - 3))
def dx1(z1, z2, r):
    return 2 * z1 - 8 + r * (1 / (z1 - 2) ** 2 + 1 / (z1 + 2) ** 2)
def dx2(z1, z2, r):
    return 8 * z2 - 8 + r * (1 / z2 ** 2 - 1 / (z2 - 3) ** 2)
def dx1dx1(z1, z2, r):
    return 2 - 2 * r * (1 / (z1 - 2) ** 3 + 1 / (z1 + 2) **3)
def dx1dx2(z2, r):
    return 0
def dx2dx2(z1, z2, r):
    return 8 - 2 * r * (1 / z2 ** 3 + 1 / (z2 - 3) ** 3)
def norm(z1, z2):
    return math.sqrt(z1 ** 2 + z2 ** 2)
Eps = float(input("Введите требуемую точность:"))
def Newton(x1, x2, r):
    i = 0
    n = 1
    grad=[1, 1]
    d2f = [1, 1, 1, 1]
    x = [1, 1]
    while n > Eps:
        grad[0] = dx1(x[0],x[1], r)
        grad[1] = dx2(x[0], x[1], r)
        d2f[0] = dx1dx1(x[0], x[1], r)
        d2f[1] = 0
        d2f[2] = 0
        d2f[3] = dx2dx2(x[0], x[1], r)
        n = norm(grad[0], grad[1])
        det = d2f[0] * d2f[3] - d2f[1] * d2f[2]
        x[0] = x[0] - d2f[3] * grad[0] / det + d2f[2] * grad[1] / det
        x[1] = x[1] + d2f[1] * grad[0] / det - d2f[0] * grad[1] / det
        x1 = x[0]
        x2 = x[1]
        i += 1
 
    return f(x1, x2, r), x1, x2
 
eps = float(input("Введите погрешность для метода штрафов:"))
k = 0
r = 1
c = 2
x0 = [0, 2] #начальная точка
 
while r > eps:
    n = Newton(x0[0], x0[1], r)
    r = r / c
    x00 = x0[0]
    x01 = x0[1]
    k += 1
print(n)


Добавить комментарий

0 Answers

Python Опубликовано 16.12.2018
Напишите свой ответ на данный вопрос.
Scroll Up