Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   ОФФ: v77 Арифметика. Ряды чисел. Написать кратчайшуу ф-цию. (http://forums.kuban.ru/f1040/off_v77_arifmetika_ryady_chisel_napisat-_kratchajshuu_f-ciyu-8325756.html)

Блондинка в шок 21.05.2017 18:09

у=0,0009х^2+3.4519х+38,3[b][u]6[/u][/b]7

qweqwe123123 21.05.2017 18:17

МИН() норм экономит, забираю :-)

y=?(X>28,МИН(256,Окр(2,535*(x-29))+110+X),0);

а где на 1Се функция Гены?

Шухер 21.05.2017 18:17

36-Блондинка в шок > Шикарное решение! Но у Зеленого короче. А он еще один символ выкроил :)
Как ты пришла к квадратному уравнению?

Шухер 21.05.2017 18:21

[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)));

Блондинка в шок 21.05.2017 18:22

38-Шухер > ну ясно же, это была просто функция основного ряда
уточняю коэффициенты -
Y=ОКР(МИН(256,?(X>28,0.0009*X*X+3.452*X+38.36,0)));

qweqwe123123 21.05.2017 18:27

45-Блондинка в шок > то есть изначально функция закладывалась как квадратное уравнение, а потом коэффициенты подбирались?

Блондинка в шок 21.05.2017 18:28

[quote=Шухер;44242266]Как ты пришла к квадратному уравнению?[/quote] "апроксимация", сэр :)
пришлось вспомнить институт.
коэффициенты не подбирались, а решались.
система уравнений.

Шухер 21.05.2017 18:32

[quote=Блондинка в шок;44242285]уточняю коэффициенты - [/quote] Принято, считает правильно.
Это самое красивое решение, на мой взгляд, из всех виденных.

Шухер 21.05.2017 18:46

[quote=Зелёный тролль;44242301]то есть изначально функция закладывалась как квадратное уравнение[/quote]
Я подозревал что-то такое. Смотрел, на графике прямая линия с изломом, не парабола, подумал - обычное линейное уравнение с заскоками.

Надо проверить твою формулу в другом диапазоне. Независимо от результата, мои симпатии остаются за твоим решением, высший пилотаж.

USSR 21.05.2017 19:03

"апроксимация", сэр :)
Только по моему это не аппроксимация, а интерполяция )
Аппроксимация - это приближение по минимуму критерия отклонения, например среднеквадратичного )

Блондинка в шок 21.05.2017 19:24

50-USSR >апроксимация, интерполяция..
как хочу, так и делаю

например, вот так:

У=ОКР(?(X>28,МИН(256,3.5352*Х+36.46),0));

Шухер 21.05.2017 19:46

51-Блондинка в шок >
Фантастика! Работает, даром что не аппрокси.. , как его там по научному-то ?
Шухер в шоке - 42 буква вся формула.

Шухер 21.05.2017 19:49

[quote=Блондинка в шок;44242526]+36.46[/quote]
Ты не на градуснике высчитывала формулу? :)

Шухер 21.05.2017 19:59

Зеленый, твою формулу посокращать бы можно
(2.5345*(х-29))+110 ->
2.5345*х - 2.5345*29 - 110
не проверял, может поплывет из за округления

Шухер 21.05.2017 20:06

Математика, это вам не русский и литература, где могут быть разночтения. :) Математика - это как в шахматах, мат на доске означает безусловную победу, без всяких "НО".
Мат, сэр!

Гена 21.05.2017 20:42

51-Блондинка в шок > скорее всего не сработают дробные до копеек... придётся скорее всего задать сначала:
Х=ЦЕЛ(X+0.999);

Блондинка в шок 21.05.2017 21:11

56-Гена >Гена, так это ж вроде обсудили и утвердили:
[quote=Гена;44237595]можно сначала определить в ячейке B1 =ОКРУГЛВВЕРХ(A1;0)[/quote]
[quote=Шухер;44238364]Принимается округление вверх в другой ячейке.[/quote]
я исходила из этого и никаких больше [quote=Гена;44242836]Х=ЦЕЛ(X+0.999);[/quote]
не подразумевала.


