[英]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.