Unable to find explicit solution in Lagrangian optimization

2 次查看(过去 30 天)
I am trying to find the analytical solution to the following problem:
I tried solving it by coding the Lagrangian by hand and use solve, but Matlab prints the warning: "Unable to find explicit solution".
I used the following code:
syms e1 e2 p1 p2 rho gamma lambda
syms E H(e1,e2)
H(e1,e2) = (e1^rho +e2^rho)^(1/rho)
L(e1, e2, lambda) = p1*e1 +p2*e2 + lambda*(H(e1,e2)-E)
L_e1 = diff(L,e1) == 0
L_e2 = diff(L,e2) == 0
L_lambda = diff(L,lambda) == 0
system = [L_e1,L_e2,L_lambda]
[e1_s,e2_s,lambda_s]=solve(system,[e1 e2 lambda])
Do you know what I could do to solve this? Or is there a different and better way to find an analytical solution?
  1 个评论
Matt J
Matt J 2024-2-11
编辑:Matt J 2024-2-11
Note that the problem can always be rewritten in the simpler form,
where x=e/E and P=p*E. This is assuming E is a known positive constant.

请先登录,再进行评论。

采纳的回答

Catalytic
Catalytic 2024-2-11
编辑:Catalytic 2024-2-11
An analytical solution for 0<rho<1 is -
A=[1 0;
0 1;
-1 0;
0 -1]*E;
[fval,i]=min(A*[p1;p2]);
e1=A(i,1);
e2=A(i,2);
  2 个评论
Catalytic
Catalytic 2024-2-11
编辑:Catalytic 2024-2-11
You can see this graphically by plotting the constrained region. The region always has extreme points at (), so that's where the optimum must lie.
E=1;
for rho=[0.1:0.2:0.9]
fimplicit(@(e1,e2) abs(e1).^rho + abs(e2).^rho - E.^rho, [-1.5,1.5]); hold on
end
Matt J
Matt J 2024-2-11
I like it. And, in fact, because the extreme points lie at points where H(e1,e2) is not differentiable, it shows that you will never find the true solution with Lagrange multiplier analysis.

请先登录,再进行评论。

更多回答(1 个)

Matt J
Matt J 2024-2-11
If you make rho explicit, it seems to be able to find solutions. I doubt there would be a closed-form solution for general rho.
rho=2;
syms e1 e2 p1 p2 gamma lambda
syms E H(e1,e2)
H(e1,e2) = (e1^rho +e2^rho)
H(e1, e2) = 
L(e1, e2, lambda) = p1*e1 +p2*e2 + lambda*(H(e1,e2)-E^rho)
L(e1, e2, lambda) = 
L_e1 = diff(L,e1) == 0
L_e1(e1, e2, lambda) = 
L_e2 = diff(L,e2) == 0
L_e2(e1, e2, lambda) = 
L_lambda = diff(L,lambda) == 0
L_lambda(e1, e2, lambda) = 
system = [L_e1,L_e2,L_lambda]
system(e1, e2, lambda) = 
[e1_s,e2_s,lambda_s]=solve(system,[e1 e2 lambda])
e1_s = 
e2_s = 
lambda_s = 
  4 个评论
Matt J
Matt J 2024-2-11
Even when it can be explicitly solved, the result isn't nice:
rho=sym(1/4);
syms e1 e2 p1 p2 gamma lambda
syms H(e1,e2)
H(e1,e2) = (e1^rho +e2^rho);
L(e1, e2, lambda) = p1*e1 +p2*e2 + lambda*(H(e1,e2)-1);
L_e1 = diff(L,e1) == 0;
L_e2 = diff(L,e2) == 0;
L_lambda = diff(L,lambda) == 0;
system = [L_e1,L_e2,L_lambda];
[e1_s,e2_s,lambda_s]=solve(system,[e1 e2 lambda])
Warning: Possibly spurious solutions.
e1_s = 
e2_s = 
lambda_s = 
Walter Roberson
Walter Roberson 2024-2-11
You can eliminate the root() constructs, but the result is confusing.
rho=sym(1/4);
syms e1 e2 p1 p2 gamma lambda
syms H(e1,e2)
H(e1,e2) = (e1^rho +e2^rho);
L(e1, e2, lambda) = p1*e1 +p2*e2 + lambda*(H(e1,e2)-1);
L_e1 = diff(L,e1) == 0;
L_e2 = diff(L,e2) == 0;
L_lambda = diff(L,lambda) == 0;
system = [L_e1,L_e2,L_lambda];
[e1_s,e2_s,lambda_s]=solve(system,[e1 e2 lambda], 'maxdegree', 3)
Warning: Possibly spurious solutions.
e1_s = 
e2_s = 
lambda_s = 

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Symbolic Math Toolbox 的更多信息

产品


版本

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by