Excel e gli applicativi Microsoft Office Interpolazione lineare dati da tabella con 2 dati in ingresso

Login Registrati
Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #3690 Score: 0 | Risposta

    Unfair
    Partecipante
      Ciao a tutti!
       
      vorrei sottoporvo una questione excelifera... 🙂
       
      Vorrei effettuare una interpolazioni dati da una tabella entrando con due dati di input.
      In particolare, ho una tabella di X righe ed Y colonne.
      La tabella raggruppa, per alcune coppie di parametri L e M, i valori di un terzo parametri F. 
      Io vorrei effettuare una interpolazione dati da tabella ovvero, entrando con valori di L e M a piacere (e intermedi) rispetto a quelli tabellati calcolare in maniera automatica il valore di F corrispondente.
       
      in particolare nel mio caso avrei...
      Colonna A1:A7 parametri di riferimento per L,
      Riga B2:F2 parametri di riferimento per M,
      Celle B3:F7, valori di F tabellati e corrispondenti alle coppie A-B di valori di riferimento
       
      Cella I3 valore di ingresso in tabella per L a piacere
      Cella I4 valore di ingresso in tabella per M a piacere
      Cella I5 valore di F calcolato mediante interpolazione dati da tabella in funzione di L e M definiti a piacere.
       
      Qualcuno saprebbe indirizzarmi? Spero di essere stato abbastanza chiaro nell'esposizione! 😛
      Grazie in anticipo
      Allegati:
      You must be logged in to view attached files.
      #3693 Score: 0 | Risposta

      Luca73
      Partecipante
        58 pts
        Ciao 
        il problema si divide in due parti
        la prima analitico matematica in cui definire cosa intendi per interpolazione lineare e come effettuarla (matematicamente intendo)
        il secondo problema è come applicare la teoria di cui al punto precedente in Excel
         
        Ci lavoro un attimo e ti faccio sapere
         
        #3695 Score: 0 | Risposta

        patel
        Moderatore
          51 pts
          più che interpolazione lineare mi sembra interpolazione spaziale
          #3696 Score: 0 | Risposta

          Luca73
          Partecipante
            58 pts
            Ciao Prova con le due function qui sotto riportate 
            La seconda viene richiamata dalla prima.
             
            RegLin2Var devi poi richiamarla nel foglio
            Elenco X sono i valori della prima variabile in orizzontale (nel tuo caso i numeri verdi o B2F2)
            Elenco Y sono i valori della prima variabile in Verticale (nel tuo caso i numeri blu o A3:A7)
            X e Y note sono i valori in I3 e I4 (da selezionare coerentemente con le definizione di X e Y per gli elenchi.
            Metodo è vero o falso manon dovrebbe cambiare nulla
             
            Fammi sapere Ciao Luca
             
            Option Explicit
            
            Public Function RegLin2Var(ElencoX As Range, ElencoY As Range, XNota, YNota, Optional Metodo As Boolean)
                
                Dim Xmin As Range
                Dim Xmax As Range
                Dim Ymin  As Range
                Dim Ymax As Range
                Dim CellaW As Range
                Dim ValXmaxYmax As Range
                Dim ValXminYmax As Range
                Dim ValXmaxYmin As Range
                Dim ValXminYmin As Range
                
                
                Dim RegLinXmin
                Dim RegLinXmax
                Dim RegLinYmin
                Dim RegLinYmax
                
                Dim RegLinXY1
                Dim RegLinXY2
                
                
                Set Xmin = ElencoX.Cells(1.1)
                Set Xmax = ElencoX.Cells(1.1)
                Set Ymin = ElencoY.Cells(1.1)
                Set Ymax = ElencoY.Cells(1.1)
                
                
                For Each CellaW In ElencoX
                    If CellaW < Xmin Then
                        Set Xmin = CellaW
                    End If
                    If CellaW > Xmax Then
                        Set Xmax = CellaW
                    End If
                Next
                For Each CellaW In ElencoY
                    If CellaW < Ymin Then
                        Set Ymin = CellaW
                    End If
                    If CellaW > Ymax Then
                        Set Ymax = CellaW
                    End If
                Next
                   
                For Each CellaW In ElencoX
                    If CellaW < = XNota Then
                        If CellaW > Ymin Then
                            Set Xmin = CellaW
                        End If
                    End If
                    If CellaW >= XNota Then
                        If CellaW < Xmax Then
                            Set Xmax = CellaW
                        End If
                    End If
                Next
                For Each CellaW In ElencoY
                    If CellaW <= YNota Then
                        If CellaW > Ymin Then
                            Set Ymin = CellaW
                        End If
                    End If
                    If CellaW >= YNota Then
                        If CellaW < Ymax Then
                            Set Ymax = CellaW
                        End If
                    End If
                Next
                
                Set ValXmaxYmax = Intersect(Xmax.EntireColumn, Ymax.EntireRow)
                Set ValXminYmax = Intersect(Xmin.EntireColumn, Ymax.EntireRow)
                Set ValXmaxYmin = Intersect(Xmax.EntireColumn, Ymin.EntireRow)
                Set ValXminYmin = Intersect(Xmin.EntireColumn, Ymin.EntireRow)
                
                RegLinXmin = RegLin(Ymin, ValXminYmin, Ymax, ValXminYmax, YNota)
                RegLinXmax = RegLin(Ymin, ValXmaxYmin, Ymax, ValXmaxYmax, YNota)
                RegLinYmin = RegLin(Xmin, ValXminYmin, Xmax, ValXmaxYmin, XNota)
                RegLinYmax = RegLin(Xmin, ValXminYmax, Xmax, ValXmaxYmax, XNota)
                
                RegLinXY1 = RegLin(Xmin, RegLinXmin, Xmax, RegLinXmax, XNota)
                RegLinXY2 = RegLin(Ymin, RegLinYmin, Ymax, RegLinYmax, YNota)
                
            
                If Metodo Then
                    RegLin2Var = RegLinXY1
                Else
                    RegLin2Var = RegLinXY2
                End If
                
            End Function
            
            Public Function RegLin(X_Nota1, Y_Nota1, X_Nota2, Y_Nota2, X_Incognita)
                RegLin = Y_Nota1 + (X_Incognita - X_Nota1) * (Y_Nota2 - Y_Nota1) / (X_Nota2 - X_Nota1)
            End Function
            
            #3715 Score: 0 | Risposta

            Unfair
            Partecipante
              Ciao Luca!
               
              sei stato gentilissimo e il codice funziona alla grande! Me lo sono controllato ben bene e le tutto mi torna... L'unico aspetto però è che non riesce a produrre un risultato se vengono inseriti i valori spaccati di tabella (naturalmente perchè il denominatore di RegLin va a 0). Adesso provo a lavorarci un attimo e se riesco a fixare posto il codice 🙂
               
              Grazie ancora! 
              #3720 Score: 0 | Risposta

              Unfair
              Partecipante
                Ho provato a integrare il codice contemplando i casi di coincidenza di righe e colonne cercado di bypassare il den =0  però non mi restituisce il valore... 
                 
                Questo è il codice... riuscite a darmi una dritta?? Grazie mille!! 
                 
                Option Explicit
                
                Public Function RegLin2Var(ElencoX As Range, ElencoY As Range, XNota, YNota, Optional Metodo As Boolean)
                    
                    Dim Xmin As Range
                    Dim Xmax As Range
                    Dim Ymin  As Range
                    Dim Ymax As Range
                    Dim CellaW As Range
                    Dim ValXmaxYmax As Range
                    Dim ValXminYmax As Range
                    Dim ValXmaxYmin As Range
                    Dim ValXminYmin As Range
                    
                    
                    Dim RegLinXmin
                    Dim RegLinXmax
                    Dim RegLinYmin
                    Dim RegLinYmax
                    
                    Dim RegLinXY1
                    Dim RegLinXY2
                    
                    
                    Set Xmin = ElencoX.Cells(1.1)
                    Set Xmax = ElencoX.Cells(1.1)
                    Set Ymin = ElencoY.Cells(1.1)
                    Set Ymax = ElencoY.Cells(1.1)
                    
                    
                    For Each CellaW In ElencoX
                        If CellaW < Xmin Then
                            Set Xmin = CellaW
                        End If
                        If CellaW > Xmax Then
                            Set Xmax = CellaW
                        End If
                    Next
                    For Each CellaW In ElencoY
                        If CellaW < Ymin Then
                            Set Ymin = CellaW
                        End If
                        If CellaW > Ymax Then
                            Set Ymax = CellaW
                        End If
                    Next
                       
                    For Each CellaW In ElencoX
                        If CellaW < = XNota Then
                            If CellaW > Ymin Then
                                Set Xmin = CellaW
                            End If
                        End If
                        If CellaW >= XNota Then
                            If CellaW < Xmax Then
                                Set Xmax = CellaW
                            End If
                        End If
                    Next
                    For Each CellaW In ElencoY
                        If CellaW <= YNota Then
                            If CellaW > Ymin Then
                                Set Ymin = CellaW
                            End If
                        End If
                        If CellaW >= YNota Then
                            If CellaW < Ymax Then
                                Set Ymax = CellaW
                            End If
                        End If
                    Next
                    
                    Set ValXmaxYmax = Intersect(Xmax.EntireColumn, Ymax.EntireRow)
                    Set ValXminYmax = Intersect(Xmin.EntireColumn, Ymax.EntireRow)
                    Set ValXmaxYmin = Intersect(Xmax.EntireColumn, Ymin.EntireRow)
                    Set ValXminYmin = Intersect(Xmin.EntireColumn, Ymin.EntireRow)
                    
                
                If ((ValXmaxYmax = ValXminYmax) & (ValXmaxYmax = ValXmaxYmin) & (ValXmaxYmax = ValXminYmin)) = 1 Then 'COINCIDENZA DELLA RIGA E DELLA COLONNA
                    RegLinXmin = ValXmaxYmax
                    RegLinXmax = ValXmaxYmax
                    RegLinYmin = ValXmaxYmax
                    RegLinYmax = ValXmaxYmax
                    RegLinXY1 = ValXmaxYmax
                    RegLinXY2 = RegLinXY1
                    
                'COINCIDENZA DELLA RIGA
                    ElseIf ((ValXminYmin = ValXminYmax) & (ValXmaxYmin = ValXmaxYmax)) = 1 Then
                    RegLinXmin = ValXminYmin 'VALORE IN COLONNA
                    RegLinXmax = ValXmaxYmin 'VALORE IN COLONNA
                    RegLinYmin = RegLin(Xmin, ValXminYmin, Xmax, ValXmaxYmin, XNota) 'VALORE IN RIGA
                    RegLinYmax = RegLin(Xmin, ValXminYmax, Xmax, ValXmaxYmax, XNota) 'VALORE IN RIGA
                    RegLinXY1 = RegLinXmin
                    RegLinXY2 = RegLinYmin
                    
                ' COINCIDENZA DELLA COLONNA
                    ElseIf ((ValXminYmin = ValXmaxYmin) & (ValXminYmax = ValXmaxYmax)) = 1 Then
                    RegLinXmin = RegLin(Ymin, ValXminYmin, Ymax, ValXminYmax, YNota) 'VALORE IN COLONNA
                    RegLinXmax = RegLin(Ymin, ValXmaxYmin, Ymax, ValXmaxYmax, YNota) 'VALORE IN COLONNA
                    RegLinYmin = ValXminYmin 'VALORE IN RIGA
                    RegLinYmax = ValXminYmax  'VALORE IN RIGA
                    RegLinXY1 = RegLinXmin
                    RegLinXY2 = RegLinYmin
                    
                    
                'NESSUNA COINCIDENZA
                    Else
                    RegLinXmin = RegLin(Ymin, ValXminYmin, Ymax, ValXminYmax, YNota) 'VALORE IN COLONNA
                    RegLinXmax = RegLin(Ymin, ValXmaxYmin, Ymax, ValXmaxYmax, YNota) 'VALORE IN COLONNA
                    RegLinYmin = RegLin(Xmin, ValXminYmin, Xmax, ValXmaxYmin, XNota) 'VALORE IN RIGA
                    RegLinYmax = RegLin(Xmin, ValXminYmax, Xmax, ValXmaxYmax, XNota) 'VALORE IN RIGA
                    RegLinXY1 = RegLin(Xmin, RegLinXmin, Xmax, RegLinXmax, XNota)
                    RegLinXY2 = RegLin(Ymin, RegLinYmin, Ymax, RegLinYmax, YNota)
                   
                End If
                
                    If Metodo Then
                        RegLin2Var = RegLinXY1
                    Else
                        RegLin2Var = RegLinXY2
                    End If
                
                
                    
                    
                    
                End Function
                
                Public Function RegLin(X_Nota1, Y_Nota1, X_Nota2, Y_Nota2, X_Incognita)
                    RegLin = Y_Nota1 + (X_Incognita - X_Nota1) * (Y_Nota2 - Y_Nota1) / (X_Nota2 - X_Nota1)
                End Function
                Allegati:
                You must be logged in to view attached files.
                #3729 Score: 0 | Risposta

                Unfair
                Partecipante
                  Ecco il codice fixato... fatemi sapere cosa ne pensate, se vi pare corretto e se avete consigli sulla stesura in forma piu efficiente! Siete stati gentilissimi!!
                   
                  Option Explicit
                  
                  Public Function RegLin2Var(ElencoX As Range, ElencoY As Range, XNota, YNota, Optional Metodo As Boolean)
                      
                      Dim Xmin As Range
                      Dim Xmax As Range
                      Dim Ymin  As Range
                      Dim Ymax As Range
                      Dim CellaW As Range
                      Dim ValXmaxYmax As Range
                      Dim ValXminYmax As Range
                      Dim ValXmaxYmin As Range
                      Dim ValXminYmin As Range
                      
                      
                      Dim RegLinXmin
                      Dim RegLinXmax
                      Dim RegLinYmin
                      Dim RegLinYmax
                      
                      Dim RegLinXY1
                      Dim RegLinXY2
                      
                      
                      Set Xmin = ElencoX.Cells(1.1)
                      Set Xmax = ElencoX.Cells(1.1)
                      Set Ymin = ElencoY.Cells(1.1)
                      Set Ymax = ElencoY.Cells(1.1)
                      
                      
                      For Each CellaW In ElencoX
                          If CellaW < Xmin Then
                              Set Xmin = CellaW
                          End If
                          If CellaW > Xmax Then
                              Set Xmax = CellaW
                          End If
                      Next
                      For Each CellaW In ElencoY
                          If CellaW < Ymin Then
                              Set Ymin = CellaW
                          End If
                          If CellaW > Ymax Then
                              Set Ymax = CellaW
                          End If
                      Next
                         
                      For Each CellaW In ElencoX
                          If CellaW < = XNota Then
                              If CellaW > Ymin Then
                                  Set Xmin = CellaW
                              End If
                          End If
                          If CellaW >= XNota Then
                              If CellaW < Xmax Then
                                  Set Xmax = CellaW
                              End If
                          End If
                      Next
                      For Each CellaW In ElencoY
                          If CellaW <= YNota Then
                              If CellaW > Ymin Then
                                  Set Ymin = CellaW
                              End If
                          End If
                          If CellaW >= YNota Then
                              If CellaW < Ymax Then
                                  Set Ymax = CellaW
                              End If
                          End If
                      Next
                      
                      Set ValXmaxYmax = Intersect(Xmax.EntireColumn, Ymax.EntireRow)
                      Set ValXminYmax = Intersect(Xmin.EntireColumn, Ymax.EntireRow)
                      Set ValXmaxYmin = Intersect(Xmax.EntireColumn, Ymin.EntireRow)
                      Set ValXminYmin = Intersect(Xmin.EntireColumn, Ymin.EntireRow)
                      
                  
                  If ((Xmin = Xmax) And (Ymin = Ymax)) Then 'COINCIDENZA DELLA RIGA E DELLA COLONNA
                      RegLinXmin = ValXmaxYmax
                      RegLinXmax = ValXmaxYmax
                      RegLinYmin = ValXmaxYmax
                      RegLinYmax = ValXmaxYmax
                      RegLinXY1 = ValXmaxYmax
                      RegLinXY2 = RegLinXY1
                      GoTo Fine
                  'COINCIDENZA DELLA RIGA
                      ElseIf (Ymin = Ymax) Then
                      RegLinXmin = ValXminYmin 'VALORE IN COLONNA
                      RegLinXmax = ValXmaxYmin 'VALORE IN COLONNA
                      RegLinYmin = RegLin(Xmin, ValXminYmin, Xmax, ValXmaxYmin, XNota) 'VALORE IN RIGA
                      RegLinYmax = RegLin(Xmin, ValXminYmax, Xmax, ValXmaxYmax, XNota) 'VALORE IN RIGA
                      RegLinXY1 = RegLinYmin
                      RegLinXY2 = RegLinYmin
                      GoTo Fine
                  ' COINCIDENZA DELLA COLONNA
                      ElseIf (Xmin = Xmax) Then
                      RegLinXmin = RegLin(Ymin, ValXminYmin, Ymax, ValXminYmax, YNota) 'VALORE IN COLONNA
                      RegLinXmax = RegLin(Ymin, ValXmaxYmin, Ymax, ValXmaxYmax, YNota) 'VALORE IN COLONNA
                      RegLinYmin = ValXminYmin 'VALORE IN RIGA
                      RegLinYmax = ValXminYmax  'VALORE IN RIGA
                      RegLinXY1 = RegLinXmin
                      RegLinXY2 = RegLinXmin
                      GoTo Fine
                      
                  'NESSUNA COINCIDENZA
                      Else
                      RegLinXmin = RegLin(Ymin, ValXminYmin, Ymax, ValXminYmax, YNota) 'VALORE IN COLONNA
                      RegLinXmax = RegLin(Ymin, ValXmaxYmin, Ymax, ValXmaxYmax, YNota) 'VALORE IN COLONNA
                      RegLinYmin = RegLin(Xmin, ValXminYmin, Xmax, ValXmaxYmin, XNota) 'VALORE IN RIGA
                      RegLinYmax = RegLin(Xmin, ValXminYmax, Xmax, ValXmaxYmax, XNota) 'VALORE IN RIGA
                      RegLinXY1 = RegLin(Xmin, RegLinXmin, Xmax, RegLinXmax, XNota)
                      RegLinXY2 = RegLin(Ymin, RegLinYmin, Ymax, RegLinYmax, YNota)
                     
                  End If
                  Fine:
                      If Metodo Then
                          RegLin2Var = RegLinXY1
                      Else
                          RegLin2Var = RegLinXY2
                      End If
                  
                  End Function
                  
                  Public Function RegLin(X_Nota1, Y_Nota1, X_Nota2, Y_Nota2, X_Incognita)
                      RegLin = Y_Nota1 + (X_Incognita - X_Nota1) * (Y_Nota2 - Y_Nota1) / (X_Nota2 - X_Nota1)
                  End Function
                  
                  Allegati:
                  You must be logged in to view attached files.
                Login Registrati
                Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
                Rispondi a: Interpolazione lineare dati da tabella con 2 dati in ingresso
                Gli allegati sono permessi solo ad utenti REGISTRATI
                Le tue informazioni: