Beispiel #1
0
int main (int argc, char **argv)
{
   unsigned int n;
   unsigned int i, j;
   double **a, *b, **a1, *b1;

   n = 50;

   a = JDMdouble_matrix (n, n);
   a1 = JDMdouble_matrix (n, n);
   b = JDMdouble_vector (n);
   b1 = JDMdouble_vector (n);

   for (i = 0; i < n; i++)
     {
	for (j = 0; j < n; j++)
	  a[i][j] = a1[i][j] = JDMrandom ();

	b[i] = b1[i] = JDMrandom ();
     }

   if (0 == JDMgauss_jordan (a, b, n))
     {
	for (i = 0; i < n; i++)
	  {
	     double sum = 0;
	     for (j = 0; j < n; j++)
	       sum += a[i][j] * b1[j];

	     fprintf (stdout, "%e\n", sum - b[i]);
	  }
     }

   return 0;
}
Beispiel #2
0
static int test_inverse (unsigned int n, double tol,
                         int (*fun) (double **, double **, unsigned int))
{
    Special_Matrix_Type *s;
    double **a, **b;

    if (NULL == (a = JDMdouble_matrix (n, n)))
        return -1;

    if (NULL == (b = JDMdouble_matrix (n, n)))
    {
        JDMfree_double_matrix (a, n);
        return -1;
    }

    s = Special_Matrices;
    while (s->f != NULL)
    {
        int status;
        double val;

        init_matrix (a, n, s->f);
        status = test_this_inverse (a, b, n, fun, &val);
        if (status == -1)
            return -1;

        if (status == s->is_singular)
        {
            fprintf (stderr, "%s: failed singularity test\n", s->name);
            s++;
            continue;
        }

        if (s->is_singular)
        {
            s++;
            continue;
        }

        if (val > tol)
            fprintf (stderr, "%s failed: tolerance exceeded (%e)\n", s->name, val);

        s++;
    }

    return 0;
}
Beispiel #3
0
static int pop_linear_system (Linear_System_Type *t) /*{{{*/
{
   SLang_Array_Type *sl_a=NULL, *sl_b=NULL;
   double **a=NULL, *b=NULL;
   SLindex_Type i, j, n, dims[2];
   int status = -1;

   t->a = NULL;
   t->b = NULL;
   t->n = 0;

   if ((-1 == SLang_pop_array_of_type (&sl_b, SLANG_DOUBLE_TYPE))
       || (-1 == SLang_pop_array_of_type (&sl_a, SLANG_DOUBLE_TYPE)))
     goto return_error;

   n = sl_b->num_elements;

   if (sl_a->num_elements != (unsigned int) n*n)
     goto return_error;

   if ((NULL == (a = JDMdouble_matrix (n, n)))
       || (NULL == (b = JDMdouble_vector (n))))
     goto return_error;

   memcpy ((char *)b, (char *)sl_b->data, n * sizeof(double));
   for (i = 0; i < n; i++)
     {
        double *ai = a[i];
        if (-1 == SLang_get_array_element (sl_b, &i, &b[i]))
          goto return_error;
        dims[0] = i;
        for (j = 0; j < n; j++)
          {
             double aij;
             dims[1] = j;
             if (-1 == SLang_get_array_element (sl_a, dims, &aij))
               goto return_error;
             ai[j] = aij;
          }
     }

   t->a = a;
   t->b = b;
   t->n = n;

   status = 0;
return_error:
   SLang_free_array (sl_a);
   SLang_free_array (sl_b);
   return status;
}