【发布时间】:2015-02-24 17:48:41
【问题描述】:
关于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 page 上可能更容易看到它。
我使用 Matlab 内置的lambertW 函数来求解方程。这相当慢,是我脚本中的瓶颈。还有另一种更快的方法吗?它不必精确到小数点后 10 位。
编辑: 我不知道这个方程很难解。这是一张说明我的问题的图片。温度 b-d 加上 LMTD 在每个时间步长中都不同,但是是已知的。热量从红线(CO2)转移到蓝线(水)。我需要找到温度“a”。没想到这么难计算! :P
【问题讨论】:
-
您需要多久以及在什么情况下为
a求解这个方程?作为其他求解器的一部分?您要评估的x,b,c,...的值是否都已知? -
我对 Lambert W 函数一无所知。但是,我没有发现您的回答很有帮助,IrrationalPerson。 @knedlsepp:我正在使用 in 来解决热泵中的热交换器。我有点在其他求解器中使用它。我猜这个函数至少被使用了 30.000 次,很可能更多(我正在做一年的每小时计算)。如前所述,x、b、c 和 d 是已知的。
-
您能否编辑您的帖子,为
x,b,c,d提供一些现实价值?我的第一个天真的想法是尝试使用fzero()来查找(a-b-c+d)/ln((a-b)/(c-d)) - x的根,但这可能会导致我尝试过的一些随机参数值的答案很复杂。 -
@ROLF:您是否已经尝试过评估
lambertw的向量而不是单个值?您可以使用lambertw(1:100)代替for i = 1:100, lambertw(i), end,这比原来的速度快了大约30 倍。对于 30.000 个值,这大约需要 30 秒。 -
添加另一个想法:
lambertw在 matlab 中使用符号数学,这是一个巨大的开销。切换到数字实现。 octave 版本可能是最容易移植的:octave-specfun.sourcearchive.com/documentation/1.0.9-1/… 没有对代码进行基准测试,但只有 10 次迭代且没有其他循环的 for 循环应该很快。
标签: matlab logarithm wolframalpha natural-logarithm