Poli.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using MathNet.Numerics.LinearAlgebra;
  2. using MathNet.Numerics.LinearAlgebra.Double;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace _03_1_Aproksymacja
  9. {
  10. public class Poli
  11. {
  12. public double[] x;
  13. public double[] y;
  14. //stopień wielomianu
  15. public int m;
  16. //ilosć punktów == x.Length == y.Length
  17. public int n;
  18. //współczyniki wielomianu
  19. public double[] a;
  20. //
  21. public double[,] A;
  22. //kolumna wyrazów wolnych
  23. public double[] b;
  24. public double Y(double x0)
  25. {
  26. double r = 0;
  27. double dx = 1;
  28. for (int i = 0; i <= m; i++)
  29. {
  30. r = r + dx * a[i];
  31. dx = dx * x0;
  32. }
  33. return r;
  34. }
  35. public void WyznaczA()
  36. {
  37. A = new double[m + 1, m + 1];
  38. b = new double[m + 1];
  39. double[] rx = new double[n];
  40. double[] ry = new double[n];
  41. for (int i = 0; i < n; i++)
  42. {
  43. rx[i] = 1;
  44. ry[i] = y[i];
  45. }
  46. for (int j = 0; j <= m; j++)
  47. {
  48. int i = 0;
  49. double sum = 0;
  50. for (int k = 0; k < n; k++)
  51. sum = sum + rx[k];
  52. A[i, j] = sum;
  53. int i2 = i;
  54. int j2 = j;
  55. while ((j2 - 1) >= 0)
  56. {
  57. i2 = i2 + 1;
  58. j2 = j2 - 1;
  59. A[i2, j2] = sum;
  60. }
  61. double sumb = 0;
  62. for (int k = 0; k < n; k++)
  63. sumb += ry[k];
  64. b[j] = sumb;
  65. for (int k = 0; k < n; k++)
  66. {
  67. rx[k] = rx[k] * x[k];
  68. ry[k] = ry[k] * x[k];
  69. }
  70. }
  71. for (int i = 1; i <= m; i++)
  72. {
  73. int j = m;
  74. double sum = 0;
  75. for (int k = 0; k < n; k++)
  76. sum = sum + rx[k];
  77. A[i, j] = sum;
  78. int i2 = i;
  79. int j2 = j;
  80. while ((i2 + 1) <= m)
  81. {
  82. i2 = i2 + 1;
  83. j2 = j2 - 1;
  84. A[i2, j2] = sum;
  85. }
  86. for (int k = 0; k < n; k++)
  87. rx[k] = rx[k] * x[k];
  88. }
  89. Matrix<double> Am = DenseMatrix.OfArray(A);
  90. Vector<double> bm = DenseVector.OfArray(b);
  91. Vector<double> am = Am.Solve(bm);
  92. a = am.AsArray();
  93. }
  94. public double PoliczDlaX(double x0)
  95. {
  96. double sum = 0;
  97. double rx = 1;
  98. for (int i = 0; i <= m; i++)
  99. {
  100. sum = sum + a[i] * rx;
  101. rx = rx * x0;
  102. }
  103. return sum;
  104. }
  105. }
  106. }