繁体   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