克洛脱(Crout)LU分解——C#实现

作者:追风剑情 发布于:2018-10-14 15:10 分类:Algorithms

克洛脱(Crout)LU分解原理参见 克洛脱(Crout)矩阵分解——LU分解

  1. using System;
  2. using System.Text;
  3.  
  4. namespace ConsoleApp1
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. Console.WriteLine("克洛脱分解测试");
  11. //测试数据
  12. const int N = 4;
  13. float[] A = new float[N*N]
  14. {
  15. 2, 9, 0, 0,
  16. 6, 2, 2, 0,
  17. 0, 8, 2, 3,
  18. 0, 0, 10, 2
  19. };
  20. float[] L;
  21. float[] U;
  22.  
  23. CroutLU(N, A, out L, out U);
  24.  
  25. Console.WriteLine("A:");
  26. PrintM(N, A);
  27. Console.WriteLine("L:");
  28. PrintM(N, L);
  29. Console.WriteLine("U:");
  30. PrintM(N, U);
  31.  
  32. Console.WriteLine("注: 因为这里用的是float型数据,计算时会有一定的精度丢失.");
  33.  
  34. Console.Read();
  35. }
  36.  
  37. /**
  38. * 克洛脱(Crout)LU分解
  39. * @param N NxN矩阵
  40. * @param A 原矩阵
  41. * @param L L矩阵
  42. * @param U U矩阵
  43. */
  44. static void CroutLU(int N, float[] A, out float[] L, out float[] U)
  45. {
  46. L = new float[N*N];
  47. U = new float[N*N];
  48. float[] a_arr = new float[N];
  49. float[] b_arr = new float[N];
  50. float[] c_arr = new float[N];
  51. float[] l_arr = new float[N];
  52. float[] m_arr = new float[N];
  53. float[] u_arr = new float[N];
  54.  
  55. //a_arr[]存放原矩阵主对角线数据
  56. for (int i=0; i<N; i++)
  57. {
  58. a_arr[i] = A[i * N + i];
  59. }
  60.  
  61. //b_arr[]存放原矩阵下对角线数据
  62. for(int i=1; i<N; i++)
  63. {
  64. b_arr[i] = A[i * N + i - 1];
  65. }
  66.  
  67. //c_arr[]存放原矩阵上对角线数据
  68. for (int i=0; i<N-1; i++)
  69. {
  70. c_arr[i] = A[i * N + i + 1];
  71. }
  72.  
  73. l_arr[0] = a_arr[0];
  74. u_arr[0] = c_arr[0] / l_arr[0];
  75.  
  76. //根据公式求出其余l_arr[]、m_arr[]、u_arr[]的值
  77. for(int i=1; i<N; i++)
  78. {
  79. m_arr[i] = b_arr[i];
  80. l_arr[i] = a_arr[i] - m_arr[i] * u_arr[i - 1];
  81. if (i < N - 1)
  82. u_arr[i] = c_arr[i] / l_arr[i];
  83. }
  84.  
  85. //给L矩阵赋值
  86. L[0] = l_arr[0];
  87. for(int i=1; i<N; i++)
  88. {
  89. //给主对角线赋值
  90. L[i * N + i] = l_arr[i];
  91. //给下对角线赋值
  92. L[i * N + i - 1] = m_arr[i];
  93. }
  94. //给U矩阵赋值
  95. for (int i = 0; i < N-1; i++)
  96. {
  97. //给主对角线赋值
  98. U[i * N + i] = 1;
  99. //给上对角线赋值
  100. U[i * N + i + 1] = u_arr[i];
  101. }
  102. U[N*N - 1] = 1;
  103. }
  104.  
  105. static void PrintM(int N, float[] M)
  106. {
  107. StringBuilder sb = new StringBuilder();
  108. for(int i=0; i<N; i++)
  109. {
  110. for (int j = 0; j < N; j++)
  111. sb.Append(M[i * N + j] +" ");
  112. sb.AppendLine();
  113. }
  114. Console.WriteLine(sb.ToString());
  115. }
  116. }
  117. }

运行测试

1111.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号