【问题标题】:Definite Integral Matlab定积分 Matlab
【发布时间】:2013-09-11 07:01:27
【问题描述】:

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

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

我正在使用Matlab's 函数int(),这里是我的代码的sn-p:

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. 知道可能存在漏洞吗?

【问题讨论】:

  • 我没有符号数学工具箱,但你不能用double(x)转换你的结果吗?

标签: matlab function math linear-algebra integrate


【解决方案1】:

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

然而,主要问题是您使用的是 symbolic 表达式。这意味着 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) 中的首选函数,但我无法对此进行测试。

【讨论】:

    【解决方案2】:

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

    按照@thewaywewalk 的建议,只需 wrap the result with double

    【讨论】:

    • 我想我会尝试两者并检查有什么区别。谢谢你的建议
    • 预测:结果的差异不会超过 1e-14。符号的速度将比数字的慢 10 倍。
    • @RodyOldenhuis - 这是正确的,这就是我接受你的答案的原因! ;D
    猜你喜欢
    • 2018-03-25
    • 2018-11-12
    • 2014-09-06
    • 2023-03-08
    • 2012-04-25
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多