Применение метода Лагранжа
Задача:
Допустим, вы хотите произвести некоторое количество товара, которое зависит от часов работы двух ключевых сотрудников следующим образом:
• Целевая функция: 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 шт):
Вы всё правильно решили. При помощи метода Лагранжа вы нашли условный экстремум функции 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()
