Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// разностный метод решения задачи Коши
- /// с 1 порядком апроксимации
- /// </summary>
- /// <param name="A"></param>
- /// <param name="B"></param>
- /// <param name="Y"></param>
- /// <param name="F"></param>
- /// <param name="N"></param>
- /// <returns></returns>
- 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)
- {
- // Проверка корректности исходных данных
- if (A >= B)
- {
- throw new Exception("Координата правой точки должна быть больше координаты левой");
- }
- if (N <= 0)
- {
- throw new Exception("Количество элементов разбиения должно быть положительным");
- }
- double h = (B - A) / N;
- double[] x = CauchyProblem.Discretization(A, B, N);
- PointF[] points = new PointF[N];
- double[] y = new double[N + 1];
- y[0] = 4 * Math.Log(4);
- y[1] =y[0]+h*( 3 * (3 * Math.Log(4) - 1));
- for (int i = 2; i < y.Length; i++)
- {
- 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]);
- }
- for(int i = 0;i<points.Length;i++)
- {
- points[i].X = (float)x[i];
- points[i].Y = (float)y[i];
- }
- return new List<PointF>(points);
- }
- /// <summary>
- /// разностный метод решения задачи Коши
- /// со 2 порядком апроксимации
- /// </summary>
- /// <param name="A"></param>
- /// <param name="B"></param>
- /// <param name="Y"></param>
- /// <param name="F"></param>
- /// <param name="P"></param>
- /// <param name="Q"></param>
- /// <param name="N"></param>
- /// <returns></returns>
- 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)
- {
- // Проверка корректности исходных данных
- if (A >= B)
- {
- throw new Exception("Координата правой точки должна быть больше координаты левой");
- }
- if (N <= 0)
- {
- throw new Exception("Количество элементов разбиения должно быть положительным");
- }
- double h = (B - A) / N;
- double[] x = CauchyProblem.Discretization(A, B, N);
- PointF[] points = new PointF[N];
- double[] y = new double[N + 1];
- double za = 3 * (3 * Math.Log(4) - 1);
- double H = h * h;
- y[0] = 4 * Math.Log(4);
- y[1] = (1 - (H/2) * Q(x[0])) * y[0] + (1-(h/2)* P(x[0])) * za*h + (H/2)* F(x[0]);
- double h2 = h / 2;
- double a, b, c, d;
- for(int i = 2;i<y.Length;i++)
- {
- a = 1 / (1 + h2 * P(x[i - 1]));
- b = H * F(x[i - 1]);
- c = 2 - H * Q(x[i - 1]);
- d = 1- h2 * P(x[i - 1]);
- y[i] = a * (b + c * y[i - 1] - d * y[i - 2]);
- //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]);
- }
- for(int i =0;i<points.Length;i++)
- {
- points[i].Y = (float)y[i];
- points[i].X = (float)x[i];
- }
- return new List<PointF>(points);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement