00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #include <gtest/gtest.h>
00038 #include <spline_smoother/spline_smoother_utils.h>
00039 #include <stdlib.h>
00040
00041 static double getRandomNumber(double min, double max)
00042 {
00043 return ((double)rand() / RAND_MAX)*(max-min) + min;
00044 }
00045
00046 TEST(TestUtils, testTridiagonalSolver)
00047 {
00048
00049 srand(2);
00050
00051
00052 int n=10;
00053
00054 std::vector<double> a(n);
00055 std::vector<double> b(n);
00056 std::vector<double> c(n);
00057 std::vector<double> d(n);
00058 std::vector<double> x(n);
00059 std::vector<double> solved_x(n);
00060
00061 for (int i=0; i<n; i++)
00062 {
00063 a[i] = getRandomNumber(10.0, 20.0);
00064 b[i] = getRandomNumber(1.0, 4.0);
00065 c[i] = getRandomNumber(1.0, 4.0);
00066 x[i] = getRandomNumber(-1.0, 1.0);
00067 }
00068 a[0] = 0.0;
00069 c[n-1] = 0.0;
00070
00071
00072 for (int i=1; i<n-1; i++)
00073 {
00074 d[i] = a[i]*x[i-1] + b[i]*x[i] + c[i]*x[i+1];
00075 }
00076 d[0] = b[0]*x[0] + c[0]*x[1];
00077 d[n-1] = a[n-1]*x[n-2] + b[n-1]*x[n-1];
00078
00079
00080 spline_smoother::tridiagonalSolve(a, b, c, d, solved_x);
00081
00082 double tolerance = 1e-8;
00083
00084
00085 for (int i=0; i<n; i++)
00086 {
00087 EXPECT_NEAR(x[i], solved_x[i], tolerance);
00088 }
00089 }
00090
00091 TEST(TestUtils, testTridiagonalSolver2)
00092 {
00093
00094 srand(2);
00095
00096
00097 int n=10;
00098
00099 std::vector<double> a(n);
00100 std::vector<double> b(n);
00101 std::vector<double> c(n);
00102 std::vector<double> d(n);
00103 std::vector<double> x(n);
00104 std::vector<double> solved_x(n);
00105
00106 for (int i=0; i<n; i++)
00107 {
00108 a[i] = 4.0;
00109 b[i] = 1.0;
00110 c[i] = 1.0;
00111 x[i] = getRandomNumber(-1.0, 1.0);
00112 }
00113 a[0] = 0.0;
00114 c[n-1] = 0.0;
00115 b[0] = 2.0;
00116 b[n-1] = 2.0;
00117
00118
00119 for (int i=1; i<n-1; i++)
00120 {
00121 d[i] = a[i]*x[i-1] + b[i]*x[i] + c[i]*x[i+1];
00122 }
00123 d[0] = b[0]*x[0] + c[0]*x[1];
00124 d[n-1] = a[n-1]*x[n-2] + b[n-1]*x[n-1];
00125
00126
00127 spline_smoother::tridiagonalSolve(a, b, c, d, solved_x);
00128
00129 double tolerance = 1e-8;
00130
00131
00132 for (int i=0; i<n; i++)
00133 {
00134 EXPECT_NEAR(x[i], solved_x[i], tolerance);
00135 }
00136 }