Страницы: 1 2 След.
RSS
Динамический поиск минимума функции
 
Здравствуйте. В примере ниже в ячейках слева диапазон данных от которых строится функция в ячейке Н она имеет вид 0.998683^x + 1.00216908^x+ 1.002040888^x+ 0.998182^x+ 1.003999^x, в ячейке К строится через поиск решения подобранный Х в котором функция будет иметь ЭКСТРЕММУМ(он будет один). Но как растянуть этот поиск решения на другие ячейки, чтобы такой поиск был проделан для каждой строки диапазона, и чтобы при динамической смене диапазона слева, происходил переподбор решения.
Изменено: Fig - 12.03.2013 13:00:15
 
Только макрос "повешенный" на событие при котором происходит перерасчёт
 
нет в жизни счастья(
 
Есть только по немногу ;)
 
а если как-нибудь без макроса формулой сделать, типа рядом прописать в столбике диапазон значений от там -1000 до +1000 например , и в каждой ячейке выбирать из этого диапазаона значение при котором будет минимум. Вот например через смещение или поискпоз или еще как, начиная сверху подставляем значение в формулу, и ставим условие, если соседнее значение сверху было больше, а соседнее значение снизу - тоже больше, то значит это и есть минимум, ставим значение функции и найденное число рядом из столбика со значениями от -1000 до

+1000
Изменено: Fig - 11.03.2013 12:18:49
 
Fig, в Вашем случае, наверное можно, с помощью Поиска_решения,
найти нули производных сразу для всех функций (минимумы значений):
 
при смене диапазона ведь не меняется ничего(

может где настройки есть , чтоб поиск решения обнавлялся через заданное время?
 
Цитата
при смене диапазона ведь не меняется ничего(
Это Вы о чём ?
 
На 3-м лесте исходные данные-столбики-это тоже формульные ячейки, их данные меняются/обновляются с заданным интервалом по времени, а поиск решения при этом не будет обновлятья-один раз расчетает и все(
Изменено: Fig - 11.03.2013 18:39:31
 
Сорри, тогда
Цитата
Fig пишет: нет в жизни счастья(
 
В смысле:
Цитата
LVL пишет:
Только макрос "повешенный" на событие при котором происходит перерасчёт
 
через поискпоз имел ввиду условие, если(И( (A2^H2+B2^H2)>(A2^H1+B2^H1),(A2^H2+B2^H2)<(A2^H3+B2^H3)),(A2^H2+B2^H2),0).
Вот типа того, а столбец Н задать по вертикали как значения ячеек от -1000 до 1000, вот только это смещение или поискпоз надо как-то перебирать Н до выполнения условия.
Изменено: Fig - 11.03.2013 16:17:49
 
Цитата
Fig пишет:
а если как-нибудь без макроса формулой сделать, типа рядом прописать в столбике диапазон значений от там -1000 до +1000 например , и в каждой ячейке выбирать из этого диапазаона значение при котором будет минимум.
Да, можно. См. формулу в ст. L и имена-функции (Ctrl+F3).
 
От спасибо-то а, мил человек! Вот что значит опыт, ато нельзя....)))Спасибо еще раз. Буду разбираться, дабы не дергать вопросами по мелочам.Если что не пойму, спрошу позже.
Изменено: Fig - 11.03.2013 18:40:10
 
Удачи на дорогах!
 
вариант с UDF, раз уж написал  :D
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ваш вариант работает гораздо быстрее). Спасибо большое, буду разбираться.
 
вот макрос из последнего файла
Function f(rng As Range, Optional vFrom = -1000, Optional vTo = 1000, Optional eps = 0.0000001)
 Dim arr#(1 To 5), i%, p1#, p2#, x#, px#
 For i = 1 To 5: arr(i) = rng.Cells(1, i): Next
 p1 = p(arr, vFrom): p2 = p(arr, vTo)
 If Sgn(p1) <> -1 And Sgn(p2) <> 1 Then f = CVErr(xlErrValue): Exit Function
 Do While Abs(p2 - p1) > eps
   x = (vTo + vFrom) / 2: px = p(arr, x)
   Select Case Sgn(px)
     Case 0: f = x: Exit Function
     Case -1: vFrom = x: p1 = px
     Case 1: vTo = x: p2 = px
   End Select
 Loop
 f = (vTo + vFrom) / 2
