Здравствуйте. Исходя из этой темы поменял известные значения. Известны Количество месяцев, План продаж, Исходные значения и Сезонность. Необходимо найти значения прироста.
Что то ничего лучше чем методом "подбора" не пришло от 0,001 до 2,000 с точностью до третьего знака =ПОИСКПОЗ(1;ОКРУГЛ(МУМНОЖ(ПОСЛЕД(;F$2)^0;(ПОСЛЕД(;2000)*0,1%)^ПОСЛЕД(F$2)*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(6;СМЕЩ(F15;;;;ПОСЛЕД(F$2)))/E6*B6);3))*0,1%
Возможно ли найти значение прироста, исключив сезонность? Известны Количество месяцев, План продаж и Исходные значения. Необходимо найти точные значения прироста Желательно формулами или PQ.
let // точность расчета и стартовая точка start = 1, prec = 0.005, // грузим списки load = (name) => Excel.CurrentWorkbook(){[Name = name]}[Content], plan = List.Buffer(load("план")[Column1]), first = List.Buffer(load("исходные")[Column1]), mult = List.Buffer(Table.ToRows(load("сезонность"))), lst = List.Positions(plan), num = List.Count(mult{0}), // calculator calc = (p, f, m, guess) => [guess = guess, plan = f * List.Sum( List.Generate( () => [i = 0, v = m{0} * guess], (x) => x[i] < num, (x) => [i = x[i] + 1, v = x[v] * m{i} * guess], (x) => x[v]) ), diff = p - plan, compare = if Number.Abs(diff) < prec then 0 else Value.Compare(p, plan)],
// рекурсия fx = (s as record, c as record, idx as number) => [found = c[compare] = 0, first_steps = not Record.HasFields(s, "guess") or s[compare] = c[compare], find_cross = calc(plan{idx}, first{idx}, mult{idx}, if c[compare] < 0 then c[guess] / 2 else c[guess] * 2), mid = calc(plan{idx}, first{idx}, mult{idx}, (s[guess] + c[guess]) / 2), left_or_right = if mid[compare] = s[compare] then c else s, finale = if found then c else @fx( if first_steps then c else left_or_right, if first_steps then find_cross else mid, idx )][finale],
x = List.Transform(lst, (i) => fx([], calc(plan{i}, first{i}, mult{i}, start), i)[guess]) in x
сезонность можно исключить, присвоив ей значения = 1, если я правильно понимаю.