线性方程组 Ax=b 求解(Chapter28)

来源:互联网 发布:cuda linux 编译 编辑:程序博客网 时间:2024/04/29 17:29
  1. /**
  2. *线性方程组 Ax=b 求解函数
  3. *@param     A       (in)系数矩阵
  4. *@param     x       (out)根列向量,接受输出值
  5. *@param     b       (in)方程右侧常数项
  6. *@param     size    (in)矩阵的大小
  7. *@return    求解成功返回非零值,失败返回零
  8. *@LUDecomposition LU分解-详见上一篇或下一篇                            
  9. */
  10. int LinearEquation(double **A, double *x, double *b, int size)
  11. {
  12.     double **L, **U, *y;
  13.     double temp;
  14.     int i, j;
  15.     L = (double**)malloc(sizeof(double*)*size);
  16.     U = (double**)malloc(sizeof(double*)*size);
  17.     for (i = 0; i < size; i++)
  18.     {
  19.         L[i] = (double*)malloc(sizeof(double)*size);
  20.         U[i] = (double*)malloc(sizeof(double)*size);
  21.     }
  22.     if (!LUDecomposition(A, L, U, size))
  23.     {
  24.         fprintf(stderr, "Error: In LinearEquation./n");
  25.         return 0;
  26.     }
  27.     y = (double*)malloc(sizeof(double)*size);
  28.     for (i = 0; i < size; i++)
  29.     {
  30.         temp = 0;
  31.         y[i] = 0;
  32.         for (j = 0; j <= i-1; j++)
  33.             temp += L[i][j] * y[j];
  34.         y[i] += b[i] - temp;
  35.     }
  36.     for (i = size-1; i >= 0; i--)
  37.     {
  38.         temp = 0;
  39.         x[i] = 0;
  40.         for (j = i+1; j < size; j++)
  41.             temp += U[i][j] * x[j];
  42.         x[i] = (y[i] - temp) / U[i][i];
  43.     }
  44.     for (i = 0; i < size; i++)
  45.     {
  46.         free(L[i]);
  47.         free(U[i]);
  48.     }
  49.     free(L);
  50.     free(U);
  51.     free(y);
  52.     return 1;
  53. }
原创粉丝点击