|
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, вызывая его с помощью макросов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |