# Optimization under constraint

Here is an incredible powerfull solution of a constrained optimization that Mathematica cannot solve without help

var('A, x, y, l, alpha, beta, R, p_x, p_y');
U= A*x^(alpha)*y^(beta);
show(U)
D = p_x*x + p_y*y;
show(D)
show(U)
solve(D==R, y)
L = U-l*(D-R)
show(L)
L_x= L.diff(x)
show(L_x)
L_y= L.diff(y)
show(L_y)
L_lambda= L.diff(l)
show(L_l)
z=solve([L_x==0, L_y==0, L_l==0,], x, y, l)


Now I have two questions in one :

1. I would use greek lambda in place of l ?

2. I would retreive the values of x and y to put it in U ? I have tried some solutions as z[0 : 1 :...] but it doesnt work ? How can I do it ?

edit retag close merge delete

I bet L_l (which is not defined) stands for L_lambda.

( 2019-09-12 21:48:22 +0100 )edit

Sort by » oldest newest most voted

Regarding 1., it is not possible to use unicode λ in variables names, since Sage relies on Python 2, which does not allow it, so you have to wait the migration of Sage to Python 3 for that.

Regarding 2, you can use the solution_dict=True of solve :

sage: z=solve([L_x==0, L_y==0, L_l==0,], x, y, l, solution_dict=True)
sage: z
[{l: (A*alpha + A*beta)*(R*alpha/((alpha + beta)*p_x))^alpha*(R*beta/((alpha + beta)*p_y))^beta/R,
y: R*beta/((alpha + beta)*p_y),
x: R*alpha/((alpha + beta)*p_x)}]

sage: z[0]
{l: (A*alpha + A*beta)*(R*alpha/((alpha + beta)*p_x))^alpha*(R*beta/((alpha + beta)*p_y))^beta/R,
y: R*beta/((alpha + beta)*p_y),
x: R*alpha/((alpha + beta)*p_x)}

sage: z[0][x]
R*alpha/((alpha + beta)*p_x)
sage: z[0][y]
R*beta/((alpha + beta)*p_y)


You can pass a dictionary for substituting:

sage: U.subs(z[0])
A*(R*alpha/((alpha + beta)*p_x))^alpha*(R*beta/((alpha + beta)*p_y))^beta

more