• C#,数值计算——插值和外推,PolCoef的计算方法与源程序


    1 文本格式

    using System;

    namespace Legalsoft.Truffer
    {
        ///


        /// polynomial coefficients from polynomial values
        ///

        public class PolCoef
        {
            public PolCoef()
            {
            }

            ///


            /// Given arrays x[0..n - 1] and y[0..n - 1] containing a tabulated function yi D f
            /// .xi /, this routine returns an array of coefficients cof[0..n - 1],
            /// such that yi =sum(cofj* xij)(j=0...n-1).
            ///

            ///
            ///
            ///
            public static void polcoe(double[] x, double[] y, double[] cof)
            {
                int n = x.Length;
                double[] s = new double[n];
                for (int i = 0; i < n; i++)
                {
                    s[i] = cof[i] = 0.0;
                }
                s[n - 1] = -x[0];
                for (int i = 1; i < n; i++)
                {
                    for (int j = n - 1 - i; j < n - 1; j++)
                    {
                        s[j] -= x[i] * s[j + 1];
                    }
                    s[n - 1] -= x[i];
                }
                for (int j = 0; j < n; j++)
                {
                    double phi = n;
                    for (int k = n - 1; k > 0; k--)
                    {
                        phi = k * s[k] + x[j] * phi;
                    }
                    double ff = y[j] / phi;
                    double b = 1.0;
                    for (int k = n - 1; k >= 0; k--)
                    {
                        cof[k] += b * ff;
                        b = s[k] + x[j] * b;
                    }
                }
            }

            ///


            /// Given arrays xa[0..n - 1] and ya[0..n - 1] containing a tabulated function yai
            /// D f.xai /, this routine returns an array of coefficients
            /// cof[0..n - 1], such that yai = sum(cofj * xaij)(j = 0...n - 1).
            ///

            ///
            ///
            ///
            public static void polcof(double[] xa, double[] ya, double[] cof)
            {
                int n = xa.Length;
                double[] x = new double[n];
                double[] y = new double[n];
                for (int j = 0; j < n; j++)
                {
                    x[j] = xa[j];
                    y[j] = ya[j];
                }
                for (int j = 0; j < n; j++)
                {
                    double[] x_t = new double[n - j];
                    double[] y_t = new double[n - j];
                    for (int i = 0; i < n - j; i++)
                    {
                        x_t[i] = x[i];
                        y_t[i] = y[i];
                    }

                    Poly_interp interp = new Poly_interp(x, y, n - j);
                    cof[j] = interp.rawinterp(0, 0.0);
                    double xmin = 1.0e99;
                    int k = -1;
                    for (int i = 0; i < n - j; i++)
                    {
                        if (Math.Abs(x[i]) < xmin)
                        {
                            xmin = Math.Abs(x[i]);
                            k = i;
                        }
                        if (x[i] != 0.0)
                        {
                            y[i] = (y[i] - cof[j]) / x[i];
                        }
                    }
                    for (int i = k + 1; i < n - j; i++)
                    {
                        y[i - 1] = y[i];
                        x[i - 1] = x[i];
                    }
                }
            }

        }
    }
     

    2 代码格式

    1. using System;
    2. namespace Legalsoft.Truffer
    3. {
    4. ///
    5. /// polynomial coefficients from polynomial values
    6. ///
    7. public class PolCoef
    8. {
    9. public PolCoef()
    10. {
    11. }
    12. ///
    13. /// Given arrays x[0..n - 1] and y[0..n - 1] containing a tabulated function yi D f
    14. /// .xi /, this routine returns an array of coefficients cof[0..n - 1],
    15. /// such that yi =sum(cofj* xij)(j=0...n-1).
    16. ///
    17. ///
    18. ///
    19. ///
    20. public static void polcoe(double[] x, double[] y, double[] cof)
    21. {
    22. int n = x.Length;
    23. double[] s = new double[n];
    24. for (int i = 0; i < n; i++)
    25. {
    26. s[i] = cof[i] = 0.0;
    27. }
    28. s[n - 1] = -x[0];
    29. for (int i = 1; i < n; i++)
    30. {
    31. for (int j = n - 1 - i; j < n - 1; j++)
    32. {
    33. s[j] -= x[i] * s[j + 1];
    34. }
    35. s[n - 1] -= x[i];
    36. }
    37. for (int j = 0; j < n; j++)
    38. {
    39. double phi = n;
    40. for (int k = n - 1; k > 0; k--)
    41. {
    42. phi = k * s[k] + x[j] * phi;
    43. }
    44. double ff = y[j] / phi;
    45. double b = 1.0;
    46. for (int k = n - 1; k >= 0; k--)
    47. {
    48. cof[k] += b * ff;
    49. b = s[k] + x[j] * b;
    50. }
    51. }
    52. }
    53. ///
    54. /// Given arrays xa[0..n - 1] and ya[0..n - 1] containing a tabulated function yai
    55. /// D f.xai /, this routine returns an array of coefficients
    56. /// cof[0..n - 1], such that yai = sum(cofj * xaij)(j = 0...n - 1).
    57. ///
    58. ///
    59. ///
    60. ///
    61. public static void polcof(double[] xa, double[] ya, double[] cof)
    62. {
    63. int n = xa.Length;
    64. double[] x = new double[n];
    65. double[] y = new double[n];
    66. for (int j = 0; j < n; j++)
    67. {
    68. x[j] = xa[j];
    69. y[j] = ya[j];
    70. }
    71. for (int j = 0; j < n; j++)
    72. {
    73. double[] x_t = new double[n - j];
    74. double[] y_t = new double[n - j];
    75. for (int i = 0; i < n - j; i++)
    76. {
    77. x_t[i] = x[i];
    78. y_t[i] = y[i];
    79. }
    80. Poly_interp interp = new Poly_interp(x, y, n - j);
    81. cof[j] = interp.rawinterp(0, 0.0);
    82. double xmin = 1.0e99;
    83. int k = -1;
    84. for (int i = 0; i < n - j; i++)
    85. {
    86. if (Math.Abs(x[i]) < xmin)
    87. {
    88. xmin = Math.Abs(x[i]);
    89. k = i;
    90. }
    91. if (x[i] != 0.0)
    92. {
    93. y[i] = (y[i] - cof[j]) / x[i];
    94. }
    95. }
    96. for (int i = k + 1; i < n - j; i++)
    97. {
    98. y[i - 1] = y[i];
    99. x[i - 1] = x[i];
    100. }
    101. }
    102. }
    103. }
    104. }

  • 相关阅读:
    SpringBoot 源码 | prepareEnvironment 方法解析
    b站pink老师JavaScript的移动端网页特效 案例代码——移动端轮播图+返回顶部模块
    《天道》中最智慧的4句话,看懂改变一生
    循环和可迭代对象高级用法
    【无标题】
    基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I
    12 Python正则表达式
    感叹之余随手记—他山之石,可以攻玉
    【线性代数 & C++】求逆矩阵
    iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端
  • 原文地址:https://blog.csdn.net/beijinghorn/article/details/134443012