Goal Seek из Excel в 1С #705678


#0 by Leksandr
Коллеги, создавал ли кто-нибудь в 1С аналог функции экселя Goal Seek? Пример: есть площадь прямоугольника S=a*b. Знаем S, знаем b. Нужно найти  а. Данная функция решает задачу перебором возможных значений a и считает, что решение найдено, если равенство верно.
#1 by Зойч
методом деления пополам самое простое
#2 by Leksandr
есть пример?
#3 by skunk
а зачем здесь перебор ... когда знаем площадь и длину одной из сторон?
#4 by Зойч
Есть конечно и более продвинутые версии данного алгоритма, но и этого вполне достаточно
#5 by Кирпич
ну вот.ветку испортил :)))
#6 by Ненавижу 1С
a=S/b
#7 by Leksandr
Это простейший пример. Там в экселе длинная цепочка связей между ячейками с использование макросов... Всё сложно крч. Поэтому там же в экселе решение находится с использованием Goal Seek (опять таки вызовом из макросов)
#8 by Ненавижу 1С
ну вряд ли там тупой перебор
#9 by Зойч
перебор но не тупой
#10 by Leksandr
там используется аппроксимация скорее всего
#11 by Mikeware
Только дурак считает, что для того, чтобы найти  Площадь Ильича - нужно длину Ильича умножить на ширину Ильича... Умный знает, что нужно взять интеграл по поверхности Ильича.
#12 by Leksandr
пробую метод деления пополам - есть у кого-нибудь пример использования этого метода?
#13 by Зойч
Начало.     Ввод xn, xk, epsy.     Если F(xn) = 0, то Вывод (корень уравнения — xn).     Если F(xk) = 0, то Вывод (корень уравнения — xk).     dx := xk — xn.     Пока |F(xi)| > epsy повторять:     dx := dx / 2;     xi := xn + dx;     если sign(F(xn)) ? sign(F(xi)), то xk := xi;     иначе xn := xi.     конец повторять     Вывод (Найден корень уравнения — xi с точностью по y — epsy).     Конец.
#14 by Leksandr
Спасибо!
#15 by Зойч
В твоем случае лучше брать функцию F = S - a*b
#16 by Mikeware
от дожили... площадь прямоугольника вычисляют половинным делением, да еще просят код для этого....
#17 by Leksandr
Спасибо Зойч! Вот реализовал пример (функция S(x)= x*y+10): &НаСервереБезКонтекста Функция РасчитатьИкс(S,y) xn=0; //начало диапазона xk=1000000000; //конец диапазона epsy=0.005; //точность xi=0 ;     Если F(xn,y,S) = 0 //крайняя правая точка     Тогда Возврат xn;     КонецЕсли;          Если F(xk,y,S) = 0 //крайняя левая точка     Тогда Возврат xk;     КонецЕсли;                            dx=xk-xn; //длина диапазона          Пока Макс(F(xi,y,S), -F(xi,y,S))  > epsy  //если модуль функции больше погрешности     Цикл              dx=dx/2; //длина половины диапазона                  xi=xn+dx; //середина диапазона (текущая)                           Если (F(xn,y,S)>=0 И F(xi,y,S)>=0) ИЛИ (F(xn,y,S)<=0 И F(xi,y,S)<=0)         Тогда xn=xi;                            Иначе xk=xi;         КонецЕсли;              КонецЦикла;     Возврат    Окр(xi,2); КонецФункции     &НаСервереБезКонтекста Функция F(x,y,S) Возврат S-x*y-10;     КонецФункции
#18 by Зойч
вот это Макс(F(xi,y,S), -F(xi,y,S)) ты зря. А если функция будет минуту считать?
#19 by Leksandr
Блин, точно... ща переделаю
#20 by Leksandr
кстати диапазон от 0 до 1000000000 считается мгновенно
#21 by За пределами РФ
а что я упускаю предлагая a = S/b?
#22 by Leksandr
S=a*b - это простейший пример зависимости функции Y(x) от х. На самом деле функция то может содержать и тройные интегралы и пределы и прочую лабуду... В рабочем варианте этой задачи ведётся ряд сложных расчетов в Excel c использованием макросов и большого количества таблиц с данными, видимо поэтому "писатели" этого экселевского файла решили использовать именно goal seek, вызывая его с помощью макросов
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С