aboutsummaryrefslogtreecommitdiff
path: root/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/arduinoCurveFitting-master/src/curveFitting.cpp')
-rw-r--r--libraries/arduinoCurveFitting-master/src/curveFitting.cpp195
1 files changed, 0 insertions, 195 deletions
diff --git a/libraries/arduinoCurveFitting-master/src/curveFitting.cpp b/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
deleted file mode 100644
index 7155675..0000000
--- a/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- curveFitting.h - Library for fitting curves to given
- points using Least Squares method, with Cramer's rule
- used to solve the linear equation. Max polynomial order 20.
- Created by Rowan Easter-Robinson, August 23, 2018.
- Released into the public domain.
-*/
-
-#include <Arduino.h>
-#include "curveFitting.h"
-
-void printMat(const char *s, ld*m, int n){
- Serial.println(s);
- char buf[40];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- snprintf(buf, 40, "%30.4f\t", m[i*n+j]);
- Serial.print(buf);
- }
- Serial.println();
- }
-}
-
-void showmat(const char *s, ld **m, int n){
- Serial.println(s);
- char buf[40];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++){
- snprintf(buf, 40, "%30.4f\t", m[i][j]);
- Serial.print(buf);
- }
- Serial.println();
- }
-}
-
-void cpyArray(ld *src, ld*dest, int n){
- for (int i = 0; i < n*n; i++){
- dest[i] = src[i];
- }
-}
-
-void subCol(ld *mat, ld* sub, uint8_t coln, uint8_t n){
- if (coln >= n) return;
- for (int i = 0; i < n; i++){
- mat[(i*n)+coln] = sub[i];
- }
-}
-
-/*Determinant algorithm taken from https://codeforwin.org/2015/08/c-program-to-find-determinant-of-matrix.html */
-int trianglize(ld **m, int n)
-{
- int sign = 1;
- for (int i = 0; i < n; i++) {
- int max = 0;
- for (int row = i; row < n; row++)
- if (fabs(m[row][i]) > fabs(m[max][i]))
- max = row;
- if (max) {
- sign = -sign;
- ld *tmp = m[i];
- m[i] = m[max], m[max] = tmp;
- }
- if (!m[i][i]) return 0;
- for (int row = i + 1; row < n; row++) {
- ld r = m[row][i] / m[i][i];
- if (!r) continue;
- for (int col = i; col < n; col ++)
- m[row][col] -= m[i][col] * r;
- }
- }
- return sign;
-}
-
-ld det(ld *in, int n, uint8_t prnt)
-{
- ld *m[n];
- m[0] = in;
-
- for (int i = 1; i < n; i++)
- m[i] = m[i - 1] + n;
- if(prnt) showmat("Matrix", m, n);
- int sign = trianglize(m, n);
- if (!sign)
- return 0;
- if(prnt) showmat("Upper triangle", m, n);
- ld p = 1;
- for (int i = 0; i < n; i++)
- p *= m[i][i];
- return p * sign;
-}
-/*End of Determinant algorithm*/
-
-//Raise x to power
-ld curveFitPower(ld base, int exponent){
- if (exponent == 0){
- return 1;
- } else {
- ld val = base;
- for (int i = 1; i < exponent; i++){
- val = val * base;
- }
- return val;
- }
-}
-
-int fitCurve (int order, int nPoints, ld py[], int nCoeffs, ld *coeffs) {
- uint8_t maxOrder = MAX_ORDER;
- if (nCoeffs != order + 1) return ORDER_AND_NCOEFFS_DO_NOT_MATCH; // no of coefficients is one larger than the order of the equation
- if (nCoeffs > maxOrder || nCoeffs < 2) return ORDER_INCORRECT; //matrix memory hard coded for max of 20 order, which is huge
- if (nPoints < 1) return NPOINTS_INCORRECT; //Npoints needs to be positive and nonzero
- int i, j;
- ld T[MAX_ORDER] = {0}; //Values to generate RHS of linear equation
- ld S[MAX_ORDER*2+1] = {0}; //Values for LHS and RHS of linear equation
- ld denom; //denominator for Cramer's rule, determinant of LHS linear equation
- ld x, y;
-
- ld px[nPoints]; //Generate X values, from 0 to n
- for (i=0; i<nPoints; i++){
- px[i] = i;
- }
-
- for (i=0; i<nPoints; i++) {//Generate matrix elements
- x = px[i];
- y = py[i];
- for (j = 0; j < (nCoeffs*2)-1; j++){
- S[j] += curveFitPower(x, j); // x^j iterated , S10 S20 S30 etc, x^0, x^1...
- }
- for (j = 0; j < nCoeffs; j++){
- T[j] += y * curveFitPower(x, j); //y * x^j iterated, S01 S11 S21 etc, x^0*y, x^1*y, x^2*y...
- }
- }
-
- ld masterMat[nCoeffs*nCoeffs]; //Master matrix LHS of linear equation
- for (i = 0; i < nCoeffs ;i++){//index by matrix row each time
- for (j = 0; j < nCoeffs; j++){//index within each row
- masterMat[i*nCoeffs+j] = S[i+j];
- }
- }
-
- ld mat[nCoeffs*nCoeffs]; //Temp matrix as det() method alters the matrix given
- cpyArray(masterMat, mat, nCoeffs);
- denom = det(mat, nCoeffs, CURVE_FIT_DEBUG);
- cpyArray(masterMat, mat, nCoeffs);
-
- //Generate cramers rule mats
- for (i = 0; i < nCoeffs; i++){ //Temporary matrix to substitute RHS of linear equation as per Cramer's rule
- subCol(mat, T, i, nCoeffs);
- coeffs[nCoeffs-i-1] = det(mat, nCoeffs, CURVE_FIT_DEBUG)/denom; //Coefficients are det(M_i)/det(Master)
- cpyArray(masterMat, mat, nCoeffs);
- }
- return 0;
-}
-
-int fitCurve (int order, int nPoints, ld px[], ld py[], int nCoeffs, ld *coeffs) {
- uint8_t maxOrder = MAX_ORDER;
- if (nCoeffs != order + 1) return ORDER_AND_NCOEFFS_DO_NOT_MATCH; //Number of coefficients is one larger than the order of the equation
- if(nCoeffs > maxOrder || nCoeffs < 2) return ORDER_INCORRECT; //Matrix memory hard coded for max of 20 order, which is huge
- if (nPoints < 1) return NPOINTS_INCORRECT; //Npoints needs to be positive and nonzero
- int i, j;
- ld T[MAX_ORDER] = {0}; //Values to generate RHS of linear equation
- ld S[MAX_ORDER*2+1] = {0}; //Values for LHS and RHS of linear equation
- ld denom; //denominator for Cramer's rule, determinant of LHS linear equation
- ld x, y;
-
- for (i=0; i<nPoints; i++) {//Generate matrix elements
- x = px[i];
- y = py[i];
- for (j = 0; j < (nCoeffs*2)-1; j++){
- S[j] += curveFitPower(x, j); // x^j iterated , S10 S20 S30 etc, x^0, x^1...
- }
- for (j = 0; j < nCoeffs; j++){
- T[j] += y * curveFitPower(x, j); //y * x^j iterated, S01 S11 S21 etc, x^0*y, x^1*y, x^2*y...
- }
- }
-
- ld masterMat[nCoeffs*nCoeffs]; //Master matrix LHS of linear equation
- for (i = 0; i < nCoeffs ;i++){//index by matrix row each time
- for (j = 0; j < nCoeffs; j++){//index within each row
- masterMat[i*nCoeffs+j] = S[i+j];
- }
- }
-
- ld mat[nCoeffs*nCoeffs]; //Temp matrix as det() method alters the matrix given
- cpyArray(masterMat, mat, nCoeffs);
- denom = det(mat, nCoeffs, CURVE_FIT_DEBUG);
- cpyArray(masterMat, mat, nCoeffs);
-
- //Generate cramers rule mats
- for (i = 0; i < nCoeffs; i++){ //Temporary matrix to substitute RHS of linear equation as per Cramer's rule
- subCol(mat, T, i, nCoeffs);
- coeffs[nCoeffs-i-1] = det(mat, nCoeffs, CURVE_FIT_DEBUG)/denom; //Coefficients are det(M_i)/det(Master)
- cpyArray(masterMat, mat, nCoeffs);
- }
- return 0;
-}