Matlab:求解对数方程

Matlab: Solving a logarithmic equation

关于 a 我想求解以下等式:

x = (a-b-c+d)/log((a-b)/(c-d))

其中 xbcd 是已知的。我用Wolfram Alpha求解方程,结果是:

a = b-x*W(-((c-d)*exp(d/x-c/x))/x)

其中 W 是乘积对数函数(Lambert W 函数)。在 Wolfram Alpha page.

可能更容易看到它

我用Matlab内置的lambertW函数来求解方程。这相当慢,并且是我脚本中的瓶颈。还有另一种更快的方法吗?它不必精确到小数点后第 10 位。

编辑: 我不知道这个方程式这么难解。这是一张说明我的问题的图片。温度 b-d 加上 LMTD 在每个时间步长中都不同,但都是已知的。热量从红线 (CO2) 转移到蓝线(水)。我需要找到温度 "a"。没想到这么难算! :P

两个(可组合的)选项:

  • 你的脚本已经矢量化了吗?为多个参数评估函数。执行 for i = 1:100, a(i)=lambertw(rhs(i)); enda=lambertw(rhs).
  • 如果您正在处理 LambertW 的实值分支(即您的参数在区间 [-1/e, inf) 中),您可以使用 Cleve 提交的 Lambert_W 的实现File Exchange.
  • 上的 Moler

另一个选项基于更简单的 Wright ω function:

a = b - x.*wrightOmega(log(-(c-d)./x) - (c-d)./x);

前提是 d ~= c + x.*wrightOmega(log(-(c-d)./x) - (c-d)./x)(即 d ~= c+b-ax 在这种情况下是 0/0)。这个相当于Lambert W function,W0的principal分支,我觉得就是你要的解分支

与 GitHub 上的 lambertW, there's a wrightOmega function in the Symbolic Math toolbox. Unfortunately, this will probably also be slow for a large number of inputs. However, you can use my wrightOmegaq 一样,用于复值浮点(双精度或单精度)输入。该函数更准确,完全矢量化,并且比使用内置的浮点输入 wrightOmega 快三到四个数量级。

对于那些感兴趣的人,wrightOmegaq 基于这篇优秀的论文:

Piers W. Lawrence, Robert M. Corless, and David J. Jeffrey, "Algorithm 917: Complex Double-Precision Evaluation of the Wright omega Function," ACM Transactions on Mathematical Software, Vol. 38, No. 3, Article 20, pp. 1-17, Apr. 2012.

该算法超越了 Halley's method used in Cleve Moler's Lambert_W 的三次收敛,并使用四阶收敛的寻根方法(Fritsch、Shafer 和 Crowley,1973 年)在不超过两次迭代中收敛。

此外,要进一步加速 Moler 的 Lambert_W 使用级数展开,请参阅 my answer at Math.StackExchange

你知道换热器两侧在每个时间步长的质量流量吗? 如果是,温度 'a' 可以通过不需要任何迭代的 'effectiveness-NTU' 方法而不是 LMTD 方法来解决。参考:例如http://ceng.tu.edu.iq/ched/images/lectures/chem-lec/st3/c2/Lec23.pdf