Intersezione tra curve di un grafico

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
(Nikolay)
00lunedì 16 settembre 2013 17:36
[SM=g27823] buona sera,

date due curve di cui dispongo il grafico in excel, è possibile determinarne gli eventuali punti di intersezione?

grazie
patel45
00lunedì 16 settembre 2013 18:12
tutto dipende dai dati di partenza, hai una serie di coordinate o le equazioni delle curve ? se alleghi il file possiamo provarci
(Nikolay)
00martedì 24 settembre 2013 21:16
buona sera,

date 2 ( o più ) curve in un grafico che si intersecano in uno ( o più) punti, è possibile individuare le coordinate del ( dei) punto ( punti) di intersezione?

Grazie [SM=g27823]
patel45
00mercoledì 25 settembre 2013 05:59
hai già avuto la risposta qui http://freeforumzone.leonardo.it/discussione.aspx?idd=10697042
inutile aprire una nuova discussione, bastava riprendere la vecchia rispondendo alle domande.
by sal
00mercoledì 25 settembre 2013 06:45
Grafico
Ciao come ha detto Patel che saluto, ho dovuto unire le 2 richieste, inutile aprire più post sullo stesso argomento basta rispondere al vecchio che si riporta in testa alle richieste.

comunque si può fare, ma devi inserire il tuo file con i dati, perchè i dati devono essere elaborati per determinare il punto di intersezione.

Ciao By Sal [SM=x423051]

(Nikolay)
00giovedì 26 settembre 2013 18:01
ciao a tutti,
scusate se ho scritto 2 volte lo stesso post, ma mi trovo in un luogo in cui la connessione è scarsissima e non si sa che ho combinato.. [SM=g27833]

Se possiedo le equazioni delle curve, il gioco è fatto poichè mi basta disegnarle inserendo un numero maggiore di dati e l'intersezione tra le 2 curve avviene per i valori delle ascisse a cui corrispondono stesse le ordinate..

Analogamente, se non possiedo le equazioni delle curve posso lavorare con le equazioni delle curve di tendenza e ripetere il procedimento di cui sopra.

Nell 'esempio che allego però, le due curve rappresentate non sono ben descritte dalle loro curve di tendenza e perciò mi risulta difficile trovare il punto di intersezione tra le due.
Potrei linearizzare la funzione nell'intorno del punto di intersezione, ma anche in questo caso il risultato sarebbe piuttosto approssimato..

[SM=x423017]
patel45
00giovedì 26 settembre 2013 19:43
(Nikolay), 26/09/2013 18:01:


Potrei linearizzare la funzione nell'intorno del punto di intersezione, ma anche in questo caso il risultato sarebbe piuttosto approssimato..
[SM=x423017]


Excel non fa miracoli, l'unica possibilità è individuare i due segmenti che si intersecano e calcolarne l'intersezione.
patel45
00giovedì 26 settembre 2013 19:52
vedi esempio allegato
(Nikolay)
00giovedì 26 settembre 2013 20:56
E' perfetto!

Spiegami adesso per favore come faccio a richiamare la tua formula in un mio file senza dover aprire il tuo file.

