NewtonRaphson.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using _04_2_Gauss;
  2. using System;
  3. namespace _06_2_Newton_ulady_rownan
  4. {
  5. public delegate double FW(double[] x);
  6. public class NewtonRaphson
  7. {
  8. public FW[] funcs;
  9. public FW[,] fprims;
  10. public double eps;
  11. public double[] x0;
  12. double[,] J;
  13. double[] B;
  14. double[] x;
  15. double[] H;
  16. int N;
  17. public int licznik;
  18. void Init()
  19. {
  20. B = new double[N];
  21. J = new double[N, N];
  22. }
  23. public double[] Oblicz()
  24. {
  25. N = x0.Length;
  26. Init();
  27. licznik = 0;
  28. x = (double[])x0.Clone();
  29. do
  30. {
  31. licznik++;
  32. LiczB();
  33. LiczJ();
  34. LiczH();
  35. DodajH2X();
  36. } while (Norma() > eps);
  37. return x;
  38. }
  39. private void LiczB()
  40. {
  41. for (int i = 0; i < N; i++)
  42. B[i] = -funcs[i](x);
  43. }
  44. private void LiczJ()
  45. {
  46. for (int i = 0; i < N; i++)
  47. for (int j = 0; j < N; j++)
  48. J[i, j] = fprims[i, j](x);
  49. }
  50. private void LiczH()
  51. {
  52. Gauss g = new Gauss();
  53. g.A = J;
  54. g.b = B;
  55. g.Wybor = MetodaWyboru.Czesciowy;
  56. H = g.Oblicz();
  57. }
  58. private void DodajH2X()
  59. {
  60. for (int i = 0; i < N; i++)
  61. x[i] = x[i] + H[i];
  62. }
  63. private double Norma()
  64. {
  65. double sum = 0;
  66. for (int i = 0; i < N; i++)
  67. sum = sum + H[i] * H[i];
  68. sum = Math.Sqrt(sum);
  69. return sum;
  70. }
  71. }
  72. }