End Function

Function p#(a#(), x) ' производная
 Dim i%
 For i = 1 To 5: p = p + Log(a(i)) * a(i) ^ x: Next
End Function
 
правильно ли я понимаю , что для того чтобы его переместить на другной лист другой книги и увеличить число входных данных (например число столбцов слева сделать не 5 а например 10)
нужно изменить его так
Function f(rng As Range, Optional vFrom = -1000, Optional vTo = 1000, Optional eps = 0.0000001)
Dim arr#(1 To 10), i%, p1#, p2#, x#, px#
For i = 1 To 10: arr(i) = rng.Cells(1, i): Next
p1 = p(arr, vFrom): p2 = p(arr, vTo)
If Sgn(p1) <> -1 And Sgn(p2) <> 1 Then f = CVErr(xlErrValue): Exit Function
Do While Abs(p2 - p1) > eps
x = (vTo + vFrom) / 2: px = p(arr, x)
Select Case Sgn(px)
Case 0: f = x: Exit Function
Case -1: vFrom = x: p1 = px
Case 1: vTo = x: p2 = px
End Select
Loop
f = (vTo + vFrom) / 2
End Function

Function p#(a#(), x) ' производная
Dim i%
For i = 1 To 10: p = p + Log(a(i)) * a(i) ^ x: Next
End Function
Изменено: Fig - 12.03.2013 08:45:57
 
и еще, там задан перебор степени от -1000 до 1000, я так пониаю с шагом 1.
А как сделать перебор степени от 0,001 до 1000, с шагом 0,001
Изменено: Fig - 12.03.2013 08:50:34
 
и еще, так как нужно найти точку перегиба, то с минимумом наверное я погорячился...
вот например если ряд данных такой что все значения больше единицы, то тут точка перегиба будет являться минимумом.
1.998683^x + 1.00216908^x+ 1.002040888^x+ 1.998182^x+ 1.003999^x,
а если ряд например такой что его значения меньше единицы, то тут точка перегиба будет уже максимумом.
0.998683^x + 0.00216908^x+ 0.002040888^x+ 0.998182^x+ 0.003999^x,
но когда нужен максимум а когда минимум- заранее не известно.
так что перебор о котором писал ранее наверное нужно изминить это
если(И( (A2^H2+B2^H2)>(A2^H1+B2^H1),(A2^H2+B2^H2)<(A2^H3+B2^H3)),(A2^H2+B2^H2),0).
На это- если(ЗНАК((A2^H2+B2^H2)-(A2^H1+B2^H1))не равен ЗНАК((A2^H3+B2^H3)-(A2^H2+B2^H2)),(A2^H2+B2^H2),0).
Изменено: Fig - 12.03.2013 09:06:31
 
Цитата
Fig пишет:
нужно изменить его так
совершенно верно.
Цитата
Fig пишет:
и еще, там задан перебор степени от -1000 до 1000, я так пониаю с шагом 1.
совершенно неверно.
используется простейший метод половинного деления.
в предположении, что знаки первой производной для исх. диапазона противоположны, причем слева минус, а справа плюс и функция имеет один минимум в диапазоне.

Fig, я очень извиняюсь, но мои воспоминания о математике настолько смутные, что я и этот-то вариант сделал с некоторым трудом.
как решать для функций с несколькими экстремумами (убейбог!) - ничего не помню.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В том то и дело что в диапазоне, может быть так что минимум этот не есть истинная точка перегиба, а всего лишь коннец диапазона - краевая точка минимальна.
например взять растущий отрезок, там точек перегиба нет, а минимум на отрезке есть.
да неее, экстреммум там всегда один, но вот знак его не обязательно переход

+-+, может быть и -+-.
для этого и перефразировал немного это если(И( (A2^H2+B2^H2)>(A2^H1+B2^H1),(A2^H2+B2^H2)<(A2^H3+B2^H3)),(A2^H2+B2^H2),0).
На это- если(ЗНАК((A2^H2+B2^H2)-(A2^H1+B2^H1))не равен ЗНАК((A2^H3+B2^H3)-(A2^H2+B2^H2)),(A2^H2+B2^H2),0).
Изменено: Fig - 12.03.2013 22:17:54
 
