Matlab 中分母中复杂函数与亥维赛的积分

问题描述 投票:0回答:1

我想计算以下表达式:

expression

我使用了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 中做错的任何事情,从而给出这个复杂的答案吗?

function matlab numerical-integration
1个回答
1
投票

你担心的是错误的事情。您得到的结果 is 在 [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
。这意味着您的积分评估了一个real数字。

现在我不知道你的研究结论是什么,但如果你肯定结果hasreal,那么你可以只取表达式中的real部分:

>> q.real.eval
ans =
   1.883829527329203

感谢 Horchler 的评论,评估积分值的更好方法是直接将其转换为

double
精度数 :

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

显然,Matlab 已经改进了对 double 的转换(并让旧的

q.eval
方法被弃用),因为虚部上的残差还更小。

如果如上所述,您只想要结果的 real 部分,请将函数

real
double
结合使用,仍然会得到相同的结果:

>> double(real(q))
ans =
   1.883829527329202
© www.soinside.com 2019 - 2024. All rights reserved.