2

私はプロジェクトに取り組んでおり、Matlab2 つの線の間の領域を見つける必要があります ((xIntersection,yIntersection)間隔 [-1,+1] の点で交差しています。したがって、2 つの線を減算して [-1, xIntersection ] と [xIntersection, +1] は、結果を合計し、負の場合は符号を変更します。

2 つの線の交点を見つける方法の詳細については、このリンクを確認してください。

私は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

2 つの曲線の間の面積は、「上の曲線」と「下の曲線」の差の積分に等しいため、2 番目の被積分関数の符号が正しくありません。

ただし、主な問題は、シンボリック式を使用していることです。つまり、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);

略して:)

integralMATLAB の新しいバージョン (> R2010a) で選択されている機能だと思いますが、これをテストすることはできません。

于 2013-09-11T07:19:13.103 に答える
2

これについて@Rodyに必ずしも同意するわけではありません。一般に、機会があれば、正確な結果を得てみませんか。それが解けるなら、少なくとも数値の問題はあまり気にしなくていいです。

@thewaywewalkの提案に従って、結果をラップするだけです。double

于 2013-09-11T16:57:29.600 に答える