[quote=Шухер;44242626]Шухер в шоке - 42 буква вся формула.[/quote] А я насчитала 41 вместе с последней точкой с запятой.

Гена 21.05.2017 21:34

57-Блондинка в шок > Нет уж. Надо всё считать, потому что у ЗТ два раза иксы используются кроме X>28, где не требуется округление, а у Вас только в ОДНОМ месте, поэтому у Вас пойдёт выигрыш ещё в три знака "Х=" и ";".
Окончательно:
[b]У=ОКР(?(X>28,МИН(256,3.5352*ЦЕЛ(Х+0.99)+36.46),0));[/b]

Блондинка в шок 21.05.2017 21:55

58-Гена >[quote=Гена;44243073]Нет уж. Надо всё считать,[/quote] Вот именно - нет уж.
Читаем сабж:
1. Имеется таблица.
2. По таблице построить функцию.
3. Точка.

Возьми экселевский файлик из задания (точнее из поста (1).
Подставь мою формулу из (51) (прямо в ту табличку эксель) и проверь.
Никаких Х=ЦЕЛ(X+0.999) не требуется.

Поэтому я не буду настаивать, чтобы ЗТ тоже округлял Х непосредственно в формуле.
А то так действительно у меня еще больше выигрыш получится.

Гена 21.05.2017 21:59

В посте #12 автор уточнил, что рассматривает и копейки.

Блондинка в шок 21.05.2017 22:06

60-Гена > Но с другой стороны ты прав.
Если формально соблюдать требование, что не должно быть никаких дополнительных операторов, даже через";",
И если сделать предположение, что речь идет именно о рублях и копейках (т.е. два знака после запятой), то принимаю твою окончательную поправку:
[b]У=ОКР(?(X>28,МИН(256,3.5352*ЦЕЛ(Х+0.99)+36.46),0));[/b]

И при этом никаких "[em]дополнительных округлений вверх в отдельной ячейке[/em]" не требуется.

Ткачик 21.05.2017 22:25

Когда 1Снику делать нечего, он... нет, не дотягивается.

qweqwe123123 22.05.2017 01:00

54-Шухер > конечно можно )) всё ж таки два X в формуле первой степени ))

попробую ещё что-нить альтернативное подумать

Ткачик 22.05.2017 01:26

Еще порция на вентилятор: только Зелёный тролль выстроил свою формулу в (42) как [b]программист[/b], а остальные "рекордисты" - как не знаю кто... математики, наверное?

И вот почему: и в (58), и в (61) при значениях Х [b]вне[/b] диапазона 29...62 округлению будут подвергнуты либо 0, либо 256, которые заданы явно и в этом округлении ничуть не нуждаются.

Да, приведение формул к "программистскому" виду не сократит (но и не увеличит!) их длину, а выполняться они будут немножко оптимальнее.

И вообще не факт, что самая короткая формула будет выполняться наиболее быстро - может быть, с точки зрения компьютера оптимальной будет формула вообще без вычислений. По крайней мере, без вычислений с плавающей точкой.

qweqwe123123 22.05.2017 01:40

мм, копейки!

qweqwe123123 22.05.2017 01:52

64-Ткачик > ну я экономфак заканчивал, а там самое сложное - какой-нить банковский процент посчитать. так что всё успешно забыто. но спасибо на добром слове )

Шухер 22.05.2017 07:45

[quote=Блондинка в шок;44242983]А я насчитала 41 вместе с последней точкой с запятой. [/quote]
Да, 41 символ, <;> от последнего вычисления осталась при вставке, не заметил.
СтрДлина("у=ОКР(?(у>28,МИН(256,3.5352*у+36.46),0));[b];[/b]") = 42

Блондинка в шок 22.05.2017 11:06

[quote=Ткачик;44243963]Еще порция на вентилятор[/quote] Так его, так, давай-поддавай, "[em]золотарь[/em]" ты наш. Работать, негры, работать, солнце еще не зашло. Так что усердней набрасывай, трудись, не ленись. :)

