LINUX.ORG.RU

подгон результатов: помогите с алгоритмом


0

0

Здравствуйте. Передо мной регулярно встаёт задача по подгону результата некоторого вычисления к заранее известному ответу. Каждый раз приходится вручную подбирать коэффициенты, каждый раз заново. Может, кто-то поможет придумать алгоритм, чтоб его можно было использовать в скриптах, а то у меня не получается - не могу его зацепить, хоть и чувствую, что он есть.

Задача выглядит таким образом. Есть колонка с константами

const1 const2 const3 ... constN

константы с точностью до двух знаков, как и всё остальное. есть колонка с коэффициентами koeff1 koeff2 koeff3 ... koeffN коэффициенты типа заданы заранее, их нужно менять в некоторых (тоже вполне произвольных) пределах так, чтобы дальнейшие вычисления сошлись.

Следующая колонка - это произведение предыдущих mul1 = const1 * koef1 mul2 = const2 * koef2 ... mulN = constN * koefN

Вот сумма всех (округлённых до второго знака) mulM должна совпадать с заранее заданным числом.

Всё должно просчитываться на калькуляторе.

★★

Только на калькуляторе?

считаешь с произвольными коэфф, береш отношение нужного результат к полученному и умножаешь все коэффициенты на данное отношение

Freek
()
Ответ на: комментарий от Freek

> береш отношение нужного результат к полученному

получится что-то вроде 0.011

> умножаешь все коэффициенты на данное отношение

после умножения они округлятся до второго знака и см. 1 строку

> Только на калькуляторе?

нет, я это всё считаю, конечно, не на калькуляторе, но в конце результат расчёта будет проверяться именно на нём, с округлениями в уме :)

name_no ★★
() автор топика

M$ Excel, надстройка "Поиск решения". Возможно, есть в ОпенОфисе. Если хочется вручную -- надо посмотреть на методы оптимизации, типа градиентного спуска. Приблизительно на пальцах: фиксируешь все коэффициенты, вычисляешь результат. Потом меняешь каждый последовательно в некоторую заранее выбранную сторону. Смотришь, куда идет максимальное изменение целевой функции (которая сумма произведений), и в качестве нового пробного решения выбираешь то, которое наиболее сильно меняет целевую функцию в сторону результата. Повторяешь процедуру. В принципе, должно сойтись быстро, но вот округления могут испортить картину. И да, на калькуляторе задолбаешься считать, если чисел много.

decadent
()
Ответ на: комментарий от name_no

проблема в самом огруглении получается? Именно поэтому надо промежуточные расчеты выполнять с точностью на один значащий знак больше)

а теперь по делу, к тому что выше написал добавляешь

находишь delta(разница между полученным и исходным итоговым значением)

в следующей колонке записываешь отношения const1/delta, const2/delta....

смотришь какое из этих значений с наименьшей потерей округляется до двух знаков, ну и добовляешь это отношение к переменному коэффициенту из той же строки...

Freek
()

попробуй Генетические алгоритмы. Метод конечно мощный, но для твоего случая даже слишком мощный. Попробуй.

lsv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.