Имя: Пароль:
IT
 
Goal Seek из Excel в 1С
, ,
0 Leksandr
 
16.04.14
14:56
Коллеги, создавал ли кто-нибудь в 1С аналог функции экселя Goal Seek?

Пример: есть площадь прямоугольника S=a*b. Знаем S, знаем b. Нужно найти  а. Данная функция решает задачу перебором возможных значений a и считает, что решение найдено, если равенство верно.
1 Зойч
 
16.04.14
14:58
методом деления пополам самое простое
2 Leksandr
 
16.04.14
14:59
(1) есть пример?
3 skunk
 
16.04.14
14:59
а зачем здесь перебор ... когда знаем площадь и длину одной из сторон?
4 Зойч
 
16.04.14
14:59
Есть конечно и более продвинутые версии данного алгоритма, но и этого вполне достаточно
5 Кирпич
 
16.04.14
15:00
(3) ну вот.ветку испортил :)))
6 Ненавижу 1С
 
гуру
16.04.14
15:01
a=S/b
7 Leksandr
 
16.04.14
15:03
(3) Это простейший пример. Там в экселе длинная цепочка связей между ячейками с использование макросов... Всё сложно крч. Поэтому там же в экселе решение находится с использованием Goal Seek (опять таки вызовом из макросов)
8 Ненавижу 1С
 
гуру
16.04.14
15:04
(7) ну вряд ли там тупой перебор
9 Зойч
 
16.04.14
15:04
(8) перебор но не тупой
10 Leksandr
 
16.04.14
15:06
(8) там используется аппроксимация скорее всего
11 Mikeware
 
16.04.14
15:06
(3) Только дурак считает, что для того, чтобы найти  Площадь Ильича - нужно длину Ильича умножить на ширину Ильича...
Умный знает, что нужно взять интеграл по поверхности Ильича.
12 Leksandr
 
16.04.14
15:08
(1) пробую метод деления пополам - есть у кого-нибудь пример использования этого метода?
13 Зойч
 
16.04.14
15:14
Начало.
    Ввод 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 Leksandr
 
16.04.14
15:15
(13) Спасибо!
15 Зойч
 
16.04.14
15:15
В твоем случае лучше брать функцию F = S - a*b
16 Mikeware
 
16.04.14
15:30
от дожили... площадь прямоугольника вычисляют половинным делением, да еще просят код для этого....
17 Leksandr
 
16.04.14
16:14
(13) Спасибо Зойч! Вот реализовал пример (функция 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 Зойч
 
16.04.14
16:17
вот это
Макс(F(xi,y,S), -F(xi,y,S))
ты зря. А если функция будет минуту считать?
19 Leksandr
 
16.04.14
16:18
(18) Блин, точно... ща переделаю
20 Leksandr
 
16.04.14
16:19
кстати диапазон от 0 до 1000000000 считается мгновенно
21 За пределами РФ
 
16.04.14
16:27
а что я упускаю предлагая a = S/b?
22 Leksandr
 
16.04.14
16:38
(21) S=a*b - это простейший пример зависимости функции Y(x) от х. На самом деле функция то может содержать и тройные интегралы и пределы и прочую лабуду... В рабочем варианте этой задачи ведётся ряд сложных расчетов в Excel c использованием макросов и большого количества таблиц с данными, видимо поэтому "писатели" этого экселевского файла решили использовать именно goal seek, вызывая его с помощью макросов
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой