簡體   English   中英

Matlab分母中復雜功能與重糖苷的積分

[英]integration of complicated function with heaviside in denominator in Matlab

我想評估以下表達式:

表達

我使用過Matlab int命令,但是由於未知原因,復數和pi是Matlab答案的一部分。

syms x;
q = int(1/((9*(1 - x^2)^(1/2)*(heaviside(x - 1) - heaviside(x + 1)))/5 + 2*(4 - x^2)^(1/2)),-2,2)

它給了我這個相當復雜的答案:

(68*pi)/19 - (450*pi*957^(1/2))/6061 - (957^(1/2)*log(5700)*225*i)/6061 + (957^(1/2)log(3^(1/2)((19*319^(1/2))/2700 - (3*19^(1/2))/100 + (6061^(1/2)*i)/300 + (19*i)/300))*225*i)/6061 - (957^(1/2)log(-3^(1/2)((3*19^(1/2))/100 + (19*319^(1/2))/2700 + (6061^(1/2)*i)/300 - (19*i)/300))*225*i)/6061 + (957^(1/2)*log(10*57^(1/2))*450*i)/6061 - (19^(1/2)*243^(1/2)*6061^(1/2)*log((3^(1/2)*i + (19^(1/2)243^(1/2)(6061^(1/2)/19 + 4))/243)/(6061^(1/2)/19 + 1))*25*i)/115159 + (19^(1/2)*243^(1/2)*6061^(1/2)*log(-(3^(1/2)*i - (19^(1/2)243^(1/2)(6061^(1/2)/19 - 4))/243)/(6061^(1/2)/19 - 1))*25*i)/115159

如果我的研究模型正確,那么答案應該僅在1到10個實數之間(不復雜)。

您能給我任何建議,任何命令還是指出我在matlab中做錯的任何事情嗎?

您正在擔心錯誤的事情。 你所得到的結果在范圍[1 10]。 復雜的部分將互相抵消。

如果我評估您的代碼:

syms x;
q = int(1/((9*(1 - x^2)^(1/2)*(heaviside(x - 1) - heaviside(x + 1)))/5 + 2*(4 - x^2)^(1/2)),-2,2)

我得到的q表達式與您不同:

q =
(68*pi)/19 - (45*pi*300^(1/2)*319^(1/2))/6061 - (45*300^(1/2)*319^(1/2)*i*log(243*19^(1/2)*319^(1/2) - 4617))/6061 + (45*300^(1/2)*319^(1/2)*i*log(243*19^(1/2)*319^(1/2) + 4617))/6061 - (45*300^(1/2)*319^(1/2)*i*log(300*19^(1/2)*319^(1/2) - 5700))/6061 + (45*300^(1/2)*319^(1/2)*i*log(300*19^(1/2)*319^(1/2) + 5700))/6061 + (45*300^(1/2)*319^(1/2)*i*log(19*300^(1/2)*319^(1/2) - 19*19^(1/2)*300^(1/2)))/6061 - (45*300^(1/2)*319^(1/2)*i*log(19*19^(1/2)*300^(1/2) + 19*300^(1/2)*319^(1/2)))/6061 - (45*300^(1/2)*319^(1/2)*i*log(- 76*19^(1/2)*243^(1/2) - 19*243^(1/2)*319^(1/2) - 4617*3^(1/2)*i))/12122 + (45*300^(1/2)*319^(1/2)*i*log(19*243^(1/2)*319^(1/2) - 76*19^(1/2)*243^(1/2) - 4617*3^(1/2)*i))/12122 + (45*300^(1/2)*319^(1/2)*i*log(76*19^(1/2)*243^(1/2) - 19*243^(1/2)*319^(1/2) + 4617*3^(1/2)*i))/12122 - (45*300^(1/2)*319^(1/2)*i*log(76*19^(1/2)*243^(1/2) + 19*243^(1/2)*319^(1/2) + 4617*3^(1/2)*i))/12122

但是,如果我以舊方式評估它(這在Matlab R2009a上有效):

>> q.eval
ans =
  1.883829527329203 - 0.000000000000004i

您應注意,虛部幾乎沒有。 這只是計算錯誤的殘余。 使用64位浮點數表示法(matlab double精度格式)時,您不能期望超過15位的精度。 如果這是長時間計算的結果,則期望值更低(誤差可能會隨着計算次數的增加而增加)。

在這種情況下,您可以放心地放棄一個值0.000000000000004並將其同化為0 這意味着您的積分求出了一個數。

現在我不知道您的研究結論是什么,但是如果您肯定確定結果必須實數 ,那么您只能采用表達式的部:

>> q.real.eval
ans =
   1.883829527329203

感謝Horchler的評論,評估積分值的更好方法是將其直接轉換為double精度數:

>> double(q)
ans =
  1.883829527329202 - 0.000000000000000i

顯然,Matlab已將轉換改進為兩倍(不贊成使用舊的q.eval方法),因為虛部的殘差較小。

如果如上所述,您只想要結果的實數部分,則將real函數與double結合使用,仍然可以得到相同的結果:

>> double(real(q))
ans =
   1.883829527329202

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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