Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.02 KB | None | 0 0
  1. /// <summary>
  2. /// разностный метод решения задачи Коши
  3. /// с 1 порядком апроксимации
  4. /// </summary>
  5. /// <param name="A"></param>
  6. /// <param name="B"></param>
  7. /// <param name="Y"></param>
  8. /// <param name="F"></param>
  9. /// <param name="N"></param>
  10. /// <returns></returns>
  11. public static List<PointF> FiniteDiffMethod1(double A, double B, double Y, Func<double, double> F, Func<double,double> P, Func<double, double> Q, int N)
  12. {
  13. // Проверка корректности исходных данных
  14. if (A >= B)
  15. {
  16. throw new Exception("Координата правой точки должна быть больше координаты левой");
  17. }
  18. if (N <= 0)
  19. {
  20. throw new Exception("Количество элементов разбиения должно быть положительным");
  21. }
  22. double h = (B - A) / N;
  23. double[] x = CauchyProblem.Discretization(A, B, N);
  24. PointF[] points = new PointF[N];
  25. double[] y = new double[N + 1];
  26. y[0] = 4 * Math.Log(4);
  27. y[1] =y[0]+h*( 3 * (3 * Math.Log(4) - 1));
  28. for (int i = 2; i < y.Length; i++)
  29. {
  30. y[i] = (1 / (1 + P(x[i]) * h)) * (h * h * F(x[i - 1]) + (2 + h * P(x[i - 1]) - h * h * Q(x[i - 1])) * y[i - 1] - y[i - 2]);
  31. }
  32. for(int i = 0;i<points.Length;i++)
  33. {
  34. points[i].X = (float)x[i];
  35. points[i].Y = (float)y[i];
  36. }
  37. return new List<PointF>(points);
  38. }
  39.  
  40. /// <summary>
  41. /// разностный метод решения задачи Коши
  42. /// со 2 порядком апроксимации
  43. /// </summary>
  44. /// <param name="A"></param>
  45. /// <param name="B"></param>
  46. /// <param name="Y"></param>
  47. /// <param name="F"></param>
  48. /// <param name="P"></param>
  49. /// <param name="Q"></param>
  50. /// <param name="N"></param>
  51. /// <returns></returns>
  52. public static List<PointF> FiniteDiffMethod2(double A, double B, double Y, Func<double, double> F, Func<double, double> P, Func<double, double> Q, int N)
  53. {
  54. // Проверка корректности исходных данных
  55. if (A >= B)
  56. {
  57. throw new Exception("Координата правой точки должна быть больше координаты левой");
  58. }
  59. if (N <= 0)
  60. {
  61. throw new Exception("Количество элементов разбиения должно быть положительным");
  62. }
  63. double h = (B - A) / N;
  64. double[] x = CauchyProblem.Discretization(A, B, N);
  65. PointF[] points = new PointF[N];
  66. double[] y = new double[N + 1];
  67. double za = 3 * (3 * Math.Log(4) - 1);
  68. double H = h * h;
  69. y[0] = 4 * Math.Log(4);
  70. y[1] = (1 - (H/2) * Q(x[0])) * y[0] + (1-(h/2)* P(x[0])) * za*h + (H/2)* F(x[0]);
  71. double h2 = h / 2;
  72. double a, b, c, d;
  73. for(int i = 2;i<y.Length;i++)
  74. {
  75. a = 1 / (1 + h2 * P(x[i - 1]));
  76. b = H * F(x[i - 1]);
  77. c = 2 - H * Q(x[i - 1]);
  78. d = 1- h2 * P(x[i - 1]);
  79. y[i] = a * (b + c * y[i - 1] - d * y[i - 2]);
  80. //y[i] = (1 / (1 + h2* P(x[i - 1]))) * (H* F(x[i - 1]) + (2 - H * Q(x[i - 1])) * y[i - 1] - (1 - h2 * P(x[i - 1])) * y[i - 2]);
  81. }
  82. for(int i =0;i<points.Length;i++)
  83. {
  84. points[i].Y = (float)y[i];
  85. points[i].X = (float)x[i];
  86. }
  87. return new List<PointF>(points);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement