我想评估以下表达式:
我使用了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中做错的任何事情都会给出这个复杂的答案。
答案 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
方法已被弃用),因为虚部上的残差仍然较小。
如果如上所述,您只需要结果的真实部分,请将函数real
与double
结合使用,这仍然会得到相同的结果:
>> double(real(q))
ans =
1.883829527329202