単純な振り子をシミュレートするための有限差分法を使用して、物理プロジェクトのモデリング クラスを実装しようとしています。このクラスを可能な限りジェネリックにして、メソッドの反復ごとに値を使ってやりたいことを何でもできるようにしたいと考えています。このため、必要に応じてメソッドを停止するためにも使用できるコールバック ブロックをメソッドに与えました。
たとえば、オイラー メソッドのループは次のようになります。
for (NSInteger i = 0; i < n; i++) {
if (callBack) {
if(!callBack(NO, currentTheta, currentThetaDot, currentT, (CGFloat)i/n)) break;
}
currentTheta += self.dt*f_single_theta(currentThetaDot);
currentThetaDot += self.dt*f_single_thetaDot(currentTheta, currentThetaDot, gamma);
currentT += self.dt;
}
そしてcallBackブロックでコードを実行します
^BOOL (BOOL complete, double theta, double thetaDot, CGFloat timeElapsed, CGFloat percentComplete){
eulerT = [eulerT stringByAppendingFormat:@"%.8f\n",timeElapsed];
eulerTheta = [eulerTheta stringByAppendingFormat:@"%.8f\n",theta];
if ((currentThetaDot*currentThetaDot + cos(currentTheta)) > 0.5) {
return 0; // stops running if total E > 0.5
}
return 1;
}];
eulerT と eulerTheta は、後でファイルに保存する文字列です。このコールバック メソッドを使用すると、すぐに大量のメモリが蓄積されます。n が 10,000 のオーダーであっても、約 1Gb の RAM が使用されます。ブロックの呼び出しをコメントアウトするとすぐに、これはすぐにcallBack
削除されます。とにかく、大規模なメモリの問題なしにこの優れた機能を維持できるでしょうか?