Matlab:求解对数方程
Matlab: Solving a logarithmic equation
关于 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
两个(可组合的)选项:
- 你的脚本已经矢量化了吗?为多个参数评估函数。执行
for i = 1:100, a(i)=lambertw(rhs(i)); end
比 a=lambertw(rhs)
. 慢
- 如果您正在处理 LambertW 的实值分支(即您的参数在区间
[-1/e, inf)
中),您可以使用 Cleve 提交的 Lambert_W
的实现File Exchange. 上的 Moler
另一个选项基于更简单的 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,W0的principal分支,我觉得就是你要的解分支
与 GitHub 上的 lambertW
, there's a wrightOmega
function in the Symbolic Math toolbox. Unfortunately, this will probably also be slow for a large number of inputs. However, you can use my wrightOmegaq
一样,用于复值浮点(双精度或单精度)输入。该函数更准确,完全矢量化,并且比使用内置的浮点输入 wrightOmega
快三到四个数量级。
对于那些感兴趣的人,wrightOmegaq
基于这篇优秀的论文:
Piers W. Lawrence, Robert M. Corless, and David J. Jeffrey, "Algorithm 917: Complex Double-Precision Evaluation of the Wright omega Function," ACM Transactions on Mathematical Software, Vol. 38, No. 3, Article 20, pp. 1-17, Apr. 2012.
该算法超越了 Halley's method used in Cleve Moler's Lambert_W
的三次收敛,并使用四阶收敛的寻根方法(Fritsch、Shafer 和 Crowley,1973 年)在不超过两次迭代中收敛。
此外,要进一步加速 Moler 的 Lambert_W
使用级数展开,请参阅 my answer at Math.StackExchange。
你知道换热器两侧在每个时间步长的质量流量吗?
如果是,温度 'a' 可以通过不需要任何迭代的 'effectiveness-NTU' 方法而不是 LMTD 方法来解决。参考:例如http://ceng.tu.edu.iq/ched/images/lectures/chem-lec/st3/c2/Lec23.pdf
关于 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
两个(可组合的)选项:
- 你的脚本已经矢量化了吗?为多个参数评估函数。执行
for i = 1:100, a(i)=lambertw(rhs(i)); end
比a=lambertw(rhs)
. 慢
- 如果您正在处理 LambertW 的实值分支(即您的参数在区间
[-1/e, inf)
中),您可以使用 Cleve 提交的Lambert_W
的实现File Exchange. 上的 Moler
另一个选项基于更简单的 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,W0的principal分支,我觉得就是你要的解分支
与 GitHub 上的 lambertW
, there's a wrightOmega
function in the Symbolic Math toolbox. Unfortunately, this will probably also be slow for a large number of inputs. However, you can use my wrightOmegaq
一样,用于复值浮点(双精度或单精度)输入。该函数更准确,完全矢量化,并且比使用内置的浮点输入 wrightOmega
快三到四个数量级。
对于那些感兴趣的人,wrightOmegaq
基于这篇优秀的论文:
Piers W. Lawrence, Robert M. Corless, and David J. Jeffrey, "Algorithm 917: Complex Double-Precision Evaluation of the Wright omega Function," ACM Transactions on Mathematical Software, Vol. 38, No. 3, Article 20, pp. 1-17, Apr. 2012.
该算法超越了 Halley's method used in Cleve Moler's Lambert_W
的三次收敛,并使用四阶收敛的寻根方法(Fritsch、Shafer 和 Crowley,1973 年)在不超过两次迭代中收敛。
此外,要进一步加速 Moler 的 Lambert_W
使用级数展开,请参阅 my answer at Math.StackExchange。
你知道换热器两侧在每个时间步长的质量流量吗? 如果是,温度 'a' 可以通过不需要任何迭代的 'effectiveness-NTU' 方法而不是 LMTD 方法来解决。参考:例如http://ceng.tu.edu.iq/ched/images/lectures/chem-lec/st3/c2/Lec23.pdf