Производная, код приближенного вычисления - C#
Формулировка задачи:
Доброго времени суток.
Столкнулся с проблемой поиска производной.
Программа должна находить корень по методу хорд.
Во время проверки условия неподвижности границы нужно искать двойную производную(численно).
У меня есть метод
А проверка выглядит так (в качестве C передается "край" диапазона)
f(c)*f''(c)>0.
Есть ли библиотека, или алгоритм готовый для такой цели?
Что бы выглядело примерно так
Листинг программы
- public double get_y(double x)
- {
- double y;
- //Сюда уравнение, сам метод возвращает y.
- y = Math.Pow(x, 4) + 4*Math.Pow(x, 3) - 8*Math.Pow(x, 2) - 17;
- return y;
- }
Листинг программы
- if (get_y(c)*Оператор(get_y(с))>0)
- {
- .....
- }
Решение задачи: «Производная, код приближенного вычисления»
textual
Листинг программы
- namespace Derivatives
- {
- class Program
- {
- public delegate double Function(double x);
- #region Forward Derivatives
- public static double DerivativeForward1(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (-3 * f(x) + 4 * f(x + h) - f(x + 2 * h)) / 2 / h;
- }
- public static double DerivativeForward1(double[] y, int i, double h)
- {
- if (y == null || y.Length < 3 || i < 0 || i > y.Length - 3 || h == 0)
- return double.NaN;
- return (-3 * y[i] + 4 * y[i + 1] - y[i + 2]) / 2 / h;
- }
- public static double DerivativeForward2(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (2 * f(x) - 5 * f(x + h) + 4 * f(x + 2 * h) - f(x + 3 * h)) / h / h;
- }
- public static double DerivativeForward2(double[] y, int i, double h)
- {
- if (y == null || y.Length < 4 || i < 0 || i > y.Length - 4 || h == 0)
- return double.NaN;
- return (2 * y[i] - 5 * y[i + 1] + 4 * y[i + 2] - y[i + 3]) / h / h;
- }
- public static double DerivativeForward3(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (-5 * f(x) + 18 * f(x + h) - 24 * f(x + 2 * h) + 14 * f(x + 3 * h) - 3 * f(x + 4 * h)) / 2 / h / h / h;
- }
- public static double DerivativeForward3(double[] y, int i, double h)
- {
- if (y == null || y.Length < 5 || i < 0 || i > y.Length - 5 || h == 0)
- return double.NaN;
- return (-5 * y[i] + 18 * y[i + 1] - 24 * y[i + 2] + 14 * y[i + 3] -
- 3 * y[i + 4]) / 2 / h / h / h;
- }
- public static double DerivativeForward4(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (3 * f(x) - 14 * f(x + h) + 26 * f(x + 2 * h) - 24 * f(x + 3 * h) + 11 * f(x + 4 * h) - 2 * f(x + 5 * h)) / h / h / h / h;
- }
- public static double DerivativeForward4(double[] y, int i, double h)
- {
- if (y == null || y.Length < 6 || i < 0 || i > y.Length - 6 || h == 0)
- return double.NaN;
- return (3 * y[i] - 14 * y[i + 1] + 26 * y[i + 2] - 24 * y[i + 3] +
- 11 * y[i + 4] - 2 * y[i + 5]) / h / h / h / h;
- }
- #endregion
- #region Backward Derivatives
- public static double DerivativeBackward1(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (3 * f(x) - 4 * f(x - h) + f(x - 2 * h)) / 2 / h;
- }
- public static double DerivativeBackward1(double[] y, int i, double h)
- {
- if (y == null || y.Length < 3 || i < 0 || i < 3 || h == 0)
- return double.NaN;
- return (3 * y[i] - 4 * y[i - 1] + y[i - 2]) / 2 / h;
- }
- public static double DerivativeBackward2(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (2 * f(x) - 5 * f(x - h) + 4 * f(x - 2 * h) - f(x - 3 * h)) / h / h;
- }
- public static double DerivativeBackward2(double[] y, int i, double h)
- {
- if (y == null || y.Length < 4 || i < 0 || i < 4 || h == 0)
- return double.NaN;
- return (2 * y[i] - 5 * y[i - 1] + 4 * y[i - 2] - y[i - 3]) / h / h;
- }
- public static double DerivativeBackward3(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (5 * f(x) - 18 * f(x - h) + 24 * f(x - 2 * h) - 14 * f(x - 3 * h) + 3 * f(x - 4 * h)) / 2 / h / h / h;
- }
- public static double DerivativeBackward3(double[] y, int i, double h)
- {
- if (y == null || y.Length < 5 || i < 0 || i < 5 || h == 0)
- return double.NaN;
- return (5 * y[i] - 18 * y[i - 1] + 24 * y[i - 2] - 14 * y[i - 3] +
- 3 * y[i - 4]) / 2 / h / h / h;
- }
- public static double DerivativeBackward4(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (3 * f(x) - 14 * f(x - h) + 26 * f(x - 2 * h) - 24 * f(x - 3 * h) + 11 * f(x - 4 * h) - 2 * f(x - 5 * h)) / h / h / h / h;
- }
- public static double DerivativeBackward4(double[] y, int i, double h)
- {
- if (y == null || y.Length < 6 || i < 0 || i < 6 || h == 0)
- return double.NaN;
- return (3 * y[i] - 14 * y[i - 1] + 26 * y[i - 2] - 24 * y[i - 3] +
- 11 * y[i - 4] - 2 * y[i - 5]) / h / h / h / h;
- }
- #endregion
- #region Central Derivatives
- public static double DerivativeCentral1(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (f(x + h) - f(x - h)) / 2 / h;
- }
- public static double DerivativeCentral1(double[] y, int i, double h)
- {
- if (y == null || y.Length < 3 || i < 1 || i > y.Length - 2 || h == 0)
- return double.NaN;
- return (y[i + 1] - y[i - 1]) / 2 / h;
- }
- public static double DerivativeCentral2(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (f(x - h) - 2 * f(x) + f(x + h)) / h / h;
- }
- public static double DerivativeCentral2(double[] y, int i, double h)
- {
- if (y == null || y.Length < 3 || i < 1 || i > y.Length - 2 || h == 0)
- return double.NaN;
- return (y[i - 1] - 2 * y[i] + y[i + 1]) / h / h;
- }
- public static double DerivativeCentral3(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (-f(x - 2 * h) + 2 * f(x - h) - 2 * f(x + h) + f(x + 2 * h)) / 2 / h / h / h;
- }
- public static double DerivativeCentral3(double[] y, int i, double h)
- {
- if (y == null || y.Length < 5 || i < 2 || i > y.Length - 3 || h == 0)
- return double.NaN;
- return (-y[i - 2] + 2 * y[i - 1] - 2 * y[i + 1] + y[i + 2]) / 2 / h / h / h;
- }
- public static double DerivativeCentral4(Function f, double x, double h)
- {
- h = (h == 0) ? 0.01 : h;
- return (f(x - 2 * h) - 4 * f(x - h) + 6 * f(x) - 4 * f(x + h) + f(x + 2 * h)) / h / h / h / h;
- }
- public static double DerivativeCentral4(double[] y, int i, double h)
- {
- if (y == null || y.Length < 5 || i < 2 || i > y.Length - 3 || h == 0)
- return double.NaN;
- return (y[i - 2] - 4 * y[i - 1] + 6 * y[i] -
- 4 * y[i + 1] + y[i + 2]) / h / h / h / h;
- }
- #endregion
- #region Test Functions
- //Test function: f(x) = cos(x)
- static double f1(double x)
- {
- return Math.Cos(x);
- }
- //Test function: f(x) = x^3 + e^x
- static double f2(double x)
- {
- return x * x * x + Math.Exp(x);
- }
- static void TestForwardDifferenceMethod()
- {
- double h = 0.1;
- // Calculate derivatives using f(x) = cos(x) at x=0.3:
- Console.WriteLine("Using the FORWARD difference method\n");
- double dy = DerivativeForward1(f1, 0.3, h);
- Console.WriteLine(" f'(x) = " + dy.ToString());
- dy = DerivativeForward2(f1, 0.3, h);
- Console.WriteLine(" f''(x) = " + dy.ToString());
- dy = DerivativeForward3(f1, 0.3, h);
- Console.WriteLine(" f'''(x) = " + dy.ToString());
- dy = DerivativeForward4(f1, 0.3, h);
- Console.WriteLine(" f''''(x) = " + dy.ToString());
- // Calculate derivatives using just array values at x=0.3 or i=3
- Console.WriteLine("\nDerivatives using just array values:\n");
- double[] y=new double[10];
- for (int i = 0; i < 10; i++)
- y[i] = f1(i * h);
- dy = DerivativeForward1(y, 3, h);
- Console.WriteLine(" y' = " + dy.ToString());
- dy = DerivativeForward2(y, 3, h);
- Console.WriteLine(" y'' = " + dy.ToString());
- dy = DerivativeForward3(y, 3, h);
- Console.WriteLine(" y''' = " + dy.ToString());
- dy = DerivativeForward4(y, 3, h);
- Console.WriteLine(" y'''' = " + dy.ToString());
- Console.WriteLine("------------------------------------");
- }
- static void TestBackwardDifferenceMethod()
- {
- double h = 0.1;
- // Calculate derivatives using f(x) = cos(x) at x=0.7:
- Console.WriteLine("\nUsing the BACKWARD difference method\n");
- double dy = DerivativeBackward1(f1, 0.7, h);
- Console.WriteLine(" f'(x) = " + dy.ToString());
- dy = DerivativeBackward2(f1, 0.7, h);
- Console.WriteLine(" f''(x) = " + dy.ToString());
- dy = DerivativeBackward3(f1, 0.7, h);
- Console.WriteLine(" f'''(x) = " + dy.ToString());
- dy = DerivativeBackward4(f1, 0.7, h);
- Console.WriteLine(" f''''(x) = " + dy.ToString());
- // Calculate derivatives for array values at x=0.7 or i=7:
- Console.WriteLine("\nDerivatives for array values:\n");
- double[] y = new double[10];
- for (int i = 0; i < 10; i++)
- y[i] = f1(i * h);
- dy = DerivativeBackward1(y, 7, h);
- Console.WriteLine(" y' = " + dy.ToString());
- dy = DerivativeBackward2(y, 7, h);
- Console.WriteLine(" y'' = " + dy.ToString());
- dy = DerivativeBackward3(y, 7, h);
- Console.WriteLine(" y''' = " + dy.ToString());
- dy = DerivativeBackward4(y, 7, h);
- Console.WriteLine(" y'''' = " + dy.ToString());
- Console.WriteLine("---------------------------------------");
- }
- static void TestCentralDifferenceMethod()
- {
- double h = 0.1;
- // Calculate derivatives using f(x) = cos(x) at x=0.5:
- Console.WriteLine("\nUsing the CENTRAL difference method\n");
- double dy = DerivativeCentral1(f1, 0.5, h);
- Console.WriteLine(" f'(x) = " + dy.ToString());
- dy = DerivativeCentral2(f1, 0.5, h);
- Console.WriteLine(" f''(x) = " + dy.ToString());
- dy = DerivativeCentral3(f1, 0.5, h);
- Console.WriteLine(" f'''(x) = " + dy.ToString());
- dy = DerivativeCentral4(f1, 0.5, h);
- Console.WriteLine(" f''''(x) = " + dy.ToString());
- // Calculate derivatives for array values at x=0.5 or i=5
- Console.WriteLine("\nDerivatives for array values:\n");
- double[] y = new double[10];
- for (int i = 0; i < 10; i++)
- y[i] = f1(i * h);
- dy = DerivativeCentral1(y, 5, h);
- Console.WriteLine(" y' = " + dy.ToString());
- dy = DerivativeCentral2(y, 5, h);
- Console.WriteLine(" y'' = " + dy.ToString());
- dy = DerivativeCentral3(y, 5, h);
- Console.WriteLine(" y''' = " + dy.ToString());
- dy = DerivativeCentral4(y, 5, h);
- Console.WriteLine(" y'''' = " + dy.ToString());
- Console.WriteLine("---------------------------------------");
- }
- #endregion
- static void Main(string[] args)
- {
- TestForwardDifferenceMethod();
- TestBackwardDifferenceMethod();
- TestCentralDifferenceMethod();
- Console.ReadLine();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д