74 double tolerance = 1e-6;
75 for(
int iters = 0; iters < 100; iters++) {
76 const unsigned N = unsigned(
uniform()*40) + 1;
78 printf(
"%ux%u matrix\n",
N,
N);
79 for(
int r = 0; r <
N; r++) {
80 for(
int c = 0;
c <= r;
c++) {
81 A_data[r*
N +
c] = A_data[
c*
N + r] = fabs(
uniform());
86 for(
int i = 0; i <
N; i++)
87 A_c[i] = &A_data[
N*i];
90 for(
int i = 0; i <
N; i++)
92 std::valarray<double> b(b_data,
N), xx(0.0,
N);
93 std::valarray<double> A(A_data,
N*
N);
98 = gsl_matrix_view_array (A_data,
N,
N);
100 = gsl_vector_view_array (b_data,
N);
102 gsl_vector *xgsl = gsl_vector_alloc (
N);
106 gsl_permutation * p = gsl_permutation_alloc (
N);
108 gsl_linalg_LU_decomp (&m.matrix, p, &s);
110 gsl_linalg_LU_solve (&m.matrix, p, &bgsl.vector, xgsl);
112 std::valarray<double> gsl_xx(0.0,
N);
113 for(
unsigned i = 0; i < xx.size(); i++) {
114 gsl_xx[i] = gsl_vector_get(xgsl, i);
117 double err =
Linfty(xx - gsl_xx);
118 printf (
"|xx-nxgsl|_infty = %g\n", err);
119 if(err > tolerance) {
121 for(
int r = 0; r <
N; r++) {
122 for(
int c = 0;
c <
N;
c++) {
123 printf(
"%g ", A_data[r*
N +
c]);
128 printf(
"\nx njh-cg = \n");
129 for(
unsigned i = 0; i < xx.size(); i++)
130 printf(
"%g ", xx[i]);
132 for(
unsigned i = 0; i < xx.size(); i++)
133 printf(
"%g ", gsl_xx[i]);
135 valarray<double>
result(0.0,
N);
138 printf(
"\nA xx -b = ");
139 for(
unsigned i = 0; i < xx.size(); i++)
144 printf(
"\nA gsl_xx -b = ");
145 for(
unsigned i = 0; i < xx.size(); i++)
149 printf(
"FAILED!!!!!!!!!!!!!!!!!!!!!!!!\n");
void conjugate_gradient(valarray< double > const &A, valarray< double > &x, valarray< double > const &b, unsigned const n, double const tol, unsigned const max_iterations)