Ткачик 22.05.2017 11:09

(68) Почувствовали себя "озолоченной", мадам?

Шухер 22.05.2017 11:37

[quote=Блондинка в шок;44243209]МИН(256,[b]3.5352[/b][/quote]
Ты этот аппроксиматор 3.5352 каким образом вычислила?
3,545454545 - вот шаг прогрессии при х = от 29 до 62.

Гена 22.05.2017 12:40

70-Шухер > Элементарно, Ватсон. Не проверял, но думаю, что БвШ воспользовалась методом наименьших квадратов:

[img]https://prog-cpp.ru/wp-content/uploads/2016-12-28_17-58-09.png[/img]

Гена 22.05.2017 13:31

+(71) МНК даёт а = 3.53521772... и b = 36.50053476
Округление приводит к результату:
a = 3.535
b = 36.49

Шухер 22.05.2017 18:27

71-Гена > Вон оно что, вот спасибо за подсказку !
Я то сразу как-то не придал значение, когда она про аппроксимацию намекнула, подумал - вот выделывается. :) Попробуем разобраться, надо еще для одного ряда подогнать а и b.

Шухер 22.05.2017 20:24

Где мои семнадцать лет ... Сейчас для учебы фантастические возможности. Кампутер, интернет, любые книжки, обсуждения, видеоуроки, обучающие программы. И не хотят учиться. Это же так интересно - учиться.

OlgaP 22.05.2017 20:45

[quote=Ткачик;44243963]И вообще не факт, что самая короткая формула будет выполняться наиболее быстро - может быть, с точки зрения компьютера оптимальной будет формула вообще без вычислений. По крайней мере, без вычислений с плавающей точкой.[/quote]
Да. НайтиЗначение в готовой таблице значений будет работать быстрее. Особенно, при большом количестве вызовов.:)
Но, задача не в том, чтобы быстрее.

Шухер 22.05.2017 21:02

[quote=Оля П;44248625]Но, задача не в том, чтобы быстрее. [/quote]
Производительность тоже будем замерять.
Кстати, глянул мельком замер -
ч=ч+1 0,52%
Найти() 0.23%
Страшно представить, сколько времени займет вычисление с плавающей точкой :)

Шухер 22.05.2017 21:08

Интересное наблюдение :)
1С прежде чем что-то ляпнуть - прежде хорошенько подумает. Основное время выполнения заняло Сообщить()
Сообщить(Строка(х)+ " = " + Строка(у) ); 18 0.066128 97.90%

Блондинка в шок 23.05.2017 00:49

[quote=Шухер;44247810]Попробуем разобраться, надо еще для одного ряда подогнать а и b.[/quote]
Эксель замечательно все это умеет делать.

Честно и откровенно говоря, всех моих усилий то - это всего лишь предположить, что твой ряд можно попытаться аппроксимировать с заданной погрешностью.

А дальше железяка все считала сама.
Рассказывать подробнее думаю незачем, если в яндексе набрать "[em]аппроксимация в excel[/em]", то с десяток миллионов вариантов тебе яндекс вывалит точно :)

OlgaP 23.05.2017 03:16

[quote=Шухер;44248720]ч=ч+1 0,52% Найти() 0.23%[/quote]
Не все так просто. После НайтиЗначение естественно вызвать ПолучитьЗначение. Иначе зачем?

USSR 23.05.2017 04:22

Только 1С-ники могут решать задачу, у которой нет четкой постановки Если это аппроксимация - то с какой точностью? Бессмысленно сравнивать 2 решения по длине кода функции или по быстродействию, если эти решения дают разную точность. Задача поставлена некорректно, поэтому и решать ее бессмысленно.
"Параметр (х) - может принимать целые положительные значения от 0 до бесконечности." - с этим что делать? Аппроксимировать можно только какие-то конкретные наборы данных, а не абстрактные понятия


Текущее время: 00:23. Часовой пояс GMT +3.