datasetPure = {
function incomeDistribution(nGroups) {
let data = []
let groupPopulation = populationTotal/nGroups
let groupIncomeMin = 1e-12, groupIncomeMax, groupIncomeMean
let groupTotalYearIncome = []
let f = function(groupIncomeMin, groupIncomeMax) {
return integral(populationWithIncome, groupIncomeMin, groupIncomeMax, 1) - groupPopulation
}
let dfdx = function(groupIncomeMax) {
return populationWithIncome(groupIncomeMax)
}
let delta0 = 10000
for (let i = 0; i < nGroups; i++) {
if (i < nGroups-1) {
groupIncomeMax = groupIncomeMin + delta0
let groupIncomeMaxPre = groupIncomeMax
let err = 100
let j = 0
while (err*err > 0.01) {
groupIncomeMax += -f(groupIncomeMin, groupIncomeMaxPre)/dfdx(groupIncomeMaxPre)
err = groupIncomeMax - groupIncomeMaxPre
groupIncomeMaxPre = groupIncomeMax
j++
if (j>15) {
groupIncomeMax = j + " iterations were not enough, last result: " + groupIncomeMax
groupIncomeMean = j + " iterations were not enough"
break
}
groupTotalYearIncome[i] = integral(incomeOfPopulationGroup, groupIncomeMin, groupIncomeMax, 1)*12
groupIncomeMean = groupTotalYearIncome[i]/12.0/groupPopulation
delta0 = groupIncomeMax - groupIncomeMin
}
} else {
groupTotalYearIncome[i] = incomeTotal
for (let j = 0; j < nGroups - 1; j++) {
groupTotalYearIncome[i] -= groupTotalYearIncome[j]
}
groupIncomeMean = groupTotalYearIncome[i]/12/groupPopulation
groupIncomeMax = 2*groupIncomeMean - groupIncomeMin
}
data.push({population: groupPopulation, incomeMin: groupIncomeMin, incomeMean: groupIncomeMean, incomeMax: groupIncomeMax, populationIncomeYear: groupTotalYearIncome[i]})
groupIncomeMin = groupIncomeMax
}
return data
}
return incomeDistribution
}