我有以下方程式需要解决,其中要涉及到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位小数。
编辑:
我不知道这个方程式有多难求。这里是一个说明我的问题的图片。温度b-d加上LMTD在每个时间步长中都会变化,但是是已知的。热从红线(CO2)传递到蓝线(水)。我需要找到温度“a”。我不知道这是如此难以计算!:P
a
?是作为其他某个求解器的一部分吗?你想要评估的x,b,c,...
的值是否已知? - knedlseppx,b,c,d
的实际值?我的第一个天真想法是尝试使用fzero()
来找到(a-b-c+d)/ln((a-b)/(c-d)) - x
的根,但对于我尝试过的一些随机参数值,这可能会导致复杂的答案。 - eigenchrislambertw
的评估?你可以使用lambertw(1:100)
代替for i = 1:100, lambertw(i), end
,这样速度大约快了30倍。对于30000个值,这只需要大约30秒。 - knedlsepplambertw
是一个巨大的开销。切换到数字实现。Octave版本可能是最容易移植的:http://octave-specfun.sourcearchive.com/documentation/1.0.9-1/lambertw_8m-source.html 没有对代码进行基准测试,但仅使用10次迭代和没有其他循环的for循环应该很快。 - Daniel