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 億回ループを実行する必要があります。ある時点でメモリが不足するか、単に時間がかかる場合があります。

より効率的な数値アルゴリズムを使用する必要があります。私が考えることができる最も簡単な方法は、二分法です: http://en.wikipedia.org/wiki/Bisection_method

妥当な開始点を選択する必要がありますが、解が区間外にある場合に開始点を変更する方法も追加する必要があります (または、アルゴリズムを中断し、不適切な入力に関する警告を出して終了します)。

于 2012-04-12T06:09:42.083 に答える