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.cpp54
1 files changed, 27 insertions, 27 deletions
diff --git a/libraries/arduinoCurveFitting-master/src/curveFitting.cpp b/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
index 5e526c0..7155675 100644
--- a/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
+++ b/libraries/arduinoCurveFitting-master/src/curveFitting.cpp
@@ -9,7 +9,7 @@
#include <Arduino.h>
#include "curveFitting.h"
-void printMat(const char *s, double*m, int n){
+void printMat(const char *s, ld*m, int n){
Serial.println(s);
char buf[40];
for (int i = 0; i < n; i++) {
@@ -21,7 +21,7 @@ void printMat(const char *s, double*m, int n){
}
}
-void showmat(const char *s, double **m, int n){
+void showmat(const char *s, ld **m, int n){
Serial.println(s);
char buf[40];
for (int i = 0; i < n; i++) {
@@ -33,13 +33,13 @@ void showmat(const char *s, double **m, int n){
}
}
-void cpyArray(double *src, double*dest, int n){
+void cpyArray(ld *src, ld*dest, int n){
for (int i = 0; i < n*n; i++){
dest[i] = src[i];
}
}
-void subCol(double *mat, double* sub, uint8_t coln, uint8_t n){
+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];
@@ -47,7 +47,7 @@ void subCol(double *mat, double* sub, uint8_t coln, uint8_t n){
}
/*Determinant algorithm taken from https://codeforwin.org/2015/08/c-program-to-find-determinant-of-matrix.html */
-int trianglize(double **m, int n)
+int trianglize(ld **m, int n)
{
int sign = 1;
for (int i = 0; i < n; i++) {
@@ -57,12 +57,12 @@ int trianglize(double **m, int n)
max = row;
if (max) {
sign = -sign;
- double *tmp = m[i];
+ 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++) {
- double r = m[row][i] / m[i][i];
+ 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;
@@ -71,9 +71,9 @@ int trianglize(double **m, int n)
return sign;
}
-double det(double *in, int n, uint8_t prnt)
+ld det(ld *in, int n, uint8_t prnt)
{
- double *m[n];
+ ld *m[n];
m[0] = in;
for (int i = 1; i < n; i++)
@@ -83,7 +83,7 @@ double det(double *in, int n, uint8_t prnt)
if (!sign)
return 0;
if(prnt) showmat("Upper triangle", m, n);
- double p = 1;
+ ld p = 1;
for (int i = 0; i < n; i++)
p *= m[i][i];
return p * sign;
@@ -91,11 +91,11 @@ double det(double *in, int n, uint8_t prnt)
/*End of Determinant algorithm*/
//Raise x to power
-double curveFitPower(double base, int exponent){
+ld curveFitPower(ld base, int exponent){
if (exponent == 0){
return 1;
} else {
- double val = base;
+ ld val = base;
for (int i = 1; i < exponent; i++){
val = val * base;
}
@@ -103,18 +103,18 @@ double curveFitPower(double base, int exponent){
}
}
-int fitCurve (int order, int nPoints, double py[], int nCoeffs, double *coeffs) {
+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;
- double T[MAX_ORDER] = {0}; //Values to generate RHS of linear equation
- double S[MAX_ORDER*2+1] = {0}; //Values for LHS and RHS of linear equation
- double denom; //denominator for Cramer's rule, determinant of LHS linear equation
- double x, y;
+ 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;
- double px[nPoints]; //Generate X values, from 0 to n
+ ld px[nPoints]; //Generate X values, from 0 to n
for (i=0; i<nPoints; i++){
px[i] = i;
}
@@ -130,14 +130,14 @@ int fitCurve (int order, int nPoints, double py[], int nCoeffs, double *coeffs)
}
}
- double masterMat[nCoeffs*nCoeffs]; //Master matrix LHS of linear equation
+ 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];
}
}
- double mat[nCoeffs*nCoeffs]; //Temp matrix as det() method alters the matrix given
+ 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);
@@ -151,16 +151,16 @@ int fitCurve (int order, int nPoints, double py[], int nCoeffs, double *coeffs)
return 0;
}
-int fitCurve (int order, int nPoints, double px[], double py[], int nCoeffs, double *coeffs) {
+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;
- double T[MAX_ORDER] = {0}; //Values to generate RHS of linear equation
- double S[MAX_ORDER*2+1] = {0}; //Values for LHS and RHS of linear equation
- double denom; //denominator for Cramer's rule, determinant of LHS linear equation
- double x, y;
+ 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];
@@ -173,14 +173,14 @@ int fitCurve (int order, int nPoints, double px[], double py[], int nCoeffs, dou
}
}
- double masterMat[nCoeffs*nCoeffs]; //Master matrix LHS of linear equation
+ 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];
}
}
- double mat[nCoeffs*nCoeffs]; //Temp matrix as det() method alters the matrix given
+ 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);