我正在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
这使我无法使用集成结果进行进一步操作。
答案 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
。