1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package com.nickokiss.investor.functioncalc;
22
23 import java.math.BigDecimal;
24
25 import com.nickokiss.investor.calc.MathCalc;
26 import com.nickokiss.investor.function.Function;
27 import com.nickokiss.investor.util.Range;
28 import com.nickokiss.investor.util.TkFinConstructionException;
29
30
31
32
33
34 public class IterativeFunctionCalc implements FunctionCalc {
35
36 private MathCalc mathCalc = new MathCalc();
37
38 @Override
39 public Range getParameterRange(BigDecimal expectedValue, Function function, BigDecimal maxSize, Range initialRange) throws TkFinConstructionException {
40 int steps = mathCalc.div(initialRange.getSize(), maxSize).intValue();
41 BigDecimal closestPar = initialRange.getStart();
42 BigDecimal smallestDiff = expectedValue.subtract(function.getValue(closestPar)).abs();
43 for (int i = 0; i <= steps; i++) {
44 BigDecimal addition = maxSize.multiply(new BigDecimal(i));
45 BigDecimal parameter = initialRange.getStart().add(addition);
46 BigDecimal result = function.getValue(parameter);
47 BigDecimal diff = expectedValue.subtract(result).abs();
48 if (diff.compareTo(smallestDiff) < 0) {
49 closestPar = parameter;
50 smallestDiff = diff;
51 }
52 }
53 BigDecimal half = mathCalc.div(maxSize, mathCalc.TWO);
54 Range resultRange = new Range(closestPar.subtract(half), closestPar.add(half));
55 return resultRange;
56 }
57
58 }