[英]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頁面上看到它可能更容易。
我使用Matlab的內置lambertW
函數來解決這個問題。 這很慢,是我腳本的瓶頸。 還有另一種更快的方法嗎? 它不必精確到小數點后十位。
編輯:我不知道這個等式很難解決。 這是一張說明我的問題的圖片。 溫度bd加上LMTD在每個時間步長中變化,但是已知。 熱量從紅線(CO2)轉移到藍線(水)。 我需要找到溫度“a”。 我不知道這太難計算了! :P
另一種選擇是基於更簡單的Wrightω函數 :
a = b - x.*wrightOmega(log(-(c-d)./x) - (c-d)./x);
假設d ~= c + x.*wrightOmega(log(-(cd)./x) - (cd)./x)
(即, d ~= c+ba
,在這種情況下x
為0/0
)。 這相當於Lambert W函數的主要分支W 0 ,我認為它是您想要的解決方案分支。
就像lambertW
,Symbolic Math工具箱中有一個wrightOmega
函數。 不幸的是,對於大量輸入,這可能也會很慢。 但是,您可以在GitHub上使用我的wrightOmegaq
進行復值浮點(雙精度或單精度)輸入。 該函數更精確,完全矢量化,並且比使用內置wrightOmega
進行浮點輸入快三到四個數量級。
對於那些感興趣的人, wrightOmegaq
基於這篇優秀論文:
Piers W. Lawrence,Robert M. Corless和David J. Jeffrey,“ 算法917:Wright omega函數的復雜雙精度評估 ”,ACM Transactions on Mathematical Software,Vol。 2012年4月38日第3期第20條第1-17頁。
該算法超越了Cleve Moler的Lambert_W
使用的Halley方法的三次收斂,並使用具有四階收斂的根尋找方法(Fritsch,Shafer,&Crowley,1973)在不超過兩次迭代中收斂。
另外,為了使用系列擴展進一步加速Moler的Lambert_W
,請參閱Math.StackExchange上的答案 。
兩個(可組合)選項:
for i = 1:100, a(i)=lambertw(rhs(i)); end
for i = 1:100, a(i)=lambertw(rhs(i)); end
比a=lambertw(rhs)
慢。 [-1/e, inf)
),則可以使用Cleve Moler在文件交換上提交的Lambert_W
的實現。 您知道每個時間步的熱交換器兩側的質量流量嗎? 如果是,溫度'a'可以通過'有效性 - NTU'方法解決,該方法不需要任何迭代,而不是LMTD方法。 參考:例如http://ceng.tu.edu.iq/ched/images/lectures/chem-lec/st3/c2/Lec23.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.