Реализация макроса Подбор параметра - нужна помощь.

Автор vip-s, 12 августа 2014, 18:12

0 Пользователи и 1 гость просматривают эту тему.

vip-s

Добрый день. Возникла необходимость реализовать макросом функцию Подбора параметра в Openoffice.

Есть исходный vba код из ms office

"Sub GoalSeek()
   Range("I4").GoalSeek Goal:=Range("C14"), ChangingCell:=Range("C16")
End Sub
"
Каким образом эта функция реализуется в Oо?
Заранее спасибо.


rami

Цитата: vip-s от 12 августа 2014, 17:12Каким образом эта функция реализуется в Oо?
Смотрите пример в файле "Подбор параметра".

vip-s


calc4fem


Hasim

Это все, конечно, хорошо.
Но как быть с уравнением 10*C2-10/C2=15
SeekGoal находит параметр 2, но тут же есть еще один параметр -0,5.
Как его найти?

rami

Цитата: Hasim от 13 августа 2014, 08:45Но как быть с уравнением 10*C2-10/C2=15
SeekGoal находит параметр 2, но тут же есть еще один параметр -0,5.
Как его найти?
10*C2-10/C2=15  это квадратное уравнение   =10*C2^2-15*C2-10   имеет два (или один или ни одного) корня, если в ячейку C2 вставить начальное значение меньше -0,5 , то найдётся первый корень(-0,5), а если больше -0,5 , то второй (2). В "чистом Подборе параметра" при выполнении условий итерации (максимальное число шагов или минимальное изменение) вычисления прекращаются и всегда выдаётся одно решение(если есть), но в макросе с помощью циклов и условий можно "заставить" "Подбор" искать дальше.

Hasim

Цитата: rami от 13 августа 2014, 10:02если в ячейку C2 вставить начальное значение меньше -0,5 , то найдётся первый корень(-0,5)
Только почему-то не находится?

tagezi

Цитата: Hasim от 13 августа 2014, 07:45Но как быть с уравнением
Корни уравнений лучше искать: Метод половинного деления, Метод хорд или Метод касательных (метод Ньютона).
Эти методы при правильной реализации позволяют не обращать внимание на степень и каноничность уравнения.
Минусом является то, что корни всегда находятся с определённым приближением и только на заданном участке.
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Цитата: Hasim от 13 августа 2014, 10:22Только почему-то не находится?
В предыдущем ответе немного ошибся, если меньше полусуммы корней (это 0.75), находится первый корень, а если больше, то второй.
Но вообще "Подбор параметра" используется не для решения задачи, а для подбора решения.

Hasim

#9
Цитата: rami от 13 августа 2014, 10:46В предыдущем ответе немного ошибся, если меньше полусуммы корней (это 0.75), находится первый корень, а если больше, то второй.
Завязывайте с теоретизированием.
Нужен работающий пример.
Цитата: rami от 13 августа 2014, 10:46Но вообще "Подбор параметра" используется не для решения задачи, а для подбора решения.
Это одно и тоже.

calc4fem

В данном случае, когда корней несколько а уравнение простое - лучше записать аналитическую формулу в ячейке
а в целом для решения уравнений есть надстройки вроде этой http://extensions.services.openoffice.org/en/project/CmathOOoCAS

Hasim

Цитата: calc4fem от 13 августа 2014, 18:16В данном случае, когда корней несколько а уравнение простое - лучше записать аналитическую формулу в ячейке
Есть простая задача для seekGoal: подобрать (найти) решения для уравнения, которое может иметь 2 (3,4,5,...) решений.
seekGoal находит только одно, но совсем не очевидно, что это решение именно то, которое и нужно.
Второе решение seekGoal найти не может никаким образом, хотя, возможно, именно это и есть то решение, которое нужно было найти.
Вопрос: на фига нам seekGoal???

calc4fem

#12
вот тут в коде метод Ньютона для решения тренсцендентного уравнения
(с конкретным уравнением и уравнением первой производной)

'Solve transcendental equation by Newton's method
'limits and initial value
Nmax=1e10 'max
N1=1 'min
N2=Nmax

'do cycle
Do While N2-N1>1 'go until get minimal difference
e1=log(100/(100-psi))/((4*N1)^mp+(1+r1)/(1-r1))+(fs/E)/((4*N1)^me+(1+r)/(1-r))-ea
e2=log(100/(100-psi))/((4*N2)^mp+(1+r1)/(1-r1))+(fs/E)/((4*N2)^me+(1+r)/(1-r))-ea
tan1=-4*mp*(4*N1)^(mp-1)*log(100/(100-psi))/((4*N1)^mp+(1+r1)/(1-r1))^2-4*me*(4*N1)^(me-1)*(fs/E)/((4*N1)^me+(1+r)/(1-r))^2
tan2=(e2-e1)/(N2-N1)

N1=N1-e1/tan1
N2=N2-e2/tan2
Loop