Ekstrapolasi (Extrapolation) adalah proses matematis untuk memprediksi nilai yang akan datang berdasarkan keterkaitan matematis dari nilai-nilai sebelumnya.
Dalam contoh ini akan diprediksi nilai sinus 60° dari deret sinusional sin-0, 10, 20, 30, 40, 50. Pendekatan yang digunakan adalah linear dan polynomial (quadratic, cubic, quartic dan quintic), menggunakan operasi matrik. Formula matematis ini dikerjakan dengan bantuan arduino Uno.
dan hasilnya adalah:
- Seharusnya (sinus(60) * 1000) = 866.02
- Linear Extrapolation = 889.34
- Polynomial Extrapolation (quadratic)= 869.84
- Polynomial Extrapolation (cubic) = 865.54
- Polynomial Extrapolation (quartic) = 904.61
- Polynomial Extrapolation (quintic) = 866.39
Berikut sketch/koding ekstra polasi arduino:
Link download library MatrixMath
#include <MatrixMath.h> float dataSinus[] = {0.0, 173.64, 342.02, 500.00, 642.78, 766.06};// -- 866.02 void setup() { Serial.begin(9600); Serial.println("Prediksi Extrapolation dengan Arduino"); Serial.println("https://www.project.semesin.com/"); Serial.println(); byte indexTerakhir = sizeof(dataSinus) / sizeof(float) - 1; Serial.print("Seharusnya (sinus(60) * 1000) = "); Serial.println(866.02); float prediksi; prediksi = linearExtrapolation(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1]); Serial.print("Linear Extrapolation = "); Serial.println(prediksi); prediksi = polynomialExtrapolationQuadratic(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2]); Serial.print("Polynomial Extrapolation (quadratic)= "); Serial.println(prediksi); prediksi = polynomialExtrapolationCubic( dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2], dataSinus[indexTerakhir - 3]); Serial.print("Polynomial Extrapolation (cubic) = "); Serial.println(prediksi); prediksi = polynomialExtrapolationQuartic( dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2], dataSinus[indexTerakhir - 3], dataSinus[indexTerakhir - 4]); Serial.print("Polynomial Extrapolation (quartic) = "); Serial.println(prediksi); prediksi = polynomialExtrapolationQuintic( dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2], dataSinus[indexTerakhir - 3], dataSinus[indexTerakhir - 4], dataSinus[indexTerakhir - 5]); Serial.print("Polynomial Extrapolation (quintic) = "); Serial.println(prediksi); while (1); } void loop() { } float linearExtrapolation(float dataN, float dataNminus1) { return dataNminus1 + (2 * (dataN - dataNminus1)); } float polynomialExtrapolationQuadratic(float dataN, float dataNminus1, float dataNminus2) { float A[3][3] = {{1.0, 0.0, 0.0}, {1.0, 1.0, 1.0}, {1.0, 2.0, 4.0} }; float B[3] = {dataNminus2, dataNminus1, dataN}; float C[3]; Matrix.Invert((float*)A, 3); Matrix.Multiply((float*)A, (float*)B, 3, 3, 1, (float*)C); return(C[0] + (C[1] * 3.0) + (C[2] * 9.0)); } float polynomialExtrapolationCubic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3) { float A[4][4] = { {1.0, 0.0, 0.0, 0.0}, {1.0, 1.0, 1.0, 1.0}, {1.0, 2.0, 4.0, 8.0}, {1.0, 3.0, 9.0, 27.0} }; float B[4] = {dataNminus3, dataNminus2, dataNminus1, dataN}; float C[4]; Matrix.Invert((float*)A, 4); Matrix.Multiply((float*)A, (float*)B, 4, 4, 1, (float*)C); return(C[0] + (C[1] * 4.0) + (C[2] * 16.0) + (C[3] * 64.0)); } float polynomialExtrapolationQuartic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4) { float A[5][5] = { {1.0, 0.0, 0.0, 0.0, 0.0}, {1.0, 1.0, 1.0, 1.0, 1.0}, {1.0, 2.0, 4.0, 8.0, 16.0}, {1.0, 3.0, 9.0, 27.0, 81.0}, {1.0, 4.0, 8.0, 64.0, 256.0} }; float B[5] = {dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN}; float C[5]; Matrix.Invert((float*)A, 5); Matrix.Multiply((float*)A, (float*)B, 5, 5, 1, (float*)C); return(C[0] + (C[1] * 5.0) + (C[2] * 25.0) + (C[3] * 125.0) + (C[4] * 625.0)); } float polynomialExtrapolationQuintic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4, float dataNminus5) { float A[6][6] = { {1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, {1.0, 2.0, 4.0, 8.0, 16.0, 32.0}, {1.0, 3.0, 9.0, 27.0, 81.0, 243.0}, {1.0, 4.0, 8.0, 64.0, 256.0, 1024.0}, {1.0, 5.0, 25.0, 125.0, 625.0, 3125.0} }; float B[6] = {dataNminus5, dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN}; float C[6]; Matrix.Invert((float*)A, 6); Matrix.Multiply((float*)A, (float*)B, 6, 6, 1, (float*)C); return(C[0] + (C[1] * 6.0) + (C[2] * 36.0) + (C[3] * 216.0) + (C[4] * 1296.0) + (C[5] * 7776.0)); }
hasil Serial monitor: