2015-01-17 182 views
0

与亥复杂功能的分母我要评估以下表达式:集成在Matlab

expression

我已经使用Matlab的int命令,但不知什么原因,复数和P1的部分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

作为一个方面说明,我也问这个问题在这里http://math.stackexchange.com/questions/1107164/integration-of-complicated-function-with-heaviside-in-denominator-in-matlab我被建议在这里发布 – irtiza

+0

告诉我们的代码,你在哪里定义函数和你调用'int'命令的地方,可能你的函数没有很好的定义。 – Hoki

+1

是的,你被建议在这里发帖,我引用:“_你应该更努力地问清楚未来的问题。另外,对于Matlab的问题,你可以尝试StackOverflow.com/Matlab,但一定要问清楚并**提供码**。_”。但显然你只是复制/粘贴你的问题。 – Hoki

回答

1

你在担心错误的事情。您得到的结果为,范围为[110]。复杂的部分将互相取消。

如果我评价你的代码:

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 

您应该注意到虚部与n othing。这只是计算错误的一个残余。使用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方法得到了弃用)。

如果如上你只想要结果的真正部分,结合使用功能realdouble,仍然给予同样的结果:

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

计算机的内存宽度(32位或64位)对此完全无关紧要。请编辑出来。无论如何(即使在8位微控制器上),IEEE双精度的计算也是相同的。另外,'q.eval'和'q.real.eval'似乎是旧的或不正确的语法。他们不适用于R2014b。 'double(q)'和'double(real(q))'会起作用。 – horchler

+0

此外,如果您使用'vpa'而不是'double'以变量精度评估表达式,则会看到如果数字的值设置得足够高,例如64,则虚数成分将消失。 – horchler

+0

@horchler。感谢您的更正。事实证明'vpa'甚至不是必要的,投射翻倍足以摆脱尾随的错误。我对32/64位的评论提到了字面表达式不同(我的大约是他的两倍),所以这只是一个猜测来解释(不是“双数”的舍入误差)。但是你是对的,它更具有建设性(甚至只是猜测)的混淆,所以它被删除了。 – Hoki