Frage

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.

War es hilfreich?

Lösung

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)

Andere Tipps

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top