我正在尝试使用有限差分方法为物理项目实现一个建模类,以模拟一个简单的钟摆。我希望能够使这个类尽可能通用,这样我就可以对方法的每次迭代中的值做任何我想做的事情。出于这个原因,我给了我的方法回调块,如果我们愿意,它也可以用来停止方法。
例如,我的 Euler 方法循环如下所示:
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;
}
在回调块中我运行代码
^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
块,它就会立即下降。无论如何,我可以在没有大量内存问题的情况下保留这个不错的功能吗?