6 grande!
patel45
00venerdì 27 settembre 2013 07:31
ricopia il seguente codice (modulo BasIntersection) in un modulo del tuo file ed usa la funzione come hai visto nell'esempio.
'
Public Function IntersectComplex(x1 As Double, y1 As Double, x2 As Double, y2 As Double, LineCoordinates As Range, Axis As Boolean) As Variant
'
' Complex Intersect.
' Because the line segments are not uniformly spaced the (xy,y1)(x2,y2) could cross
' at any point along the other line
'
' Return
' If intersection
'    requested coordinate
' else
'    nothing
' endif
' Axis=True returns X value
' Axis=False returns Y value
'
    Dim dblCrossX As Double
    Dim dblCrossY As Double
    Dim dblTestx1 As Double
    Dim dblTesty1 As Double
    Dim dblTestx2 As Double
    Dim dblTesty2 As Double
    Dim intSegment As Integer
    
    With LineCoordinates
        For intSegment = 1 To .Rows.Count - 1
            dblTestx1 = .Cells(intSegment, 1)
            dblTesty1 = .Cells(intSegment, 2)
            dblTestx2 = .Cells(intSegment + 1, 1)
            dblTesty2 = .Cells(intSegment + 1, 2)
            If m_CalculateIntersecti0n(x1, y1, x2, y2, dblTestx1, dblTesty1, dblTestx2, dblTesty2, dblCrossX, dblCrossY) Then
                If Axis Then
                    IntersectComplex = dblCrossX
                Else
                    IntersectComplex = dblCrossY
                End If
                Exit Function
            End If
        Next
    
        ' Special check for last pairing
        intSegment = .Rows.Count
        dblTestx1 = .Cells(intSegment, 1)
        dblTesty1 = .Cells(intSegment, 2)
        dblTestx2 = .Cells(intSegment, 1)
        dblTesty2 = .Cells(intSegment, 2)
        If m_CalculateIntersecti0n(x1, y1, x2, y2, dblTestx1, dblTesty1, dblTestx2, dblTesty2, dblCrossX, dblCrossY) Then
            If Axis Then
                IntersectComplex = dblCrossX
            Else
                IntersectComplex = dblCrossY
            End If
            Exit Function
        End If
        
    End With
    IntersectComplex = CVErr(xlErrNA)    ' Null
    
End Function
Private Function m_CalculateIntersecti0n(x1 As Double, y1 As Double, x2 As Double, y2 As Double, _
    x3 As Double, y3 As Double, x4 As Double, y4 As Double, _
    ByRef CrossX As Double, ByRef CrossY As Double) As Variant

'Call with x1,y1,x2,y2,x3,y3,x4,y4 and returns intersect,x,y
'
'Where:
' x1,y1,x2,y2,x3,y3,x4,y4 are the end points of two line segments
'Returns:
' intersect is true/false, and x,y is the interecting point if intersect is true
'
'Description:
'
'Equations for the lines are:
' Pa = P1 + Ua(P2 - P1)
' Pb = P3 + Ub(P4 - P3)
'
'Solving for the point where Pa = Pb gives the following equations for ua and ub
'
' Ua = ((x4 - x3) * (y1 - y3) - (y4 - y3 ) * (x1 - x3)) / ((y4 - y3) * (x2 - x1)
'     - (x4 - x3) * (y2 - y1))
' Ub = ((x2 - x1) * (y1 - y3) - (y2 - y1 ) * (x1 - x3)) / ((y4 - y3) * (x2 - x1)
'     - (x4 - x3) * (y2 - y1))
'
'Substituting either of these into the corresponding equation for the line gives
'     the intersection point.
'For example the intersection point (x,y) is
' x = x1 + Ua(x2 - x1)
' y = y1 + Ua(y2 - y1)
'
'Notes:
' - The denominators are the same.
'
' - If the denominator above is 0 then the two lines are parallel.
'
' - If the denominator and numerator are 0 then the two lines are coincident.
'
' - The equations above apply to lines,
'     if the intersection of line segments is
'     required then it is only necessary to test if ua and ub lie between 0 and 1.
'     Whichever one lies within that range then the corresponding line segment
'     contains the intersection point. If both lie within the range of 0 to 1 then
'     the intersection point is within both line segments.
'
    Dim dblDenominator As Double
    Dim dblUa As Double
    Dim dblUb As Double
    'Pre calc the denominator, if zero then
    '     both lines are parallel and there is no
    '     intersection
    dblDenominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1))

    If dblDenominator <> 0 Then
        'Solve for the simultaneous equations
        dblUa = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / dblDenominator
        dblUb = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / dblDenominator
    Else
    
        If (x1 = x3) And (y1 = y3) Then
            CrossX = x1
            CrossY = y1
            m_CalculateIntersection = True
        Else
            m_CalculateIntersection = False
        End If
        Exit Function
    End If
    'Could the lines intersect?
    
    If dblUa > 0 And dblUa < 1 And dblUb > 0 And dblUb < 1 Then
        'Calculate the intersection point
        CrossX = x1 + dblUa * (x2 - x1)
        CrossY = y1 + dblUa * (y2 - y1)
        'Yes, they do
        m_CalculateIntersection = True
    ElseIf dblUa = 0 And dblUb = 0 Then
    ' cross at a segment start
        CrossX = x1
        CrossY = y1
        'Yes, they do
        m_CalculateIntersection = True
    ElseIf dblUa = 1 And (dblUb > 0 And dblUb < 1) Then
        ' cross at right angles or ends on other line
        CrossX = x2
        CrossY = y1
        'Yes, they do
        m_CalculateIntersection = True
        
    ElseIf dblUb = 1 And (dblUa > 0 And dblUa < 1) Then
        ' cross at right angles or ends on other line
        CrossX = x1
        CrossY = y3
        'Yes, they do
        m_CalculateIntersection = True
        
    ElseIf dblUa = 1 And dblUb = 1 Then
    ' cross at a segment end
        CrossX = x2
        CrossY = y2
        m_CalculateIntersection = True
    Else
        'No, they do not
        m_CalculateIntersection = False
    End If
    
