0

私は混合整数計画法を解くためにmatlabを使用しています.linprogから解を取得した後、それらがすべて整数(xはn次元)であるかどうかを評価したいのですが、これを行う方法がわかりません.

mod(x,1) == 0などのすべての関数はisequal(x,floor(x))、間違った答えを返します。

さらに奇妙なのは、同じパラメーターを使用して手動でベクトルを入力すると、正しいことが判明することです。

結果が表示されます: (ここの x はすべて linprog の結果から取得されます)。誰でもこれを手伝ったり、これを評価するための他の便利な方法を提供したりできますか?

K>> x

x =

    7.0000
    1.0000

K>> mod(x,1)

ans =

    0.0000
    1.0000

K>> x

x =

    6.0000
    3.0000

K>> isequal(x,floor(x))

ans =
    0
4

1 に答える 1

2

linprog からの整数 1 のように見えるものは、実際には 1 に非常に近い浮動小数点数ですが、等しくはありません。MATLAB で数値を出力しても、(既定では) 違いがわからないだけです。浮動小数点値の比較に関するこの質問を参照してください。また、数値の表示形式については、MATLAB のマニュアル ページを参照してください。

既定では、MATLAB は以下を使用して数値を表示しますformat short

format浮動小数点数値の表示をデフォルトの表示形式 (短固定 10 進形式) に設定します。この形式は、5 桁のスケーリングされた固定小数点値を表示します。

したがって、1 – 1e–10は1と等しくなくても 1と表示されます。同様に、実際には であっても 1と表示されます。mod(1 – 1e–10, 1)1 – 1e–10

表示された表現に手動で設定xすると、重要度の低い桁がすべて切り捨てられ、「奇妙なことに」期待どおりの結果が得られます。

xコマンド入力後に確認してくださいformat long

于 2013-02-04T20:01:13.880 に答える