2016-09-08 5 views
0

Mein Ziel ist es, ein Polynom mit gegebenen Koeffizienten zu erstellen, dann das Polynom auf geben Punkte auszuwerten. Verwenden Sie dann die PolynomialFunctionLagrangeForm-Klasse, um dasselbe Polynom erneut zu erstellen und dieselben Koeffizienten abzurufen.Polynomische Lagrange-Funktion, um die richtigen Koeffizienten zu erhalten

Allerdings bekomme ich unterschiedliche Koeffizienten sogar, dass beide Polynome den gleichen Grad haben.

Meine Frage ist, wie man die gleichen Koeffizienten erhält? Gibt es eine Möglichkeit, alle möglichen Polynome zu erhalten?

static double [] points= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
// Create polynomial using PolynomialFunction class 
PolynomialFunction pf = new PolynomialFunction(coeffecient); 
System.out.println("-------------------Encoding------------------ \nPolynomial degree: "+pf.degree()); 
System.out.println("Polynomial: "+pf); 
System.out.println("Coffecients: "); 
System.out.println(Arrays.toString(pf.getCoefficients())); 
evaluatePolynomial(pf, points); 
PolynomialFunctionLagrangeForm LF = new PolynomialFunctionLagrangeForm(points,polynomial_values); 
System.out.print("-------------------Decoding------------------ \nDegree of  Lagrange polynomial:"); 
System.out.println(LF.degree()); 
System.out.println("Polynomial: "+LF); 
System.out.println("Coffecient of Lagrange polynomial:"); 
System.out.println(Arrays.toString(LF.getCoefficients())); 

Ausgang:

-------------------Encoding------------------ 
Polynomial degree: 15 
Polynomial: 40.0 x - 53.0 x^2 - 8.0 x^3 - 29.0 x^4 + 99.0 x^5 + 71.0 x^6 - 86.0 x^7 + 127.0 x^8 + 35.0 x^9 + 14.0 x^10 - 53.0 x^11 + 121.0 x^12 - x^13 + 22.0 x^14 - 27.0 x^15 
Coffecients: 
[0.0, 40.0, -53.0, -8.0, -29.0, 99.0, 71.0, -86.0, 127.0, 35.0, 14.0, -53.0, 121.0, -1.0, 22.0, -27.0] 
-------------------Decoding------------------ 
Degree of Lagrange polynomial:15 
Polynomial: org.apache.c[email protected]5f150435 
Coffecient of Lagrange polynomial: 
[241664.0, -196608.0, 819200.0, -360448.0, 24576.0, -81920.0, 24576.0, -256.0, 640.0, -28.0, 18.0, -52.921875, 121.021484375, -1.000274658203125, 22.000003814697266, -27.000000070780516] 

aktualisieren

ich mit den folgenden Punkten

points= {34121,51152,59804,40922,41678,33985,55244,61576,41866,37365,63178,45530,52928,35006,34671,43212}; 

P(x)= 37.0 + 79.0 x + 95.0 x^2 - 118.0 x^3 + 66.0 x^4 - 47.0 x^5 - 64.0 x^6 + 77.0 x^7 + 7.0 x^8 + 113.0 x^9 - 81.0 x^10 + 36.0 x^11 - 33.0 x^12 + 7.0 x^13 - 91.0 x^14 + 80.0 x^15 

Das Ergebnis nach Auswertung auf Polynom

012.351.641 bleiben sollte jedoch
(points, P(points))= {(34121,7.914104306379832E69),(51152,3.435734636341671E72),(59804,3.5812547774323177E73),(40922,1.209012191911663E71),(41678, 1.5910403312602316E71),(33985,7.453917205941376E69),(55244, 1.0898275780150622E73),(61576,5.5495027051432293E73),(41866,1.702159385167097E71),(37365,3.0906623702059587E70),(63178,8.157747712897765E73),(45530,5.991614888661553E71),(52928,5.732748723914476E72),(35006,1.1620189256906411E70),(34671,1.005938101921578E70),(43212,2.736176231116627E71)}; 

, senden (Punkte, P (Punkte)) zu Lagrange-Interpolation erzeugen falsche Koeffizienten:

-7.125711012263528E27, -1.7102522454360707E26, -3.9998444109905895E24, -1.1156590815779537E23, -1.3650590614545068E21, -8.762203435012037E19, 1.36909428672063078E18, -1.125899906842624E17, 7.0368744177664E14, -2.3089744183296E13, 3.95136991232E11, -3.3554432E9, 1.572864E7, -110592.0, 192.0, 79.38. 

Jede vorgeschlagene Lösung?

+0

Müssen Sie 'computeCoefficients()' aufrufen, bevor Sie sie bekommen? Wenn nicht, ist es wahrscheinlich ein numerisches Problem. Welche Punkte füttern Sie? –

+0

@Nico Schertler Ich habe Punkte-Array in der Frage hinzugefügt. Ich habe 'computeCoefficients()' nicht aufgerufen, da 'getCoefficients()' Methodenaufrufe 'computeCoefficients()' aufruft. Außerdem kann ich 'computeCoefficients()' nicht aufrufen, da es geschützt ist. –

+0

Das angegebene Polynom gibt Werte um 10^18 am Ende des Bereichs zurück. Dies ist definitiv ein numerisches Problem. Es könnte für eine vernünftige Eingabe besser werden. –

Antwort

2

Das Problem Ihres Beispiels ist, dass das Polynom sehr große Werte ergibt, wenn es an einigen Ihrer Punkte (meistens die größeren) ausgewertet wird, während andere sehr kleine Werte ergeben. Da Sie einen numerischen Datentyp mit einer festen Bittiefe verwenden, können die Details um die Null aufgrund der Gleitkommagenauigkeit verloren gehen.

Wenn Sie das Ergebnis des Lagrange-Polynoms untersuchen, werden Sie sehen, dass die Koeffizienten höherer Ordnung übereinstimmen. Dies sind die Koeffizienten, die für die großen Werte verantwortlich sind. Wenn Sie dieses Polynom grafisch darstellen, werden Sie kaum einen Unterschied sehen, weil die falschen Koeffizienten niedrigerer Ordnung einen sehr kleinen Fehler (im Vergleich zu dem großen Maßstab) einführen.

Um dies zu lösen, sollten Sie Punkte einspeisen, die einen kleineren Dynamikbereich ergeben. Welche Punkte die Bedingung erfüllen, hängt vom Eingangspolynom ab. Als allgemeine Faustregel gilt, dass Werte nahe Null für die meisten Polynome in Ordnung sein sollten.

+0

Ich sollte bei den folgenden Werten bleiben 'double [] minutia = {35159,61365,32992,37483,33985,38473,59804,41550,40526,38586,57532,43230,52928,36067,43212,4373}; " leider bekomme ich falsche Koeffizienten.Ich habe auch versucht, Werte durch 10000 und 100000 ohne Glück zu teilen .. irgendwelche Vorschläge? –

+0

Was sind diese Zahlen? –

+0

Es ist minutia Punkte aus Fingerabdruck extrahiert, ich sollte sie verwenden, um das Polynom anstelle von Punkten Array –

Verwandte Themen