End Function

(Nikolay)
00martedì 22 ottobre 2013 09:37
grazie 1000! :)
Mario Festa
00sabato 21 gennaio 2017 21:59
Saluti
Saluti a tutti!
Spiegate anche a me come si trova il punto d'intersezione tra le due curve? ma in modo molto elementare!
patel45
00domenica 22 gennaio 2017 09:01
ci sono 2 modi:
1) se hai l'equazione delle curve per ogni x controlli la Y di ambedue, quando la Y è uguale hai l'intersezione
2) se ha solo alcuni punti determini l'equazione della retta che passa per 2 punti contigui per ambedue le curve e ne calcoli l'intersezione, se questa si trova tra i 2 punti è quella cercata, ovviamente il calcolo è approssimato.
Mario Festa
00lunedì 23 gennaio 2017 17:37
Sì, con i grafici è facile ma dal punto di vista matematico come fai?
come si determinano le coordinate del/i punto/i d'intersezione?
patel45
00lunedì 23 gennaio 2017 20:08
questo non è un forum di matematica, devi risolvere il sistema delle 2 equazioni.
Mario Festa
00lunedì 23 gennaio 2017 22:11
e quella routine del post che hai pubblicato più sopra a cosa servirebbe?
patel45
00martedì 24 gennaio 2017 08:21
calcolo l'intersezione dei vari segmenti che interpolano le curve, risolvendo il sistema delle equazioni, con questo metodo
http://www.youmath.it/domande-a-risposte/view/6286-intersezione-tra-due-rette.html
Mario Festa
00martedì 24 gennaio 2017 17:05
Ma come funziona? ho provato a creare una macro copiandola ma mi dà il messaggio che manca End Sub.
Il link che hai inserito parla dell'intersezione tra due rette, a me servirebbe tra due funzioni qualsiasi ma in Excel.
patel45
00martedì 24 gennaio 2017 18:30
facciamo a non capirci, la macro riportata sopra non lavora con le funzioni, ma con i punti e quindi, come già detto, trova l'equazione della retta che passa per 2 punti contigui per ambedue le curve e ne calcola l'intersezione, se esiste OK, altrimenti passa ai punti successivi.
Nel caso di funzioni il calcolo matematico (non approssimato) dell'intersezione è più complicato del caso delle rette e non è alla mia portata, non sono un matematico.
Però stiamo parlando in generale, forse se poni un problema reale potremmo approfondire meglio.
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 17:15.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com