и еще, там задан перебор степени от -1000 до 1000, я так пониаю с шагом 1.
А как сделать перебор степени от 0,001 до 1000, с шагом 0,001.
что там поменять надо так ведь не пойдет ниже красным диапазон перебора поменял, а шаг который был единица поменять на шаг 0,001 где?
Function f(rng As Range, Optional vFrom = 0,001, Optional vTo = 1000, Optional eps = 0.0000001)
Dim arr#(1 To 5), i%, p1#, p2#, x#, px#
For i = 1 To 5: arr(i) = rng.Cells(1, i): Next
p1 = p(arr, vFrom): p2 = p(arr, vTo)
If Sgn(p1) <> -1 And Sgn(p2) <> 1 Then f = CVErr(xlErrValue): Exit Function
Do While Abs(p2 - p1) > eps
x = (vTo + vFrom) / 2: px = p(arr, x)
Select Case Sgn(px)
Case 0: f = x: Exit Function
Case -1: vFrom = x: p1 = px
Case 1: vTo = x: p2 = px
End Select
Loop
f = (vTo + vFrom) / 2
End Function

Function p#(a#(), x) ' производная
Dim i%
For i = 1 To 5: p = p + Log(a(i)) * a(i) ^ x: Next
End Function
Изменено: Fig - 12.03.2013 22:16:54
 
я ж вам написал.
нет там "перебора с шагом".
вычисляются знаки производной на концах отрезка и в середине.
в зависимости от знака производной в середине отрезок уполовинивается - берется левая или правая половина.
снова вычисляются производные...
и так до тех пор, пока модуль разности не станет меньше заданного значения.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki пишет:
снова вычисляются производные...
и так до тех пор, пока модуль разности не станет меньше заданного значения.
А значение это вот это в коде Optional eps = 0.0000001 ?
Кажись допетрил я ) и правда у вас другой способ поиска этой точки, тогда еще вопрос, правильно ли я понял, что если такому способу подать 2 пораболы, одну обычную, другую перевернутую, то этот способ найдет именно не миниму пораболы на отрезке (вершина попадает в отрезок), а именно точки перегиба- то есть ее вершины?
Изменено: Fig - 12.03.2013 22:16:25
 
Цитата
Fig пишет:
А значение это вот это в коде  Optional eps = 0.0000001  ?
да

Цитата
Fig пишет:
если такому способу подать 2 пораболы, одну обычную, другую перевернутую, то этот способ найдет
правильнее говорить - не способ, а данная конкретная реализация.
в принципе - можно доработать и на поиск максимума, а не минимума внутри отрезка, и на сравнение со значениями на границах.
смотря что, как и почему вам нужно :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Суть нужно найти экстреммум функции (он один), но экстреммум разных знаков может быть-максимумом и минимумом, а тут получается что только минимум ищет? получается что если порабола концами вверх, то он найдет ее нижнюю вершину, а если пораболу перевернуть, то найдет ли он верхнюю точку перегиба на отрезке (где вершина внутри отрезка). Вы же понимаете что экстремум - это не максимум и минимум на отрезке(не обязательно), минимум может быть один а экстреммум другим.
Изменено: Fig - 12.03.2013 22:15:57
 
ну вот(. точка перегиба от экстремума отличается значением второй производной: в первом случае она равна 0, во втором - нет. может как-нибудь вторую производную сюда приплести. Чтоб искал тот единственный экстреммум (а не точку перегиба и не максимум/минимум ).
Изменено: Fig - 12.03.2013 11:48:11
 
кстати правильна ли строчка эта в макросе
p = p + Log(a(i)) * a(i) ^ x: Next
есть такая формула (а^x)'=а^хlп а.
может нужно исправить строчку на такое
p = p + Ln(a(i)) * a(i) ^ x: Next
??????????????????хотел посмотреть но не работает после замены
Изменено: Fig - 12.03.2013 12:40:32
Страницы: 1 2 След.
Читают тему
Наверх