279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
1 | |
Алгоритм расчета целых чисел29.06.2015, 21:18. Показов 2307. Ответов 31
Метки нет (Все метки)
Привет всем. Имеется матрица. Сумма всех членов в этой матрице равна К. Необходимо вычислить значение каждого члена матрицы так, чтобы сумма была равна целому числу Т и при этом каждый член матрицы тоже был целым числом, минимально отличающимся от исходного значения.
Если бы не было условия целости новых значений членов матрицы, то для вычисления этих значений нужно было бы применить формулу: Однако при этом члены матрицы получаются не целыми числами. Как сделать расчет (если это вообще возможно), чтобы члены матрицы были целыми числами? P.S. Изначально члены матрицы не целые числа.
0
|
29.06.2015, 21:18 | |
Ответы с готовыми решениями:
31
Алгоритм умножения целых чисел Алгоритм поиска целых простых чисел Алгоритм расчета рейтинга Алгоритм расчета количества дней |
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
|
|
06.07.2015, 11:11 | 21 |
1) Округляем по-бухгалтерски, в ближайшую сторону
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
06.07.2015, 16:56 | 22 |
Дано: { 6.42, 11.47, 1.83, 80.28 }, сумма 100
1. Округляем в ближайшую сторону. { 6, 11, 2, 80 } 2. Проверяем сумму. Сумма 99 2.а. Если сумма совпадает, то готово - выходим. 3. Вычисляем знак разницы dif = +1 // может быть +1 или -1 Наш критерий: Минимизировать f(n,d) = [(n - d)/d]^2; 4. Пробуем изменить на dif каждое из чисел, и смотрим, как изменится "ошибка": f(n+dif, d) - f(n, d) Находим такое число, для которого ошибка изменится меньше всего. Изменяем найденное число на dif. 5. Повторяем пункт 4, пока суммы на станет равна заданной. Добавлено через 14 минут Igor3D, Упс! Не видел Вашего сообщения, когда писал своё...
0
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
08.07.2015, 20:16 [ТС] | 23 |
А если у меня большая матрица и delta получилась, например, 50. При этом еще получилось так, что у какого-то члена матрицы фактор ошибки равен 0. По Вашему алгоритму я должен к этому члену прибавить 50...
Наверное Вы ошиблись (не в упрек Вам). Я понимаю так, что к этому числу надо прибавить 1, уменьшить на 1 delta и пересчитать фактор ошибки. Если delta не равно 0, то снова находим самый наименьший фактор и т. д. Верно? Пока писал сообщение, возник следующий вопрос. Мы округляем "по-бухгалтерски". В результате может получится так, что сумма членов округленной матрицы будет больше, чем требуемая сумма. Тогда delta, соответственно, будет отрицательна. В этом случае, как я понимаю, так же ищем минимальный фактор ошибки, но член матрицы увеличиваем не на 1, а на -1, то есть уменьшаем его, а delta увеличиваем на 1. Правильно я думаю? Добавлено через 4 минуты А так понимаю, что здесь та же ошибка, что и в сообщении от Igor3D, То есть, надо менять число не на dif, а на 1 (или -1). P.S. Чего то одна и та же ошибка у разных людей... Может я не прав?.. Или эти люди просто применительно к моей задаче писали алгоритм, а я рассуждаю в общем случае.
0
|
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
|
|
09.07.2015, 10:46 | 24 |
Никто такого не предлагал, см выше
Т.е. delta или +1 или -1. Иначе зачем нам цикл, прибавили бы 50, и все. См также И факторы ошибок всегда ненулевые. Поэтому возможно какой-то эл-т округлился идеально, но именно его надо менять. А поиск ошибок - дело хорошее, но начинать надо с себя
1
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
09.07.2015, 11:53 [ТС] | 25 |
Igor3D, извините, только что понял. Просто в моем примере сумма была 99, а надо 100. Вот я и подумал, что delta находили разницей между требуемой суммой и той, что есть. Я прошу прощения, конечно, и не пытаюсь искать ошибки. Я пытаюсь понять принцип.
Спасибо всем за помощь. Буду реализовывать в программе.
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
09.07.2015, 17:01 | 26 |
Фактор ошибки может быть равен нулю.
Условие: Дробная часть числа ровно 0.5 и дельта имеет "нужный" знак (+1, если число было округлено вниз, и наоборот). Элементы с нулевым фактором идеально подходят для "переокругления".
1
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
09.07.2015, 20:02 [ТС] | 27 |
Реализовал алгоритм на VBA в Exсel. Начал пробовать округлять. И сразу же возникли вопросы по 2-м ньюансам.
1. При нахождении округленного значения с минимальным фактором ошибки может возникнуть такой случай, когда в матрице будет 2 и больше членов, для которых фактор ошибки абсолютно одинаков. Как мне кажется, в таком случае необходимо из всех членов с одинаковым фактором ошибки (и одновременно самым малым из всех остальных членов матрицы) выбрать тот, который имеет самое большое по модулю значение, так как его увеличение (уменьшение) на 1 в процентном отношении будет самым малым. Если же будет несколько членов еще и с одинаковым значением, то можно выбрать любой из них. 2. В исходной матрице могут быть члены со значением равным 0. Для них вычислить фактор ошибки нельзя, ибо делить на 0 нельзя. Как я думаю, данные члены матрицы не должны участвовать в "подгонке" значений. Подскажите, я правильно решил данные особенности?
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
09.07.2015, 21:31 | 28 |
2. Нули не трогаем. Для них фактор ошибки - бесконечность.
1. Любой. Изменяем на 1 мы не начальное число, а округлённое, которое само отличается от начального. Например. Мы округлили 10.4 до 10. Теперь мы изменяем 10 на 11. Раньше у нас число отличалось на 0.4, теперь будет отличаться на 0.6. Разница 0.2 всего, а не 1.
0
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
10.07.2015, 08:00 [ТС] | 29 |
По второму вопросу все ясно. По первому остались вопросы (прошу прощения за тавтологию).
Я понимаю, что мы изменяем не начальное число, а уже округленное, то есть уже измененное. Но ведь в начальной матрице наряду с дробными числами могут быть целые. После округления членов такой матрицы, эти ее изначально целые числа останутся без изменений. Соответственно, фактор ошибки для них будет 0. И тут вопрос: какой из членов матрицы с фактором ошибки 0 нужно изменять? Shamil1, может я не понял Вас, но вы говорите, что любой такой член можно изменить. А ведь такими членами могут быть числа 1 и 100. Как мне кажется, логичнее и правильно изменить число 100, так как это изменит его на 1%, в то время как изменение числа 1 изменит его на 100%.
0
|
Модератор
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
|
|
10.07.2015, 08:13 | 30 |
Нет. Фактор ошибки для них будет большой. Для одинаковых по модулю числе фактор ошибки зависит от близости числа к "середине". Подставьте в формулу 5.5 и 5.0 и посчитайте вручную на листочке, чтобы Вам стало понятней.
0
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
10.07.2015, 08:59 [ТС] | 31 |
Почему для них фактор ошибки большой? Был член начальной матрицы А = 5. После округления он не изменился: B = 5. Находим фактор ошибки: F = ((A - B) / A)^2 = ((5 - 5) / 5)^2 = 0.
0
|
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
|
|
10.07.2015, 09:49 | 32 |
Это "сама ошибка", а "фактор" - это насколько она изменится если подгонять число, для "идеально округленных" он самый большой и выходит.
Об этом уже не раз говорилось выше, с примерами, будьте внимательны и не злоупотребляйте доверием отвечающих. Вообще здесь всех делов на полчаса, пыхтение и обширная дискуссия ни к чему. Умолкаю.
1
|
10.07.2015, 09:49 | |
10.07.2015, 09:49 | |
Помогаю со студенческими работами здесь
32
Программа расчета квадрата двух целых чисел Написать программу расчета квадрата двух целых чисел Составьте программу, которая содержит оператор while, для расчета суммы целых чисел в диапазоне от а до b Алгоритм обработки целых чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |