Здравствуйте. В примере ниже в ячейках слева диапазон данных от которых строится функция в ячейке Н она имеет вид 0.998683^x + 1.00216908^x+ 1.002040888^x+ 0.998182^x+ 1.003999^x, в ячейке К строится через поиск решения подобранный Х в котором функция будет иметь ЭКСТРЕММУМ(он будет один). Но как растянуть этот поиск решения на другие ячейки, чтобы такой поиск был проделан для каждой строки диапазона, и чтобы при динамической смене диапазона слева, происходил переподбор решения.
а если как-нибудь без макроса формулой сделать, типа рядом прописать в столбике диапазон значений от там -1000 до +1000 например , и в каждой ячейке выбирать из этого диапазаона значение при котором будет минимум. Вот например через смещение или поискпоз или еще как, начиная сверху подставляем значение в формулу, и ставим условие, если соседнее значение сверху было больше, а соседнее значение снизу - тоже больше, то значит это и есть минимум, ставим значение функции и найденное число рядом из столбика со значениями от -1000 до
На 3-м лесте исходные данные-столбики-это тоже формульные ячейки, их данные меняются/обновляются с заданным интервалом по времени, а поиск решения при этом не будет обновлятья-один раз расчетает и все(
через поискпоз имел ввиду условие, если(И( (A2^H2+B2^H2)>(A2^H1+B2^H1),(A2^H2+B2^H2)<(A2^H3+B2^H3)),(A2^H2+B2^H2),0). Вот типа того, а столбец Н задать по вертикали как значения ячеек от -1000 до 1000, вот только это смещение или поискпоз надо как-то перебирать Н до выполнения условия.
Fig пишет: а если как-нибудь без макроса формулой сделать, типа рядом прописать в столбике диапазон значений от там -1000 до +1000 например , и в каждой ячейке выбирать из этого диапазаона значение при котором будет минимум.
Да, можно. См. формулу в ст. L и имена-функции (Ctrl+F3).
От спасибо-то а, мил человек! Вот что значит опыт, ато нельзя....)))Спасибо еще раз. Буду разбираться, дабы не дергать вопросами по мелочам.Если что не пойму, спрошу позже.
вот макрос из последнего файла 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
и еще, так как нужно найти точку перегиба, то с минимумом наверное я погорячился... вот например если ряд данных такой что все значения больше единицы, то тут точка перегиба будет являться минимумом. 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 пишет: и еще, там задан перебор степени от -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).
и еще, там задан перебор степени от -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
я ж вам написал. нет там "перебора с шагом". вычисляются знаки производной на концах отрезка и в середине. в зависимости от знака производной в середине отрезок уполовинивается - берется левая или правая половина. снова вычисляются производные... и так до тех пор, пока модуль разности не станет меньше заданного значения.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
ikki пишет: снова вычисляются производные... и так до тех пор, пока модуль разности не станет меньше заданного значения.
А значение это вот это в коде Optional eps = 0.0000001 ? Кажись допетрил я ) и правда у вас другой способ поиска этой точки, тогда еще вопрос, правильно ли я понял, что если такому способу подать 2 пораболы, одну обычную, другую перевернутую, то этот способ найдет именно не миниму пораболы на отрезке (вершина попадает в отрезок), а именно точки перегиба- то есть ее вершины?
Fig пишет: А значение это вот это в коде Optional eps = 0.0000001 ?
да
Цитата
Fig пишет: если такому способу подать 2 пораболы, одну обычную, другую перевернутую, то этот способ найдет
правильнее говорить - не способ, а данная конкретная реализация. в принципе - можно доработать и на поиск максимума, а не минимума внутри отрезка, и на сравнение со значениями на границах. смотря что, как и почему вам нужно
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Суть нужно найти экстреммум функции (он один), но экстреммум разных знаков может быть-максимумом и минимумом, а тут получается что только минимум ищет? получается что если порабола концами вверх, то он найдет ее нижнюю вершину, а если пораболу перевернуть, то найдет ли он верхнюю точку перегиба на отрезке (где вершина внутри отрезка). Вы же понимаете что экстремум - это не максимум и минимум на отрезке(не обязательно), минимум может быть один а экстреммум другим.
ну вот(. точка перегиба от экстремума отличается значением второй производной: в первом случае она равна 0, во втором - нет. может как-нибудь вторую производную сюда приплести. Чтоб искал тот единственный экстреммум (а не точку перегиба и не максимум/минимум ).
кстати правильна ли строчка эта в макросе p = p + Log(a(i)) * a(i) ^ x: Next есть такая формула (а^x)'=а^хlп а. может нужно исправить строчку на такое p = p + Ln(a(i)) * a(i) ^ x: Next ??????????????????хотел посмотреть но не работает после замены