Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Interpolazione

  1. #1

    Interpolazione

    Ciao a tutti,
    vorrei sapere se esiste una classe/metodo che mi permetta di interpolare una serie di punti per ricavarne la funzione.

    Avete gi� un codice funzionante? Perch� non trovo nulla sulla documentazione ufficiale.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da vegetablu Visualizza il messaggio
    vorrei sapere se esiste una classe/metodo che mi permetta di interpolare una serie di punti per ricavarne la funzione.

    Avete gi� un codice funzionante? Perch� non trovo nulla sulla documentazione ufficiale.
    Esiste dove? Nel framework standard? Sicuramente no, non c'è nulla del genere. Poi scusa, quello che dici vorrebbe dire che: dati dei punti vuoi determinare la funzione es. y = 3x^2 + 4x + 1 ? Questo è altamente complesso, non credo sia "banale".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Esiste dove? Nel framework standard? Sicuramente no, non c'è nulla del genere. Poi scusa, quello che dici vorrebbe dire che: dati dei punti vuoi determinare la funzione es. y = 3x^2 + 4x + 1 ? Questo è altamente complesso, non credo sia "banale".
    Si intendevo proprio questo.
    Dati dei punti (x1,y1), (x2,y2), ......., (xn,yn) trovare la funzione interpolante.

    Quindi non esiste ed è molto complesso fare una cosa del genere?

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Se si sta parlando di interpolazione polinomiale
    https://en.wikipedia.org/wiki/Polynomial_interpolation

    non ti resta che compilare la matrice di Vandermonde.

    Commons di apache ha una libreria (math) che ti linko qui:

    http://commons.apache.org/proper/commons-math/

    che ha già implementato ogni cosa. Ti riporto un piccolo esempio da cui articolare
    codice:
    import org.apache.commons.math3.linear.*;
    
    /* ....
    .... 
    */
    private RealMatrix VandermondeMatrix;
    private RealVector Constants, CoefficientsMatrix;
    private int degree;
        
        private RealMatrix calculateVandermondeMatrix() {
            double[][] values = new double[degree+1][degree+1];
            for (int i = 0; i < values.length; i++) {
                for (int j = 0; j < (values[i].length-1); j++) {
                    values[i][j] = Math.pow(points[i].getX(), degree-j);
                }
                values[i][degree] = 1;
            }
            VandermondeMatrix = new Array2DRowRealMatrix(values);
            return VandermondeMatrix;
        }
    
    
        private RealVector getConstants() {
            double[] values = new double[degree+1];
            for (int i = 0; i < values.length; i++) {
                values[i] = points[i].getY();
            }
            Constants = new ArrayRealVector(values) ;
            return Constants;
        }
        
        private RealVector calculateCoefficientsMatrix() {
            DecompositionSolver solver = new LUDecomposition(this.VandermondeMatrix).getSolver();
            return solver.solve(Constants);
        }
    
    
    
    
    public PolynomialInterpolation(Point[] points) {
            this.points = points;        
            this.degree = points.length-1;
        }
    dove la classe Point (in realtà inutile, ma visto che ho riutilizzato codice di un vecchio progetto me la sono trovata tra i piedi) altro non è che una classe che modellizza un punto nel piano (2D) e che ha solo due campi, x, y e metodi getter e setter.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Quote Originariamente inviata da Andrea1979 Visualizza il messaggio
    Se si sta parlando di interpolazione polinomiale
    https://en.wikipedia.org/wiki/Polynomial_interpolation

    non ti resta che compilare la matrice di Vandermonde.

    Commons di apache ha una libreria (math) che ti linko qui:

    http://commons.apache.org/proper/commons-math/

    che ha già implementato ogni cosa. Ti riporto un piccolo esempio da cui articolare
    codice:
    import org.apache.commons.math3.linear.*;
    
    /* ....
    .... 
    */
    private RealMatrix VandermondeMatrix;
    private RealVector Constants, CoefficientsMatrix;
    private int degree;
        
        private RealMatrix calculateVandermondeMatrix() {
            double[][] values = new double[degree+1][degree+1];
            for (int i = 0; i < values.length; i++) {
                for (int j = 0; j < (values[i].length-1); j++) {
                    values[i][j] = Math.pow(points[i].getX(), degree-j);
                }
                values[i][degree] = 1;
            }
            VandermondeMatrix = new Array2DRowRealMatrix(values);
            return VandermondeMatrix;
        }
    
    
        private RealVector getConstants() {
            double[] values = new double[degree+1];
            for (int i = 0; i < values.length; i++) {
                values[i] = points[i].getY();
            }
            Constants = new ArrayRealVector(values) ;
            return Constants;
        }
        
        private RealVector calculateCoefficientsMatrix() {
            DecompositionSolver solver = new LUDecomposition(this.VandermondeMatrix).getSolver();
            return solver.solve(Constants);
        }
    
    
    
    
    public PolynomialInterpolation(Point[] points) {
            this.points = points;        
            this.degree = points.length-1;
        }
    dove la classe Point (in realtà inutile, ma visto che ho riutilizzato codice di un vecchio progetto me la sono trovata tra i piedi) altro non è che una classe che modellizza un punto nel piano (2D) e che ha solo due campi, x, y e metodi getter e setter.
    Grazie.
    Mi basta inserire i miei punti dentro una matrice e passarla alla funzione
    PolynomialInterpolation ??
    Ma come parametro riceve un Point (teoricamente è una matrice)?
    Non lo so, ma mi sono confuso ahahhaha.

    Inoltre, a che mi serve il getConstants e il calculateCoefficientsMatrix() ??

    Forse questi metodi valgono per il tuo progetto, giusto? A me serve prendere spunto solo dalle formule della matrice di Vandermonde ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ok, faccio prima a scriverti un esempio completo:
    codice:
    package interpolation;
    
    
    import org.apache.commons.math3.linear.*;
    
    
    /**
     *
     * @author Andrea
     */
    public class PolynomialInterpolation {    
        
        private Point[] points;
        private RealMatrix VandermondeMatrix;
        private RealVector Constants, CoefficientsMatrix;
        private int degree;
        
        private RealMatrix calculateVandermondeMatrix() {
            double[][] values = new double[degree+1][degree+1];
            for (int i = 0; i < values.length; i++) {
                for (int j = 0; j < (values[i].length-1); j++) {
                    values[i][j] = Math.pow(points[i].getX(), degree-j);
                }
                values[i][degree] = 1;
            }
            VandermondeMatrix = new Array2DRowRealMatrix(values);
            return VandermondeMatrix;
        }
    
    
        private RealVector getConstants() {
            double[] values = new double[degree+1];
            for (int i = 0; i < values.length; i++) {
                values[i] = points[i].getY();
            }
            Constants = new ArrayRealVector(values) ;
            return Constants;
        }
        
        private RealVector calculateCoefficientsMatrix() {
            DecompositionSolver solver = new LUDecomposition(this.VandermondeMatrix).getSolver();
            return solver.solve(Constants);
        }
        
        public PolynomialInterpolation(Point[] points) {
            this.points = points;        
            this.degree = points.length-1;
            VandermondeMatrix = this.calculateVandermondeMatrix();
            Constants = this.getConstants();
            CoefficientsMatrix = this.calculateCoefficientsMatrix();
        }
        
        public PolynomialInterpolation() {
            this(new Point[]{
                new Point(0,1), 
                new Point (2,5)
            });
        }
        
        public String toString() {        
            double[] coeff = CoefficientsMatrix.toArray();        
            StringBuffer buf = new StringBuffer();
            String sign;
            String exp;
            double pivot;
            for (int i = degree; i >= 0; i--) {
                pivot = coeff[coeff.length-i-1];            
                //sign = (pivot > 0 ? "+" : (pivot < 0 ? "-" : ""));
                sign = (pivot > 0 ? "+" : "");
                exp = (i == 1 ? "x" : "x^"+i);
                buf.append(i != 0 ? (" "+sign+pivot+exp+" ") : " "+sign+pivot);
            }        
            return buf.toString();
        }
        
        public static void main (String[] args) {
            
            PolynomialInterpolation pi = new PolynomialInterpolation(new Point[] {
                new Point (0, 1), 
                new Point (2, 5),
                new Point (3, -6)
            });
            
            /*
            PolynomialInterpolation pi = new PolynomialInterpolation(new Point[] {
                new Point (0, 0),
                new Point (1, 0.8415),
                new Point (2, 0.9093),
                new Point (3, 0.1411),
                new Point (4, -0.7568),
                new Point (5, -0.9589),
                new Point (6, -0.2794)
            });
            */
            String result = pi.toString();
            System.out.println(result);
            
        }
        
    }
    e questa è la classe Point
    codice:
    package interpolation;
    
    
    /**
     *
     * @author Andrea
     */
    public class Point {
        
            double x;
            double y;
            
            public double getX() {
                return this.x;
            }
            
            public double getY() {
                return this.y;
            }
            
            public void setX (double x) {
                this.x = x;
            }
            
            public void setY (double y) {
                this.y = y;
            }
            
            public Point (double x, double y) {
                this.x = x;
                this.y = y;
            }
            
            public String toString() {
                return new String("["+x+" , "+y+"]");
            }
        }
    Per inciso, la parte commentata relativa all'interpolazione di 6 punti, usa i dati trovati sulla pagina di wikipedia:

    https://it.wikipedia.org/wiki/Interp...ne_polinomiale

    e come potrai verificare ritorna (in notazione scientifica) i risultati che trovi nella pagina stessa.

    Venendo ai tuoi dubbi: tu hai una serie di punti (specifica del tuo progetto nel primo messaggio), ed io parto da una serie di punti (array di Point). Ti vuoi una funziona interpolatrice (assunto: un polinomio) ed lì hai una matrice (array) coefficientMatrix che rappresenta i coefficienti del tuo polinomio interpolatore. Il resto sono metodi di appoggio
    Ultima modifica di Andrea1979; 21-03-2017 a 13:19
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.