ROL*_*OLF 7 matlab logarithm wolframalpha natural-logarithm
我有以下方程式,我想解决a:
x = (a-b-c+d)/log((a-b)/(c-d))
Run Code Online (Sandbox Code Playgroud)
其中x,b,c,和d是已知的.我用Wolfram Alpha来解决这个等式,结果是:
a = b-x*W(-((c-d)*exp(d/x-c/x))/x)
Run Code Online (Sandbox Code Playgroud)
其中W是产品日志功能(Lambert W功能).在Wolfram Alpha页面上看到它可能更容易.
我用Matlab的内置lambertW函数来解决这个问题.这很慢,是我脚本的瓶颈.还有另一种更快的方法吗?它不必精确到小数点后十位.
编辑:我不知道这个等式很难解决.这是一张说明我的问题的图片.温度bd加LMTD在每个时间步长中变化,但是已知.热量从红线(CO2)转移到蓝线(水).我需要找到温度"a".我不知道这太难计算了!:P

另一个选项基于更简单的Wright \xcf\x89 函数:
\n\na = b - x.*wrightOmega(log(-(c-d)./x) - (c-d)./x);\nRun Code Online (Sandbox Code Playgroud)\n\n前提是d ~= c + x.*wrightOmega(log(-(c-d)./x) - (c-d)./x)(即,d ~= c+b-a在x这种0/0情况下)。这相当于兰伯特W函数的主分支W 0,我认为这是您想要的解决方案分支。
与 一样,符号数学工具箱中lambertW也有一个函数。wrightOmega不幸的是,对于大量输入来说,这也可能会很慢。但是,您可以使用wrightOmegaqGitHub 上的 my 进行复值浮点(双精度或单精度)输入。wrightOmega该函数更准确,完全矢量化,并且比使用内置浮点输入快三到四个数量级。
对于那些感兴趣的人,wrightOmegaq基于这篇优秀的论文:
\n\n\nPiers W. Lawrence、Robert M. Corless 和 David J. Jeffrey,“算法 917:Wright omega 函数的复杂双精度计算”,ACM Transactions on Mathematical Software,卷。38,第 3 期,第 20 条,第 1-17 页,2012 年 4 月。
\n
该算法超越了Cleve Moler 中使用的Halley 方法Lambert_W的三次收敛性,并使用具有四阶收敛性的求根方法(Fritsch、Shafer 和 Crowley,1973),在不超过 2 的时间内收敛迭代。
另外,为了进一步加快 MolerLambert_W使用级数展开的速度,请参阅我在 Math.StackExchange 上的回答。