假设A,B和C是正常数。我需要以符号形式求解下面的等式W(A,B,C)。
solve(x-(exp(log(2)*x*A)-B)*C==0)
感谢任何帮助。
答案 0 :(得分:1)
由于等式混合了多项式和超越,我的第一个想法就是它可能没有解析解。但是,表单提醒我Lambert W函数(Wikipedia和Mathworks 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
注意:a
,b
和c
的某些组合可能会产生一个没有真正解决方案的等式。在这种情况下,分析解决方案可能会给出一个复杂的数字,其准确性应该受到高度质疑。