Matlab:求解对数方程

时间:2015-02-24 17:48:41

标签: matlab logarithm wolframalpha natural-logarithm

我想要针对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函数来解决这个问题。这很慢,是我脚本的瓶颈。还有另一种更快的方法吗?它不必精确到小数点后十位。

编辑: 我不知道这个等式很难解决。这是一张说明我的问题的图片。温度b-d加LMTD在每个时间步长中变化,但是已知。热量从红线(CO2)转移到蓝线(水)。我需要找到温度" a"。我不知道这太难计算了! :P enter image description here

3 个答案:

答案 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-ax在这种情况下为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)慢。
  • 如果您正在处理LambertW的实值分支(即您的参数位于[-1/e, inf)区间内),则可以使用 Cleve Moler提交的Lambert_W的实现 File Exchange

答案 2 :(得分:0)

您知道每个时间步在热交换器两侧的质量流量吗? 如果是,则可以通过“有效性-NTU”方法(不需要任何迭代)来解决温度“ a”,而不是LMTD方法。参考:例如event