2

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

有关如何找到两条线的交点的详细信息,请查看此链接

我正在使用Matlab'sfunction 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. 知道可能的漏洞吗?
4

2 回答 2

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(> R2010a)中的首选功能,但我无法对此进行测试。

于 2013-09-11T07:19:13.103 回答
2

在这一点上,我不一定同意@Rody。一般来说:如果你有机会,为什么不得到确切的结果。如果能解决,至少不用太担心数值问题。

只需按照@thewaywewalk 的建议将结果包装起来。double

于 2013-09-11T16:57:29.600 回答