for (i = N - 1; i >= 0; i--) {
a[i][N] /= a[i][i];
for (j = i + 1; j < N; j++)
a[i][N] -= a[i][j] * a[j][N] / a[i][i];
}
のプログラムを
for (i = N - 1; i >= 0; i--) {
d = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++)
a[i][N] = d- a[i][j] * a[j][N] / a[i][i];
}
と a[i][N]をdと置き換えたところ、計算結果の異なりました。
何故なのでしょうか?
理由を詳しく説明して頂けると大変有り難いです。
また、どうしたらdに置き換えたとしても正しい計算が行えるのかを詳しく説明して頂けると有り難いです。
どうかよろしくお願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
for (i = N - 1; i >= 0; i--) {
d = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++)
a[i][N] = d- a[i][j] * a[j][N] / a[i][i];
}
ではなくて
for (i = N - 1; i >= 0; i--) {
d = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N] / a[i][i];
a[i][N]=d;
}
この計算順だと、dを使う意味無いですけどね。
ひょっとして -= 演算子の意味がわかってない?
No.4
- 回答日時:
#3です。
>1回週のdで固定してしまったため、
一回週のdにはi=2のが入りそのままとなったので、2週目のdにも1週目と同じdが入る。なので、間違った計算になるという事でしょうか?
i=2とは限りませんが上記の理解でよい。
No.3
- 回答日時:
内側のループの1回目終了後ではa[i][N]の値は同じ値になります。
なぜならループ内の式を実行する前の段階で上のコードでのa[i][N]と下のコードでのdの値が等しいので式の値は一致します。
ただし、2回目以降は異なります。
なぜなら2回目にループに入る直線の段階で上のコードでのa[i][N]と下のコードでのdの値は異なるため式が同じ値にならないのです。
dの値を変える式は存在しないため、何回目のループであろうともdの値は変化しません。
下の式をあえてdを使うコードに替えるには二通りの方法があります。
1.内側のループの最後に次の式を追加する。
d = a[i][N];
2.dをポインタとして定義してdの示すアドレスをa[i][N]のアドレスにしてしまう。
dをポインタとして宣言(たとえば int *d;)して、最初のループの頭に
d = &a[i][N];
としてポインタ変数dにa[i][N]のアドレスを代入します。そうすると以降*dはa[i][N]の値を返すようになります。
以降の式はdを*dに置き換えれば意図したように動くはずです。
1回週のdで固定してしまったため、
一回週のdにはi=2のが入りそのままとなったので、2週目のdにも1週目と同じdが入る。なので、間違った計算になるという事でしょうか?
No.2
- 回答日時:
No.1です。
お礼の文章ですが、適度な改行や空行を入れて、他の人が読みやすいかどうかを気にしていただけますと嬉しいです。
閑話休題
> dではなく、なぜa[i][N]だと正しく代入され、置き換えたdでは正しく代入されないのでしょうか?
a[i][N] = d- a[i][j] * a[j][N] / a[i][i]
において質問者様は、置き換えたdのことばかり気にされているようです。
問題はdではなく、a[j][N]の値にあることをNo.1で回答しました。
もう一度、時間をかけてよく読んで内容を理解してください。
また、aの配列の値について二次元の表を紙(やエクセル)に書いて、dを使用した場合と使用しない場合で、二重のforループでの表中の各値がどのように変化していくかを手(電卓)計算すれば、より理解が深まると思います。
だとしたら、元のプログラム
for (i = N - 1; i >= 0; i--) {
d = a[i][N];
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
a[i][N] = d / a[i][i];
}
はdを使っていますが、なぜdが1週目で固定されないのでしょうか?
最後にa[i][N] = d / a[i][i];があるためですか?
No.1
- 回答日時:
Nは定数と仮定して。
外側のforでi=1の時を考えます。
a[1][N] /= a[1][1];
↓
d = a[1][N]/ a[1][1];
と変更したので
この行が実行された段階でa[1][N]には正しい値が代入されておりません。
次に外側のforでi=0のループに変わります。
このとき内側のforの最初のループではj=i+1(=1)となるので。
内側のforの中にある式は
a[0][N] = d- a[0][1] * a[1][N] / a[0][0];
となりますが、式の中のa[1][N]には正しい値が入っていないので
結果、a[0][N]にも正しい計算結果が代入されないことになります。
ここまでi=1の場合で考えましたが、当然iが他の値でも同じことが起こります。
> また、どうしたらdに置き換えたとしても正しい計算が行えるのか
d = a[i][N]/ a[i][i];
↓
d = a[i][N]/ a[i][i];
a[i][N] = d;
とするとか?
(詳しくみてないので、これでもダメかもしれません)
わかりやすい解答ありがとうございます。あのd = a[i][N]/ a[i][i]においてdとおきました。そしてa[i][N] = d- a[i][j] * a[j][N] / a[i][i]にd = a[i][N]/ a[i][i]を代入しようとa[i][N] = d- a[i][j] * a[j][N] / a[i][i]にdをつけたのですが、これではa[i][N] = d- a[i][j] * a[j][N] / a[i][i]のdにd = a[i][N]/ a[i][i]は代入されないのでしょうか?
dではなく、なぜa[i][N]だと正しく代入され、置き換えたdでは正しく代入されないのでしょうか?
どうかよろしくお願い致します。
二次元配列などと関係あるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- OCNモバイルONE OCN光&OCNモバイルONEのセット200円割引について 3 2022/11/06 17:09
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Ruby VBA 2 2023/01/14 14:14
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- 英語 現在完了の「継続」ではなく「経験」の期間を表す前置詞について 2 2022/05/06 11:39
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- 英語 方向を表すforとtoについて この2点の違いについてですが、例えばThe train is bou 5 2023/01/21 00:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
DoEventsが必要な理由について
-
GIFアニメをループさせたくない
-
vba
-
アクティブセルから、A列最終行...
-
VBA Dir関数でファイルをループ...
-
流れ図(フローチャート)が分か...
-
DOSコマンドのループ内のTIMEコ...
-
Application.OnTime の使い方
-
ループフリー
-
VBA for文が止まらない
-
vb.netからエクセル関数書き込み
-
csh foreachで「*」でエラ...
-
一巡伝達関数と開ループ伝達関数
-
VBA for i=1 to lastrow
-
VB.NETで素因数分解のプログラ...
-
ループ内での条件処理
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
DOSコマンドのループ内のTIMEコ...
-
ListBox 複数選択 で オートフ...
-
vbscriptでIE自動入力(途中で...
-
vb.netからエクセル関数書き込み
-
DoEventsが必要な理由について
-
Java 南京錠
-
アクティブセルから、A列最終行...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VBA Dir関数でファイルをループ...
おすすめ情報