у=0,0009х^2+3.4519х+38,3[b][u]6[/u][/b]7 |
МИН() норм экономит, забираю :-) y=?(X>28,МИН(256,Окр(2,535*(x-29))+110+X),0); а где на 1Се функция Гены? |
36-Блондинка в шок > Шикарное решение! Но у Зеленого короче. А он еще один символ выкроил :) Как ты пришла к квадратному уравнению? |
[quote=Зелёный тролль;44242264]а где на 1Се функция Гены? [/quote] Перевод с С1 на 1С Ф-ция от Гены У=?(Г>61,256,?(Г>44,цел(3.52*Г+37.85),?(Г>29,цел(3.5*Г+38),0))); Модернизированная У=Мин(256,?(Г>44,цел(3.52*Г+37.85),?(Г>29,цел(3.5*Г+38),0))); |
38-Шухер > ну ясно же, это была просто функция основного ряда уточняю коэффициенты - Y=ОКР(МИН(256,?(X>28,0.0009*X*X+3.452*X+38.36,0))); |
45-Блондинка в шок > то есть изначально функция закладывалась как квадратное уравнение, а потом коэффициенты подбирались? |
[quote=Шухер;44242266]Как ты пришла к квадратному уравнению?[/quote] "апроксимация", сэр :) пришлось вспомнить институт. коэффициенты не подбирались, а решались. система уравнений. |
[quote=Блондинка в шок;44242285]уточняю коэффициенты - [/quote] Принято, считает правильно. Это самое красивое решение, на мой взгляд, из всех виденных. |
[quote=Зелёный тролль;44242301]то есть изначально функция закладывалась как квадратное уравнение[/quote] Я подозревал что-то такое. Смотрел, на графике прямая линия с изломом, не парабола, подумал - обычное линейное уравнение с заскоками. Надо проверить твою формулу в другом диапазоне. Независимо от результата, мои симпатии остаются за твоим решением, высший пилотаж. |
"апроксимация", сэр :) Только по моему это не аппроксимация, а интерполяция ) Аппроксимация - это приближение по минимуму критерия отклонения, например среднеквадратичного ) |
50-USSR >апроксимация, интерполяция.. как хочу, так и делаю например, вот так: У=ОКР(?(X>28,МИН(256,3.5352*Х+36.46),0)); |
51-Блондинка в шок > Фантастика! Работает, даром что не аппрокси.. , как его там по научному-то ? Шухер в шоке - 42 буква вся формула. |
[quote=Блондинка в шок;44242526]+36.46[/quote] Ты не на градуснике высчитывала формулу? :) |
Зеленый, твою формулу посокращать бы можно (2.5345*(х-29))+110 -> 2.5345*х - 2.5345*29 - 110 не проверял, может поплывет из за округления |
Математика, это вам не русский и литература, где могут быть разночтения. :) Математика - это как в шахматах, мат на доске означает безусловную победу, без всяких "НО". Мат, сэр! |
51-Блондинка в шок > скорее всего не сработают дробные до копеек... придётся скорее всего задать сначала: Х=ЦЕЛ(X+0.999); |
56-Гена >Гена, так это ж вроде обсудили и утвердили: [quote=Гена;44237595]можно сначала определить в ячейке B1 =ОКРУГЛВВЕРХ(A1;0)[/quote] [quote=Шухер;44238364]Принимается округление вверх в другой ячейке.[/quote] я исходила из этого и никаких больше [quote=Гена;44242836]Х=ЦЕЛ(X+0.999);[/quote] не подразумевала. [quote=Шухер;44242626]Шухер в шоке - 42 буква вся формула.[/quote] А я насчитала 41 вместе с последней точкой с запятой. |
57-Блондинка в шок > Нет уж. Надо всё считать, потому что у ЗТ два раза иксы используются кроме X>28, где не требуется округление, а у Вас только в ОДНОМ месте, поэтому у Вас пойдёт выигрыш ещё в три знака "Х=" и ";". Окончательно: [b]У=ОКР(?(X>28,МИН(256,3.5352*ЦЕЛ(Х+0.99)+36.46),0));[/b] |
58-Гена >[quote=Гена;44243073]Нет уж. Надо всё считать,[/quote] Вот именно - нет уж. Читаем сабж: 1. Имеется таблица. 2. По таблице построить функцию. 3. Точка. Возьми экселевский файлик из задания (точнее из поста (1). Подставь мою формулу из (51) (прямо в ту табличку эксель) и проверь. Никаких Х=ЦЕЛ(X+0.999) не требуется. Поэтому я не буду настаивать, чтобы ЗТ тоже округлял Х непосредственно в формуле. А то так действительно у меня еще больше выигрыш получится. |
В посте #12 автор уточнил, что рассматривает и копейки. |
60-Гена > Но с другой стороны ты прав. Если формально соблюдать требование, что не должно быть никаких дополнительных операторов, даже через";", И если сделать предположение, что речь идет именно о рублях и копейках (т.е. два знака после запятой), то принимаю твою окончательную поправку: [b]У=ОКР(?(X>28,МИН(256,3.5352*ЦЕЛ(Х+0.99)+36.46),0));[/b] И при этом никаких "[em]дополнительных округлений вверх в отдельной ячейке[/em]" не требуется. |
Когда 1Снику делать нечего, он... нет, не дотягивается. |
54-Шухер > конечно можно )) всё ж таки два X в формуле первой степени )) попробую ещё что-нить альтернативное подумать |
Еще порция на вентилятор: только Зелёный тролль выстроил свою формулу в (42) как [b]программист[/b], а остальные "рекордисты" - как не знаю кто... математики, наверное? И вот почему: и в (58), и в (61) при значениях Х [b]вне[/b] диапазона 29...62 округлению будут подвергнуты либо 0, либо 256, которые заданы явно и в этом округлении ничуть не нуждаются. Да, приведение формул к "программистскому" виду не сократит (но и не увеличит!) их длину, а выполняться они будут немножко оптимальнее. И вообще не факт, что самая короткая формула будет выполняться наиболее быстро - может быть, с точки зрения компьютера оптимальной будет формула вообще без вычислений. По крайней мере, без вычислений с плавающей точкой. |
мм, копейки! |
64-Ткачик > ну я экономфак заканчивал, а там самое сложное - какой-нить банковский процент посчитать. так что всё успешно забыто. но спасибо на добром слове ) |
[quote=Блондинка в шок;44242983]А я насчитала 41 вместе с последней точкой с запятой. [/quote] Да, 41 символ, <;> от последнего вычисления осталась при вставке, не заметил. СтрДлина("у=ОКР(?(у>28,МИН(256,3.5352*у+36.46),0));[b];[/b]") = 42 |
[quote=Ткачик;44243963]Еще порция на вентилятор[/quote] Так его, так, давай-поддавай, "[em]золотарь[/em]" ты наш. Работать, негры, работать, солнце еще не зашло. Так что усердней набрасывай, трудись, не ленись. :) |
(68) Почувствовали себя "озолоченной", мадам? |
[quote=Блондинка в шок;44243209]МИН(256,[b]3.5352[/b][/quote] Ты этот аппроксиматор 3.5352 каким образом вычислила? 3,545454545 - вот шаг прогрессии при х = от 29 до 62. |
70-Шухер > Элементарно, Ватсон. Не проверял, но думаю, что БвШ воспользовалась методом наименьших квадратов: [img]https://prog-cpp.ru/wp-content/uploads/2016-12-28_17-58-09.png[/img] |
+(71) МНК даёт а = 3.53521772... и b = 36.50053476 Округление приводит к результату: a = 3.535 b = 36.49 |
71-Гена > Вон оно что, вот спасибо за подсказку ! Я то сразу как-то не придал значение, когда она про аппроксимацию намекнула, подумал - вот выделывается. :) Попробуем разобраться, надо еще для одного ряда подогнать а и b. |
Где мои семнадцать лет ... Сейчас для учебы фантастические возможности. Кампутер, интернет, любые книжки, обсуждения, видеоуроки, обучающие программы. И не хотят учиться. Это же так интересно - учиться. |
[quote=Ткачик;44243963]И вообще не факт, что самая короткая формула будет выполняться наиболее быстро - может быть, с точки зрения компьютера оптимальной будет формула вообще без вычислений. По крайней мере, без вычислений с плавающей точкой.[/quote] Да. НайтиЗначение в готовой таблице значений будет работать быстрее. Особенно, при большом количестве вызовов.:) Но, задача не в том, чтобы быстрее. |
[quote=Оля П;44248625]Но, задача не в том, чтобы быстрее. [/quote] Производительность тоже будем замерять. Кстати, глянул мельком замер - ч=ч+1 0,52% Найти() 0.23% Страшно представить, сколько времени займет вычисление с плавающей точкой :) |
Интересное наблюдение :) 1С прежде чем что-то ляпнуть - прежде хорошенько подумает. Основное время выполнения заняло Сообщить() Сообщить(Строка(х)+ " = " + Строка(у) ); 18 0.066128 97.90% |
[quote=Шухер;44247810]Попробуем разобраться, надо еще для одного ряда подогнать а и b.[/quote] Эксель замечательно все это умеет делать. Честно и откровенно говоря, всех моих усилий то - это всего лишь предположить, что твой ряд можно попытаться аппроксимировать с заданной погрешностью. А дальше железяка все считала сама. Рассказывать подробнее думаю незачем, если в яндексе набрать "[em]аппроксимация в excel[/em]", то с десяток миллионов вариантов тебе яндекс вывалит точно :) |
[quote=Шухер;44248720]ч=ч+1 0,52% Найти() 0.23%[/quote] Не все так просто. После НайтиЗначение естественно вызвать ПолучитьЗначение. Иначе зачем? |
Только 1С-ники могут решать задачу, у которой нет четкой постановки Если это аппроксимация - то с какой точностью? Бессмысленно сравнивать 2 решения по длине кода функции или по быстродействию, если эти решения дают разную точность. Задача поставлена некорректно, поэтому и решать ее бессмысленно. "Параметр (х) - может принимать целые положительные значения от 0 до бесконечности." - с этим что делать? Аппроксимировать можно только какие-то конкретные наборы данных, а не абстрактные понятия |
Текущее время: 00:23. Часовой пояс GMT +3. |