Matlab:求解对数方程

ROL*_*OLF 7 matlab logarithm wolframalpha natural-logarithm

我有以下方程式,我想解决a:

x = (a-b-c+d)/log((a-b)/(c-d))
Run Code Online (Sandbox Code Playgroud)

其中x,b,c,和d是已知的.我用Wolfram Alpha来解决这个等式,结果是:

a = b-x*W(-((c-d)*exp(d/x-c/x))/x)
Run Code Online (Sandbox Code Playgroud)

其中W是产品日志功能(Lambert W功能).在Wolfram Alpha页面上看到它可能更容易.

我用Matlab的内置lambertW函数来解决这个问题.这很慢,是我脚本的瓶颈.还有另一种更快的方法吗?它不必精确到小数点后十位.

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

hor*_*ler 4

另一个选项基于更简单的Wright \xcf\x89 函数

\n\n
a = b - x.*wrightOmega(log(-(c-d)./x) - (c-d)./x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

前提是d ~= c + x.*wrightOmega(log(-(c-d)./x) - (c-d)./x)(即,d ~= c+b-ax这种0/0情况下)。这相当于兰伯特W函数的主分支W 0,我认为这是您想要的解决方案分支。

\n\n

与 一样,符号数学工具箱中lambertW也有一个函数。wrightOmega不幸的是,对于大量输入来说,这也可能会很慢。但是,您可以使用wrightOmegaqGitHub 上的 my 进行复值浮点(双精度或单精度)输入。wrightOmega该函数更准确,完全矢量化,并且比使用内置浮点输入快三到四个数量级。

\n\n

对于那些感兴趣的人,wrightOmegaq基于这篇优秀的论文:

\n\n
\n

Piers W. Lawrence、Robert M. Corless 和 David J. Jeffrey,“算法 917:Wright omega 函数的复杂双精度计算”,ACM Transactions on Mathematical Software,卷。38,第 3 期,第 20 条,第 1-17 页,2012 年 4 月。

\n
\n\n

该算法超越了Cleve Moler 中使用的Halley 方法Lambert_W的三次收敛性,并使用具有四阶收敛性的求根方法(Fritsch、Shafer 和 Crowley,1973),在不超过 2 的时间内收敛迭代。

\n\n

另外,为了进一步加快 MolerLambert_W使用级数展开的速度,请参阅我在 Math.StackExchange 上的回答

\n