如何使用Lambertw以符号形式求解指数方程

时间:2016-06-16 21:40:07

标签: matlab optimization

假设A,B和C是正常数。我需要以符号形式求解下面的等式W(A,B,C)。

solve(x-(exp(log(2)*x*A)-B)*C==0)

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于等式混合了多项式和超越,我的第一个想法就是它可能没有解析解。但是,表单提醒我Lambert W函数(WikipediaMathworks blog post),所以我尝试了变量替换u = x/c+b,这产生了简化问题

  
solve(u == alpha * exp(beta * u) , u);

其中alpha = exp(-log(2)*a*b*c)beta = log(2)*a*c。通过Matlab运行这个给我

>> syms alpha beta u
>> solve(u == alpha * exp(beta * u) , u)
ans =
-lambertw(0, -alpha*beta)/beta

确实展示了Lambert W函数调用。有了这些知识,我们可以像xsol一样得到解决方案:

syms a b c alpha beta x u xsol usol
usol = solve(u == alpha * exp(beta*u),u);
log2 = log(sym(2));
xsol = subs(c*(usol-b),[alpha,beta],[exp(-log2*a*b*c),log2*a*c]);

让我们通过检查分析解决方案与数字解决方案相比,确保符号引擎没有出错:

anum = rand();
bnum = rand();
cnum = rand();
xana = double(subs(xsol,[a,b,c],[anum,bnum,cnum]));
xnum = vpasolve(x-(exp(log2*x*anum)-bnum)*cnum,x);
fprintf('%15.10e\n%15.10e\n%15.10e\n',xana,xnum,xana-xnum);

显示

8.0171933677e-02
8.0171933677e-02
1.7453177064e-19

注意abc的某些组合可能会产生一个没有真正解决方案的等式。在这种情况下,分析解决方案可能会给出一个复杂的数字,其准确性应该受到高度质疑。