【问题标题】:MATLAB symbolically solve a system in logarithms -- Why does the solver fail to find a solution?MATLAB 用对数符号求解系统 -- 为什么求解器找不到解?
【发布时间】:2013-01-08 19:17:38
【问题描述】:

我正在尝试以符号方式求解对数方程组(因此估计的系数是弹性​​),但 matlab 告诉我“找不到显式解决方案”。任何想法为什么?

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');

[编辑] 根据阿里的意见,我尝试了以下方法:

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');

我还尝试了不同的求解语句:

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

但还是没有运气。

[编辑] 结果证明仅在一台机器上是一个问题 - 原始方法在另一台计算机上运行良好。

【问题讨论】:

    标签: matlab solver logarithm equation-solving


    【解决方案1】:

    嗯,这两个选项都对我有用:

    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');
    

    我得到 ans2:

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

    与:

    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))
    

    对于阿里建议的第二个选项:

    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)
    

    【讨论】:

    • 好吧,那么疯狂的事情正在发生。我刚刚将您的第一个代码块复制到一个空白的 .m 文件中,它返回相同的错误:警告:找不到显式解决方案。 > 81 点求解 11 点测试
    • 好吧,不知道发生了什么...也许我需要重新安装 Matlab。在另一台机器上试过,效果很好。尽管如此,还是感谢您的帮助!
    【解决方案2】:

    一般来说,你不能用符号解方程。典型的技术应用没有解析解,即无法符号解。

    话虽如此,我相信你可以用符号方式求解你的方程(我没有Matlab,我从来没有用过,下面的代码只是伪代码):

    通过将 eq5 和 eq6 中的 D1:=S1 和 D2:=S2 替换掉

    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);
    

    为当前变量的对数引入新变量:newvariable=log(variable)

    那么你有一个很好的线性系统,解决它应该没问题。

    【讨论】:

    • 对——替换负责解决它的第一步。不幸的是,Matlab 仍然无法解决它。没有日志,它象征性地解决它就好了。使用日志,它不会。即使我提供了系数 (a,b,c,e) 的值,它仍然不起作用。
    • newvariable=log(variable) 替换来得到一个线性系统是不够聪明的。你必须手工完成。但这并没有什么令人惊讶的地方。
    • 仍然无法正常工作...我编辑了原始问题以向您展示我尝试过的内容
    • 嗯。它是一个线性系统,应该没有问题。我不知道 Matlab 的问题是什么。由于我没有Matlab,我无法为您提供更多帮助,非常抱歉:(希望其他人可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多