Matlab中分母中复杂函数与重质子的积分

时间:2015-01-17 13:59:02

标签: matlab function integration

我想评估以下表达式:

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中做错的任何事情都会给出这个复杂的答案。

1 个答案:

答案 0 :(得分:1)

你担心错误的事情。 的结果>在[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已经将转换改进为double(并且旧的q.eval方法已被弃用),因为虚部上的残差仍然较小。

如果如上所述,您只需要结果的真实部分,请将函数realdouble结合使用,这仍然会得到相同的结果:

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