7

我有以下等式,我想解决a

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

其中x, b, c, 和d是已知的。我用 Wolfram Alpha 求解方程,结果是:

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

其中W是产品对数函数(Lambert W 函数)。在Wolfram Alpha 页面上可能更容易看到它。

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

编辑:我不知道这个方程很难解。这是一张说明我的问题的图片。温度 bd 加上 LMTD 在每个时间步长中变化,但是是已知的。热量从红线(CO2)转移到蓝线(水)。我需要找到温度“a”。没想到这么难计算!:P 在此处输入图像描述

4

3 回答 3

4

另一种选择是基于更简单的Wright ω 函数

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-a在这种情况下是)x0/0这相当于Lambert W function的主要分支W 0,我认为这是您想要的解决方案分支。

与 一样lambertW,符号数学工具箱中有一个wrightOmega函数。不幸的是,对于大量输入,这可能也会很慢。但是,您可以wrightOmegaq在 GitHub 上使用我的复值浮点(双精度或单精度)输入。该函数更准确,完全矢量化,并且比使用内置wrightOmega浮点输入快三到四个数量级。

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

Piers W. Lawrence、Robert M. Corless 和 David J. Jeffrey,“算法 917:Wright omega 函数的复杂双精度评估”,ACM Transactions on Mathematical Software,Vol。38,第 3 号,第 20 条,第 1-17 页,2012 年 4 月。

该算法超越了Cleve Moler 中使用的Halley 方法Lambert_W的三次收敛,并使用具有四阶收敛的求根方法 (Fritsch, Shafer, & Crowley, 1973) 在不超过两次迭代中收敛。

此外,为了进一步加快 MolerLambert_W使用级数展开的速度,请参阅我在 Math.StackExchange 上的回答

于 2015-02-24T20:35:25.870 回答
1

两个(可组合的)选项:

  • 你的脚本已经矢量化了吗?为多个参数评估函数。执行for i = 1:100, a(i)=lambertw(rhs(i)); end速度比a=lambertw(rhs).
  • 如果您正在处理 LambertW 的实值分支(即您的参数在区间内[-1/e, inf)),您可以使用Cleve MolerFile ExchangeLambert_W上提交的实现。
于 2015-02-24T19:02:05.160 回答
0

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

于 2019-01-28T10:48:30.923 回答