4

これが私のコードの一部です。残りは単なる関数定義です。プレートの温度を記録する 20 x 20 の配列があります。配列内のセルが 0.1 度を超えて変化しなくなるまでループを繰り返す必要があります (反復ごとに値を更新します) 反復を停止するタイミングを決定するために、配列内の任意のセルの最大の変化をどのように監視しますか? 今、これを試してみましたが、正しく出力されません。現在のものと比較するために以前のものを誤って定義しているためだと思います。

while (true)
{
    bool update = false;
    for (int a = 1; a < array_size -1; a++)
    {
        for (int b = 1; b < array_size -1; b++)
        {             
            hot_plate[a][b] = sum_cell(hot_plate, a, b);

        }
    } 

    for (int a = 1; a < array_size-1; a++)
    {
        for (int b = 1; b < array_size-1; b++)
        {
            hot_plate_next[a][b]=sum_cell(hot_plate_next, a,b);
            if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
            {
                update = true;
            }
            hot_plate_next[a][b] = hot_plate[a][b];
            cout << hot_plate[a][b] << " ";
        }  
    }

    if (!update) {
        break;
    }
}
4

2 に答える 2

1

update問題は、セルの変更が小さいときに上書きすることです。その場合、変化が小さいセルは反復を停止します。

次のようにループを構成します。

float largest_change = 0.0f;
do {
    largest_change = 0.0f;

    for (...) {
        float new_value = ...
        float change = abs(new_value - hot_plate[a][b]);
        if (change > largest_change)
            largest_change = change;
        hot_plate[a][b] = change;
    }
} while (largestChange > 0.1f);
于 2012-10-18T15:01:47.843 に答える
1

あなたが置くとき:

        if (abs(hot_plate_next[a][b] - hot_plate[a][b]) < 0.1)
        {
            update = false;
        }

2 番目のネストされた for ループ内で、必要なすべてのセルではなく、いずれかのセルの現在のチェックと以前のチェックの差が 0.1 未満の場合、「更新」を false に設定しています。

次のようにコードを更新します。

    bool update = false;

    if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
    {
        update = true;
    }

(私は >= を入れたでしょうが、「配列内のセルが 0.1 度以上変化しないまで」と言いました)

要求に従って編集します: マトリックスをきれいに出力するには、次の行を追加します。

 cout << "\n";

ここ:

for (int a = 1; a < array_size-1; a++)
{
    for (int b = 1; b < array_size-1; b++)
    {
        hot_plate_next[a][b]=sum_cell(hot_plate_next, a,b);
        if (abs(hot_plate_next[a][b] - hot_plate[a][b]) > 0.1)
        {
            update = true;
        }
        hot_plate_next[a][b] = hot_plate[a][b];
        cout << hot_plate[a][b] << " ";
    }  
    cout << "\n"; // Add this line
}
于 2012-10-18T14:58:39.850 に答える