定积分Matlab

时间:2013-09-11 07:01:27

标签: matlab function math linear-algebra integrate

我正在Matlab开展项目,需要找到两条线之间的区域(在区间[-1,+ 1]中的点(xIntersection,yIntersection)相交。所以想法是减去两条线并在[-1,xIntersection]和[xIntersection,+ 1]之间进行积分,对结果求和,如果是负数,则改变它的符号。

有关如何找到两条线的交叉点的详细信息,请检查link

我正在使用Matlab's函数int(),这是我的代码片段:

xIntersection = ((x_1 * y_2 - y_1 * x_2) * (x_3 - x_4) - (x_1 - x_2) * (x_3 * y_4 - y_3 * x_4) ) / ((x_1 - x_2) * (y_3 - y_4) - (y_1 - y_2) * (x_3 - x_4));

syms x;
integral = int( line 1 - line 2 expression containing x, x, -1, xIntersection) + int( line 1 - line 2 expression containing x, x, xIntersection, 1)
if(integral < 0),
    integral = integral * -1;
end

问题是Matlab不会返回积分的实际值,而是返回包含除法的表达式,即:

  

107813370750829368626584124420059/162259276829213363391578010288128

这使我无法使用集成结果进行进一步操作。

  1. 知道为什么这是返回值?
  2. 对可能存在漏洞的想法?

2 个答案:

答案 0 :(得分:4)

两条曲线之间的区域等于“上部曲线”和“下部曲线”之间差异的积分,因此第二个被积函数中的符号不​​正确。

然而,主要问题是您正在使用符号表达式。这意味着MATLAB将尽最大努力为您提供精确答案,而不是近似答案(数字)。

如果您想要数字结果,请使用数字方法:

result = ...
    quadgk( @(x) line1(x) - line2(x), -1, xIntersection) + ...
    quadgk( @(x) line2(x) - line1(x), xIntersection, 1 );

result = ...
    quadgk(@(x) abs(line1(x) - line2(x)), -1, +1);

简称:)

我相信integral是新版MATLAB(&gt; R2010a)的首选功能,但我无法测试。

答案 1 :(得分:2)

我对此并不一致同意@Rody。一般来说:如果你有机会,为什么不能得到确切的结果。 如果它可以解决,至少你不需要太担心数值问题。

根据@thewaywewalk的建议,只需wrap the result with double