我想要针对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
函数来解决这个问题。这很慢,是我脚本的瓶颈。还有另一种更快的方法吗?它不必精确到小数点后十位。
编辑: 我不知道这个等式很难解决。这是一张说明我的问题的图片。温度b-d加LMTD在每个时间步长中变化,但是已知。热量从红线(CO2)转移到蓝线(水)。我需要找到温度" a"。我不知道这太难计算了! :P
答案 0 :(得分:4)
另一种选择是基于更简单的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-a
,x
在这种情况下为0/0
。这相当于Lambert W function, W 0 的主要分支,我认为这是您想要的解决方案分支。
与lambertW
一样,Symbolic Math工具箱中有一个wrightOmega
函数。不幸的是,对于大量输入,这可能也会很慢。但是,您可以在GitHub上使用我的wrightOmegaq
来进行复值浮点(双精度或单精度)输入。该函数更精确,完全向量化,比使用内置wrightOmega
浮点输入快三到四个数量级。
对于那些感兴趣的人,wrightOmegaq
基于这篇优秀论文:
Piers W. Lawrence,Robert M. Corless和David J. Jeffrey,“Algorithm 917: Complex Double-Precision Evaluation of the Wright omega Function,”ACM Transactions on Mathematical Software,Vol。 38,第3,第20条,第1-17页,2012年4月。
该算法超越了Cleve Moler Halley's method中使用的Lambert_W
的三次收敛,并使用了四阶收敛的根寻找方法(Fritsch,Shafer,& Crowley,1973)。收敛不超过两次迭代。
另外,要使用系列扩展进一步加快Moler Lambert_W
的速度,请参阅my answer at Math.StackExchange。
答案 1 :(得分:1)
两个(可组合的)选项:
for i = 1:100, a(i)=lambertw(rhs(i)); end
的速度比a=lambertw(rhs)
慢。[-1/e, inf)
区间内),则可以使用 Cleve Moler提交的Lambert_W
的实现 File Exchange。答案 2 :(得分:0)
您知道每个时间步在热交换器两侧的质量流量吗? 如果是,则可以通过“有效性-NTU”方法(不需要任何迭代)来解决温度“ a”,而不是LMTD方法。参考:例如event