Страницы: 1 2 След.
RSS
Найти точки пересечения графиков
 
Привет Планетяне!  :)
Подскажите пожалуйста, как найти координаты точек пересечения на графике? В идеале, с помощью формул, но vba c поиском решений также подойдет.
Облазил гугл, но не смог решить самостоятельно.
Изменено: evgeniygeo - 08.06.2021 13:56:43
 
ну по такому примеру
Код
=МАКС(A2:A18*(B2:B18=D2:D18))
Соблюдение правил форума не освобождает от модераторского произвола
 
еще как вариант в доп столбец и оттуда тащить
Код
=ЕСЛИОШИБКА(ПРОСМОТР(2;1/(СЧЁТЕСЛИ(B2:D2;B2:D2)>1);B2:D2);"")
Лень двигатель прогресса, доказано!!!
 
buchlotnik,
Сергей,
большое спасибо за участие. Прошу прощения за некорректный пример.
Мне нужно найти точки на листе "было". Возможно, сможете помочь?
Изменено: evgeniygeo - 08.06.2021 08:16:20
 
массивная в доп столбец
Код
=ЕСЛИ(МИН(ABS($D$2:$D$18-$B$2:$B$18))=ABS(D2-B2);B2;ЕСЛИ(МИН(ABS($D$2:$D$18-$C$2:$C$18))=ABS(D2-C2);C2;""))
Лень двигатель прогресса, доказано!!!
 
Сергей,
простите, но она не считает точки пересечения.
Указал в примере выше точки, координаты которых мне необходимо найти
Изменено: evgeniygeo - 08.06.2021 08:17:32
 
не пойму что хотите причем тут считает не считает вы просили найти точки пересечения
Лень двигатель прогресса, доказано!!!
 
Сергей,
еще раз прошу прощения, мне нужно найти не просто точки, а их координаты.

Название темы должно быть "Найти координаты точек пересечения графиков"
 
дак вот вам и координаты X столбец А,  Y доп столбец Е
если в столбце Е есть значение то это и будет координата пересечения
Лень двигатель прогресса, доказано!!!
 
Сергей,
но это не те координаты. Выделил те, что получились у Вас.
Изменено: evgeniygeo - 08.06.2021 08:32:41
 
evgeniygeo, если вы хотите найти точную координату оси Х то тогда это уже надо обращаться к уравнениям нахождения точки координат пересечения  
Лень двигатель прогресса, доказано!!!
 
Сергей,
да, из гугла я это понял, но даже с его помощью не смог это сделать.

Возможно, кто-то сможет подсказать, как это сделать?
Изменено: evgeniygeo - 08.06.2021 09:13:28
 
Вариант с дополнительными столбцами
Код
F2:F18      =B2>D2
G2:H2       =ЛИНЕЙН(D2:D3;A2:A3)     формула массива, внесённая в диапазон G2:H2. Выделить две ячейки при внесении формулы.
Протянуть G2:H2 до G17:H17
I2:I17      =(B2-H2)/G2
J1          =ВПР(F2;F:I;4;-1)        'x пересечения со Значениями 1.
 
del
Изменено: buchlotnik - 22.08.2021 00:42:00
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik,
правильно ли я понимаю, что если значение 1 и 2 будут не прямыми (не одинаковыми), то Ваш вариант не будет работать?
Изменено: evgeniygeo - 08.06.2021 09:42:02
 
МатросНаЗебре,
очень круто!!! Правильно ли я понимаю, что тем самым Вы нашли "х". Подскажите пожалуйста, как найти "у", если значения 1 и 2 будут не одинаковыми?

Думаю, что нужно перенести тему в платный раздел, т.к. далее мне нужно найти еще несколько точек и судя по всему, я самостоятельно не справлюсь.
Бюджет скромный 500 рублей.
Изменено: evgeniygeo - 08.06.2021 10:09:17
 
Код
G2            =(D3-D2)/(A3-A2)
H2            =(D2*A3-D3*A2)/(A3-A2)
I2            =(B3-B2)/(A3-A2)
J2            =(B2*A3-B3*A2)/(A3-A2)
K2            =(J2-H2)/(G2-I2)
L2            =G2*K2+H2
M2            
N2            
O2            =ВПР(F2;F:L;6;-1)
P2            =ВПР(F2;F:L;7;-1)
 
