簡體   English   中英

Matlab:求解對數方程

[英]Matlab: Solving a logarithmic equation

我有以下等式,我想解決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頁面上看到它可能更容易。

我使用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 ,在這種情況下x0/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)); enda=lambertw(rhs)慢。
  • 如果您正在處理LambertW的實值分支(即您的參數位於區間[-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM