1

I'm trying to symbolically solve a system of equations in logarithms (so the estimated coefficients are elasticities), but matlab is tells me an "Explicit solution could not be found." Any ideas why?

syms a1 a2 b1 c1 c2 e1 e2 S1 D1 P1 S2 D2 P2 Pinput;

eq1 = -log(S1) + a1*log(P1) + a2*log(Pinput);
eq2 = -log(S2) + b1*log(P2);
eq3 = -log(D1) + c1*log(P1) + c2*log(P2);
eq4 = -log(D2) + e1*log(P2) + e2*log(P1);
eq5 = -S1 + D1;
eq6 = -S2 + D2;

ans2 = solve(eq1,eq2,eq3,eq4,eq5,eq6,'P1','P2','S1','S2','D1','D2');

[edit] Based on input from Ali, I tried the following:

syms a1 a2 b1 c1 c2 e1 e2 S1 D1 P1 S2 D2 P2 Pinput;

lS1 = log(S1);
lS2 = log(S2);
lD1 = log(D1);
lD2 = log(D2);
lP1 = log(P1);
lP2 = log(P2);
lPinput = log(Pinput);

eq1 = -lS1 + a1*lP1 + a2*lPinput;
eq2 = -lS2 + b1*lP2;
eq3 = -lS1 + c1*lP1 + c2*lP2;
eq4 = -lS2 + e1*lP2 + e2*lP1;

ans2 = solve(eq1,eq2,eq3,eq4,'P1','P2','S1','S2');

I also tried a different solve statement:

ans2 = solve(eq1,eq2,eq3,eq4,'lP1','lP2','lS1','lS2');

but still no luck.

[edit] Turned out to be an issue on one machine alone--the original approach worked fine on another computer.

Trevor
  • 181
  • 1
  • 7

2 Answers2

3

Well, both options worked for me:

clear all
syms a1 a2 b1 c1 c2 e1 e2 S1 D1 P1 S2 D2 P2 Pinput;

eq1 = -log(S1) + a1*log(P1) + a2*log(Pinput);
eq2 = -log(S2) + b1*log(P2);
eq3 = -log(D1) + c1*log(P1) + c2*log(P2);
eq4 = -log(D2) + e1*log(P2) + e2*log(P1);
eq5 = -S1 + D1;
eq6 = -S2 + D2;

ans2 = solve(eq1,eq2,eq3,eq4,eq5,eq6,'P1','P2','S1','S2','D1','D2');

and I get ans2:

D1: [1x1 sym]
D2: [1x1 sym]
P1: [1x1 sym]
P2: [1x1 sym]
S1: [1x1 sym]
S2: [1x1 sym]

with:

D1=exp((a2*log(Pinput)*(b1*c1 - c1*e1 + c2*e2))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))
D2=exp((a2*b1*e2*log(Pinput))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))
P1=exp((a2*log(Pinput)*(b1 - e1))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))
P2=exp((a2*e2*log(Pinput))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))
S1=exp((a2*log(Pinput)*(b1*c1 - c1*e1 + c2*e2))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))
S2=exp((a2*b1*e2*log(Pinput))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2))

For the second option that Ali suggested:

syms lS1 lS2 a1 b1 c1 e1 lP1 lP2 a2 c2 e2 lPinput
eq1 = -lS1 + a1*lP1 + a2*lPinput;
eq2 = -lS2 + b1*lP2;
eq3 = -lS1 + c1*lP1 + c2*lP2;
eq4 = -lS2 + e1*lP2 + e2*lP1;

ans2 = solve(eq1,eq2,eq3,eq4,'lP1','lP2','lS1','lS2');

ans2 =

lP1: [1x1 sym]
lP2: [1x1 sym]
lS1: [1x1 sym]
lS2: [1x1 sym]

ans2.lP1  =  (a2*lPinput*(b1 - e1))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2)
ans2.lP2  =  (a2*e2*lPinput)/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2)
ans2.lS1  =  (a2*lPinput*(b1*c1 - c1*e1 + c2*e2))/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2)
ans2.lS2  =  (a2*b1*e2*lPinput)/(b1*c1 - a1*b1 + a1*e1 - c1*e1 + c2*e2)
bla
  • 25,846
  • 10
  • 70
  • 101
  • Ok, something crazy is going on then. I just copied your first block of code into a blank .m file, and it returns the same error: Warning: Explicit solution could not be found. > In solve at 81 In test at 11 – Trevor Jan 09 '13 at 17:27
  • Alright, not sure what was going on... Maybe I need to reinstall Matlab. Tried it on a different machine and it works fine. Thanks for the help nonetheless! – Trevor Jan 10 '13 at 20:57
2

In general, you cannot solve an equation symbolically. The typical technical applications don't have analytic solutions, that is, cannot be solved symbolically.

Having said that, I believe you can solve your equations symbolically (I don't have Matlab and I have never used it, the code below is just pseudo-code):

By substituting D1:=S1 and D2:=S2 from eq5 and eq6 you get

eq1 = -log(S1) + a1*log(P1) + a2*log(Pinput);
eq2 = -log(S2) + b1*log(P2);
eq3 = -log(S1) + c1*log(P1) + c2*log(P2);
eq4 = -log(S2) + e1*log(P2) + e2*log(P1);

Introduce new variables for the logarithms of the current ones: newvariable=log(variable).

Then you have a nice linear system, solving it should be no problem.

Ali
  • 56,466
  • 29
  • 168
  • 265
  • Right--the substitution takes care of the first step of solving it. Unfortunately, Matlab still can't solve it. Without the logs, it solves it symbolically just fine. With the logs, it doesn't. Even if I supply values for the coefficients (a,b,c,e), it still doesn't work. – Trevor Jan 08 '13 at 21:12
  • It's just not smart enough to do the `newvariable=log(variable)` substitution to get a linear system. You have to do it by hand. But there is nothing surprising in it. – Ali Jan 08 '13 at 21:17
  • Still not working... I edited the original question to show you what I tried – Trevor Jan 08 '13 at 21:47
  • Hmm. It is a linear system, there should be no problem with it. I have no idea what Matlab's problem is. Since I don't have Matlab, I cannot help you any further, I am very sorry :( Let's hope someone else can. – Ali Jan 08 '13 at 22:24