МатросНаЗебре,
а как узнать "х" из получившегося графика при "у"=0?
Изменено: evgeniygeo - 08.06.2021 10:38:33
 
Код
=(X4-(X2*W3-X3*W2)/(W3-W2))/((X3-X2)/(W3-W2))
 
МатросНаЗебре,
супер!!! А как найти пересечение нового графика со значением 4?
Изменено: evgeniygeo - 08.06.2021 11:06:09
 
Код
X4    =4
 
МатросНаЗебре,
Вы меня видимо неправильно поняли, значение 4 это столбец с данными D, на графике он также есть
Изменено: evgeniygeo - 08.06.2021 11:06:58
 
Цитата
evgeniygeo написал:
будут не прямыми
Цитата
buchlotnik написал:
ну по такому примеру
Соблюдение правил форума не освобождает от модераторского произвола
 
без дополнительных колонок, определив имена:
Стр, У, Х1, Х2, У1, У2
точка пересечения Х определяется интерполяцией
Код
=Х1+(У-У1)*(Х2-Х1)/(У2-У1)
Изменено: Ігор Гончаренко - 08.06.2021 10:49:56
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
W6            =ВПР(AB$2;AB:AH;6;-1)
X6            =ВПР(AB$2;AB:AH;7;-1)

Эти протянуть вниз
Z2            =(($X$3-$X$2)/($W$3-$W$2))*A2+($X$2*$W$3-$X$3*$W$2)/($W$3-$W$2)
AB2           =D2>Z2
AC2           =(Z3-Z2)/($A3-$A2)
AD2           =(Z2*$A3-Z3*$A2)/($A3-$A2)
AE2           =($D3-$D2)/($A3-$A2)
AF2           =($D2*$A3-$D3*$A2)/($A3-$A2)
AG2           =(AF2-AD2)/(AC2-AE2)
AH2           =AC2*AG2+AD2
 
МатросНаЗебре,
супер!!! То, что нужно
 
Код
G2    =ЕСЛИ(ЕПУСТО(F2);(F3-F1)/(A3-A1)*(A2-A1)+G1;F2)
 
МатросНаЗебре,
к сожалению в конце ставится 1,22, а это некорректно + данные иногда записываются через разное количество строк.
Может быть можно не учитывать пустые без этого доп.столбца?
Изменено: evgeniygeo - 08.06.2021 14:06:38
 
Цитата
evgeniygeo написал:
можно сделать без этого доп.столбца?
можно)
Цитата
Ігор Гончаренко написал:
без дополнительных колонок
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вариант с пользовательской функцией
Код
G2     =АПРОКС(A2;$F$2:$F$27;$A$2:$A$27)
В стандартный модуль
Код
Function АПРОКС(x As Double, значения_y As Variant, значения_x As Variant) As Double
    Dim arrY As Variant: arrY = значения_y
    Dim arrX As Variant: arrX = значения_x
    
    Dim y As Long
    Dim i As Long
    Dim j As Long
    For y = 1 To UBound(arrY, 1)
        If Not IsEmpty(arrY(y, 1)) Then
            If x >= arrX(y, 1) Then
                i = y
            Else
                Exit For
            End If
        End If
    Next
    
    For y = UBound(arrY, 1) To 1 Step -1
        If Not IsEmpty(arrY(y, 1)) Then
            If x <= arrX(y, 1) Then
                j = y
            Else
                Exit For
            End If
        End If
    Next
    
    If i > 0 Then
        If j = 0 Then
            For y = i - 1 To 1 Step -1
                If Not IsEmpty(arrY(y, 1)) Then
                    j = y
                    Exit For
                End If
            Next
        End If
    End If
    
    If j > 0 Then
        If i = 0 Then
            For y = j + 1 To UBound(arrY, 1)
                If Not IsEmpty(arrY(y, 1)) Then
                    i = y
                    Exit For
                End If
            Next
        End If
    End If
    
    Dim d As Double
    If i > 0 Then
        If j > 0 Then
            If i = j Then
                d = arrY(i, 1)
            Else
                d = (arrY(j, 1) - arrY(i, 1)) / ((arrX(j, 1) - arrX(i, 1))) * (x - arrX(i, 1)) + arrY(i, 1)
            End If
        Else
            Stop
        End If
    End If
    
    АПРОКС = d
End Function
Функция возвращает значение на ломанной линии, построенной по заданным точкам. Работает и с пустыми значениями y.
Страницы: 1 2 След.
Наверх