do-whileループで以前の反復の変数を使用して、現在の反復で計算を行い、ループの最後に収束テストに使用しようとしています。ここで do-whileループで変数が変わるのはなぜですか?
コード(Javaの):私は、ループの最初に前回の反復からT0 = T2を設定しようとしてるint z = 0;
do {
T0 = T2;
for (int j = 0; j < K; j++) {
for (int i = N - 1; i >= 0; i--) {
if (i == 0) {
T1[i][j] = T0[i + 1][j] + C[i]; // When x=0, c=0
}
if (i > 0 && i < N - 1) {
T1[i][j] = T0[i + 1][j] + T0[i - 1][j]
+ C[i];
}
if (i == N - 1) {
T1[i][j] = T0[i - 1][j] + C[i]; // When x=W, b=0
}
}
}
for (int i = 0; i < N; i++) {
for (int j = K - 1; j >= 0; j--) {
if (j == 0) {
T2[i][j] = T1[i][j + 1] + C[j]; // When y=0, c=0
}
if (j > 0 && j < K - 1) {
T2[i][j] = T1[i][j + 1] + T1[i][j - 1]
+ C[j];
}
if (j == K - 1) {
T2[i][j] = 273.15;
}
}
}
z++;
} while (z < 5);
、およびT0は、現在の反復からT2と比較されますコンバージェンステストのためのループの終わりに(ここには含まれていません)。ループの開始時に、T0は実際には以前の反復からのT2に等しい。しかし、ループの最後では、T0は現在の反復からのT2に等しい。 それでは、反復の中でループの始めから終わりまでT0を変更しないようにするにはどうしたらいいですか? 私はJavaを使い慣れていません。どんなヘルプやコメントもありがとうございます!
更新日: クイックフィードバックをいただきありがとうございます。 System.arraycopy()とarray.clone()の両方が1D配列の仕事をしているようです。私は何かが欠けているかもしれませんが、2D行列をコピーするのはちょっと難しいようですね。しかし、私の目的のために、これも働いていた:
for (int i=0; i<N;i++) {
for (int j=0; j<K;j++) {
T0[i][j]=T2[i][j];
}
}
「T0」と「T2」はどのように宣言されていますか? Javaでは、代入だけで配列全体をコピーすることはできません: 'T0 = T2'。これは配列へ* reference *を別の変数にコピーするだけです。したがって、 'T0'のデータを変更すると、' T2'のデータが変更されます。あなたは本当のコピーをする必要があります。参考までに、たとえば、[Make Javaのコピーを作成する](https://stackoverflow.com/questions/5785745/make-copy-of-array-java)を参照してください。ちょうど "Javaのコピーアレイ"で検索してください。 – lurker
こんにちは。できるだけコードから削除してください。ここでは[mcve]に感謝します。あなたのコードには何十もの変数があります。あなたが話していることをどうやって知っているでしょうか? –
私は問題をデバッグするための努力がないように見えるので、この質問をdownvotingしています。コードにprintステートメントを追加して、各ポイントで変数が保持する内容を表示したり、デバッガを使用してプログラムの一部をトレースしたり、紙面上のロジックをトレースするだけで、問題を段階的に処理してください。物事が変わったときにあなたが期待していることを見て、それを見つけたら「なぜT0 [2]を変えるとT2 [2]が同時に変わるのですか? (その答えは、任意のJavaチュートリアルや多くの既存のSOの質問に記載されていますが) –