1

我正在尝试构建一种 在用户点击按钮时计算内部收益率http://www.investopedia.com/articles/07/internal_rate_return.asp#axzz1rm5UPp8V的方法。现金流已经存储在称为“cashFlows”的 NSMutableArray 中。现在在数组中,如果我的值为 -100、100、100、100,利率为 10%,它工作正常。但是当我有 -5、100、100、100 的值时,程序崩溃和/或冻结。

我似乎无法弄清楚这一点。我想知道该方法是否计算量太大,以至于我的计算机无法处理,因为该程序可能会循环数百万次。也许有更好的方法来做到这一点?

-(IBAction) calculateIRR{
double NPV;

double rate = 0.1;
int period = 1;
double tempPV = 0;
int count = 0;

do{
    NPV = 0;
    period = 1;
    for (int i=0; i < [cashFlows count]; i++) {
        double amount = ([[cashFlows objectAtIndex:i] doubleValue]);
        if(i == 0){
            NPV = amount;
        } else{
            tempPV = (amount/pow(1+rate,period));
            NPV = tempPV + NPV;
            period++;
        }
    }
    rate = rate + 0.0000001;
    count++;
} while(NPV > 0);

answer.text = [[NSString alloc]  initWithFormat:@"%.4f %%", rate * 100];
}
4

1 回答 1

2

输入值为 -5、100、100、100 时,IRR 为 2000%。你的算法必须循环运行 200 亿次!也许在某些时候你的内存用完了,或者只是需要很多时间。

您应该使用一些更有效的数值算法。我能想到的最简单的是 Bisection 方法:http ://en.wikipedia.org/wiki/Bisection_method

您必须选择合理的起点,但如果解决方案位于区间之外(或中断算法并退出并发出有关不合适输入的警告),还必须添加一种修改起点的方法。

于 2012-04-12T06:09:42.083 回答