bisection method: Simulating a retirement fund
MRAB
python at mrabarnett.plus.com
Thu Sep 2 18:10:42 EDT 2010
On 02/09/2010 21:37, Baba wrote:
> level: beginner
>
> exercise source:
> http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/assignments/pset4.pdf
>
> Problem 4
>
> Can my code be optimised?
> I think my approach is correct but i am hesitant about the initial max
> value.
>
> def nestEgVariable(salary, save, preRetireGrowthRates):
> SavingsRecord = []
> fund = 0
> depositPerYear = salary * save * 0.01
> for i in preRetireGrowthRates:
> fund = fund * (1 + 0.01 * i) + depositPerYear
> SavingsRecord += [fund,]
> startingPot = SavingsRecord[-1]
> return startingPot
>
Why are you saving 'fund' in SavingsRecord if you're returning just the
last and discarding others? Basically you're returning the final value
of fund.
>
> def
> expenseCalculator(postRetireGrowthRates,fundsize,epsilon,yearsOfretirement ):
> low = 0
> high = fundsize
> guess = (low + high) /2
> while abs(guess * yearsOfretirement - fundsize)> epsilon:
> if guess * yearsOfretirement> fundsize :
> high = guess
> else: low = guess
> guess = (low + high) /2
> return guess
>
When performing this type of 'search' make sure that the interval (high
- low) reduces at every step. If, for example:
low + 1 == high
then:
guess == (low + (low + 1)) / 2 == (low * 2 + 1) / 2 == low
(integer division) and if the 'if' condition happens to be false then
the value of 'low' won't change for the next iteration, leading to an
infinite loop.
>
> def findMaxExpenses(salary,save,preRetireGrowthRates,
> postRetireGrowthRates,epsilon):
> yearsOfretirement = len(postRetireGrowthRates)
> fundsize = nestEgVariable(salary, save, preRetireGrowthRates)
> for growthRate in postRetireGrowthRates:
> expenses = expenseCalculator(postRetireGrowthRates,
>
> fundsize ,epsilon,yearsOfretirement )
> fundsize = (fundsize * (1 + 0.01 * growthRate)) - expenses
> print 'fundsize', fundsize
> print 'expenses', expenses
> yearsOfretirement -=1
> return fundsize
>
>
>
> findMaxExpenses(10000,10,[3, 4, 5, 0, 3],[10, 5, 0, 5, 1],0.01)
>
More information about the Python-list
mailing list