Применение метода Лагранжа

Задача:

Допустим, вы хотите произвести некоторое количество товара, которое зависит от часов работы двух ключевых сотрудников следующим образом:

• Целевая функция: f(x, y) = x^2 + 2y^2 где X — время работы 1-ого сотрудника, Y — время работы 2-ого сотрудника.

Однако вы должны оплатить этим сотрудникам ровно 20 часов работы в сумме, то есть:

• Ограничение: g(x, y) = x + y - 20 = 0

Какое наибольшее количество товаров вы сможете произвести в таком случае?

Вопрос : Я пытаюсь решать это по методу Лагранжа составил ситстему уравнений из произвлодных

from sympy import symbols,Eq,solveset,solve
x,y,w=symbols("x y w")

f_x_y= (x**2 + 2*y**2)
q=x+y-20

f_itog= f_x_y-w*q
f_diff_x=Eq(f_itog.diff(x),0)
f_diff_y=Eq(f_itog.diff(y),0)
f_diff_w=Eq(f_itog.diff(w),0)

sols=solve([f_diff_x,f_diff_y,f_diff_w],x,y,w)

Но ответ получается не правильный {λ: 80/3, x: 40/3, y: 20/3}. Должно быть x= 0 и y= 20 Только в этом случае f(x, y) будет максимальна . Подскажите в чём ошибка ?(Возможно это по методу Лагранжа это и не решается )


Ответы (1 шт):

Автор решения: Pak Uula

Вы всё правильно решили. При помощи метода Лагранжа вы нашли условный экстремум функции f(x, y) = x^2 + 2y^2 при ограничениях x + y - 20 = 0.

экстремум функции

Однако вы нашли не максимум, а минимум функции производительности. Это тоже экстремум, верно?

Строго говоря, в вашей задаче неверно сформулированы ограничения. Вы должны искать экстремум не только на прямой y = 20-x, но ещё и в первом квадранте x >= 0, y >= 0.

При поиске условного экстремума в ограниченной области недостаточно найти точку методом Лагранжа, нужно ещё вычислять значения в точках пересечения границы с функцией ограничений. В вашем случае это точки x=0, y=20 и x=20, y=0. Так как у вас внутри области минимум, то максимум достигается на границе.

PS. Если вам интересно, то вот скрипт для рисования линий уровня

import numpy as np
import matplotlib.pyplot as plt

# 1. Зададим функцию производительности (V(x,y) = x^2 + 2y^2)
def target(x, y):
    return x**2 + 2* y**2

# 2. Создадим сетку
x = np.linspace(0, 20, 100) # X от 0 до 20, 100 точек
y = np.linspace(0, 20, 100) # Y от 0 до 20, 100 точек
X, Y = np.meshgrid(x, y)

# 3. Вычислим значение функции производительности на сетке
Z = target(X, Y)

# 4. Нарисуем контуры уровней
plt.figure(figsize=(6, 6)) # Размер графика в дюймах
contour = plt.contour(X, Y, Z, 20, cmap='viridis') # Нарисуем контуры в заданной цветовой гамме
plt.clabel(contour, inline=True, fontsize=8) # Добавим подписи к контурам
plt.xlabel("x") # Метка оси
plt.ylabel("y") # Метка оси
plt.title("Поиск экстремума") # Название диаграммы
plt.axis('equal') # Равные масштабы по осям
plt.colorbar() # Добавим цветовую шкалу

# 5. Проведем линию ограничений
plt.plot(x,20-x)

# 6. Точка условного экстремума
plt.plot(40/3,20/3, 'o')

# 6. Выведем график
plt.show()
→ Ссылка