Производная, код приближенного вычисления - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Столкнулся с проблемой поиска производной. Программа должна находить корень по методу хорд. Во время проверки условия неподвижности границы нужно искать двойную производную(численно). У меня есть метод
Листинг программы
  1. public double get_y(double x)
  2. {
  3. double y;
  4. //Сюда уравнение, сам метод возвращает y.
  5. y = Math.Pow(x, 4) + 4*Math.Pow(x, 3) - 8*Math.Pow(x, 2) - 17;
  6. return y;
  7. }
А проверка выглядит так (в качестве C передается "край" диапазона) f(c)*f''(c)>0. Есть ли библиотека, или алгоритм готовый для такой цели? Что бы выглядело примерно так
Листинг программы
  1. if (get_y(c)*Оператор(get_y(с))>0)
  2. {
  3. .....
  4. }

Решение задачи: «Производная, код приближенного вычисления»

textual
Листинг программы
  1. namespace Derivatives
  2. {
  3.     class Program
  4.     {
  5.         public delegate double Function(double x);
  6.  
  7.         #region Forward Derivatives
  8.  
  9.         public static double DerivativeForward1(Function f, double x, double h)
  10.         {
  11.             h = (h == 0) ? 0.01 : h;
  12.             return (-3 * f(x) + 4 * f(x + h) - f(x + 2 * h)) / 2 / h;
  13.         }
  14.  
  15.         public static double DerivativeForward1(double[] y, int i, double h)
  16.         {
  17.             if (y == null || y.Length < 3 || i < 0 || i > y.Length - 3 || h == 0)
  18.                 return double.NaN;
  19.             return (-3 * y[i] + 4 * y[i + 1] - y[i + 2]) / 2 / h;
  20.         }
  21.  
  22.         public static double DerivativeForward2(Function f, double x, double h)
  23.         {
  24.             h = (h == 0) ? 0.01 : h;
  25.             return (2 * f(x) - 5 * f(x + h) + 4 * f(x + 2 * h) - f(x + 3 * h)) / h / h;
  26.         }
  27.  
  28.         public static double DerivativeForward2(double[] y, int i, double h)
  29.         {
  30.             if (y == null || y.Length < 4 || i < 0 || i > y.Length - 4 || h == 0)
  31.                 return double.NaN;
  32.             return (2 * y[i] - 5 * y[i + 1] + 4 * y[i + 2] - y[i + 3]) / h / h;
  33.         }
  34.  
  35.         public static double DerivativeForward3(Function f, double x, double h)
  36.         {
  37.             h = (h == 0) ? 0.01 : h;
  38.             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;
  39.         }
  40.  
  41.         public static double DerivativeForward3(double[] y, int i, double h)
  42.         {
  43.             if (y == null || y.Length < 5 || i < 0 || i > y.Length - 5 || h == 0)
  44.                 return double.NaN;
  45.             return (-5 * y[i] + 18 * y[i + 1] - 24 * y[i + 2] + 14 * y[i + 3] -
  46.                      3 * y[i + 4]) / 2 / h / h / h;
  47.         }
  48.  
  49.         public static double DerivativeForward4(Function f, double x, double h)
  50.         {
  51.             h = (h == 0) ? 0.01 : h;
  52.             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;
  53.         }
  54.  
  55.         public static double DerivativeForward4(double[] y, int i, double h)
  56.         {
  57.             if (y == null || y.Length < 6 || i < 0 || i > y.Length - 6 || h == 0)
  58.                 return double.NaN;
  59.             return (3 * y[i] - 14 * y[i + 1] + 26 * y[i + 2] - 24 * y[i + 3] +
  60.                     11 * y[i + 4] - 2 * y[i + 5]) / h / h / h / h;
  61.         }
  62.  
  63.         #endregion
  64.  
  65.         #region Backward Derivatives
  66.  
  67.         public static double DerivativeBackward1(Function f, double x, double h)
  68.         {
  69.             h = (h == 0) ? 0.01 : h;
  70.             return (3 * f(x) - 4 * f(x - h) + f(x - 2 * h)) / 2 / h;
  71.         }
  72.  
  73.         public static double DerivativeBackward1(double[] y, int i, double h)
  74.         {
  75.             if (y == null || y.Length < 3 || i < 0 || i < 3 || h == 0)
  76.                 return double.NaN;
  77.             return (3 * y[i] - 4 * y[i - 1] + y[i - 2]) / 2 / h;
  78.         }
  79.  
  80.         public static double DerivativeBackward2(Function f, double x, double h)
  81.         {
  82.             h = (h == 0) ? 0.01 : h;
  83.             return (2 * f(x) - 5 * f(x - h) + 4 * f(x - 2 * h) - f(x - 3 * h)) / h / h;
  84.         }
  85.  
  86.         public static double DerivativeBackward2(double[] y, int i, double h)
  87.         {
  88.             if (y == null || y.Length < 4 || i < 0 || i < 4 || h == 0)
  89.                 return double.NaN;
  90.             return (2 * y[i] - 5 * y[i - 1] + 4 * y[i - 2] - y[i - 3]) / h / h;
  91.         }
  92.  
  93.         public static double DerivativeBackward3(Function f, double x, double h)
  94.         {
  95.             h = (h == 0) ? 0.01 : h;
  96.             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;
  97.         }
  98.  
  99.         public static double DerivativeBackward3(double[] y, int i, double h)
  100.         {
  101.             if (y == null || y.Length < 5 || i < 0 || i < 5 || h == 0)
  102.                 return double.NaN;
  103.             return (5 * y[i] - 18 * y[i - 1] + 24 * y[i - 2] - 14 * y[i - 3] +
  104.                      3 * y[i - 4]) / 2 / h / h / h;
  105.         }
  106.  
  107.         public static double DerivativeBackward4(Function f, double x, double h)
  108.         {
  109.             h = (h == 0) ? 0.01 : h;
  110.             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;
  111.         }
  112.  
  113.         public static double DerivativeBackward4(double[] y, int i, double h)
  114.         {
  115.             if (y == null || y.Length < 6 || i < 0 || i < 6 || h == 0)
  116.                 return double.NaN;
  117.             return (3 * y[i] - 14 * y[i - 1] + 26 * y[i - 2] - 24 * y[i - 3] +
  118.                     11 * y[i - 4] - 2 * y[i - 5]) / h / h / h / h;
  119.         }
  120.  
  121.         #endregion
  122.  
  123.         #region Central Derivatives
  124.  
  125.         public static double DerivativeCentral1(Function f, double x, double h)
  126.         {
  127.             h = (h == 0) ? 0.01 : h;
  128.             return (f(x + h) - f(x - h)) / 2 / h;
  129.         }
  130.  
  131.         public static double DerivativeCentral1(double[] y, int i, double h)
  132.         {
  133.             if (y == null || y.Length < 3 || i < 1 || i > y.Length - 2 || h == 0)
  134.                 return double.NaN;
  135.             return (y[i + 1] - y[i - 1]) / 2 / h;
  136.         }
  137.  
  138.         public static double DerivativeCentral2(Function f, double x, double h)
  139.         {
  140.             h = (h == 0) ? 0.01 : h;
  141.             return (f(x - h) - 2 * f(x) + f(x + h)) / h / h;
  142.         }
  143.  
  144.         public static double DerivativeCentral2(double[] y, int i, double h)
  145.         {
  146.             if (y == null || y.Length < 3 || i < 1 || i > y.Length - 2 || h == 0)
  147.                 return double.NaN;
  148.             return (y[i - 1] - 2 * y[i] + y[i + 1]) / h / h;
  149.         }
  150.  
  151.         public static double DerivativeCentral3(Function f, double x, double h)
  152.         {
  153.             h = (h == 0) ? 0.01 : h;
  154.             return (-f(x - 2 * h) + 2 * f(x - h) - 2 * f(x + h) + f(x + 2 * h)) / 2 / h / h / h;
  155.         }
  156.  
  157.         public static double DerivativeCentral3(double[] y, int i, double h)
  158.         {
  159.             if (y == null || y.Length < 5 || i < 2 || i > y.Length - 3 || h == 0)
  160.                 return double.NaN;
  161.             return (-y[i - 2] + 2 * y[i - 1] - 2 * y[i + 1] + y[i + 2]) / 2 / h / h / h;
  162.         }
  163.  
  164.         public static double DerivativeCentral4(Function f, double x, double h)
  165.         {
  166.             h = (h == 0) ? 0.01 : h;
  167.             return (f(x - 2 * h) - 4 * f(x - h) + 6 * f(x) - 4 * f(x + h) + f(x + 2 * h)) / h / h / h / h;
  168.         }
  169.  
  170.         public static double DerivativeCentral4(double[] y, int i, double h)
  171.         {
  172.             if (y == null || y.Length < 5 || i < 2 || i > y.Length - 3 || h == 0)
  173.                 return double.NaN;
  174.             return (y[i - 2] - 4 * y[i - 1] + 6 * y[i] -
  175.                     4 * y[i + 1] + y[i + 2]) / h / h / h / h;
  176.         }
  177.  
  178.         #endregion
  179.  
  180.  
  181.  
  182.         #region Test Functions
  183.  
  184.         //Test function: f(x) = cos(x)
  185.         static double f1(double x)
  186.         {
  187.             return Math.Cos(x);
  188.         }
  189.  
  190.         //Test function: f(x) = x^3 + e^x
  191.         static double f2(double x)
  192.         {
  193.             return x * x * x + Math.Exp(x);
  194.         }
  195.  
  196.         static void TestForwardDifferenceMethod()
  197.         {
  198.             double h = 0.1;
  199.  
  200.             // Calculate derivatives using f(x) = cos(x) at x=0.3:
  201.             Console.WriteLine("Using the FORWARD difference method\n");
  202.  
  203.             double dy = DerivativeForward1(f1, 0.3, h);
  204.             Console.WriteLine(" f'(x) = " + dy.ToString());
  205.             dy = DerivativeForward2(f1, 0.3, h);
  206.             Console.WriteLine(" f''(x) = " + dy.ToString());
  207.             dy = DerivativeForward3(f1, 0.3, h);
  208.             Console.WriteLine(" f'''(x) = " + dy.ToString());
  209.             dy = DerivativeForward4(f1, 0.3, h);
  210.             Console.WriteLine(" f''''(x) = " + dy.ToString());
  211.  
  212.             // Calculate derivatives using just array values at x=0.3 or i=3
  213.             Console.WriteLine("\nDerivatives using just array values:\n");
  214.             double[] y=new double[10];
  215.             for (int i = 0; i < 10; i++)
  216.                 y[i] = f1(i * h);
  217.             dy = DerivativeForward1(y, 3, h);
  218.             Console.WriteLine(" y' = " + dy.ToString());
  219.             dy = DerivativeForward2(y, 3, h);
  220.             Console.WriteLine(" y'' = " + dy.ToString());
  221.             dy = DerivativeForward3(y, 3, h);
  222.             Console.WriteLine(" y''' = " + dy.ToString());
  223.             dy = DerivativeForward4(y, 3, h);
  224.             Console.WriteLine(" y'''' = " + dy.ToString());
  225.             Console.WriteLine("------------------------------------");
  226.         }
  227.  
  228.         static void TestBackwardDifferenceMethod()
  229.         {
  230.             double h = 0.1;
  231.  
  232.             // Calculate derivatives using f(x) = cos(x) at x=0.7:
  233.             Console.WriteLine("\nUsing the BACKWARD difference method\n");
  234.  
  235.             double dy = DerivativeBackward1(f1, 0.7, h);
  236.             Console.WriteLine(" f'(x) = " + dy.ToString());
  237.             dy = DerivativeBackward2(f1, 0.7, h);
  238.             Console.WriteLine(" f''(x) = " + dy.ToString());
  239.             dy = DerivativeBackward3(f1, 0.7, h);
  240.             Console.WriteLine(" f'''(x) = " + dy.ToString());
  241.             dy = DerivativeBackward4(f1, 0.7, h);
  242.             Console.WriteLine(" f''''(x) = " + dy.ToString());
  243.  
  244.             // Calculate derivatives for array values at x=0.7 or i=7:
  245.             Console.WriteLine("\nDerivatives for array values:\n");
  246.             double[] y = new double[10];
  247.             for (int i = 0; i < 10; i++)
  248.                 y[i] = f1(i * h);
  249.             dy = DerivativeBackward1(y, 7, h);
  250.             Console.WriteLine(" y' = " + dy.ToString());
  251.             dy = DerivativeBackward2(y, 7, h);
  252.             Console.WriteLine(" y'' = " + dy.ToString());
  253.             dy = DerivativeBackward3(y, 7, h);
  254.             Console.WriteLine(" y''' = " + dy.ToString());
  255.             dy = DerivativeBackward4(y, 7, h);
  256.             Console.WriteLine(" y'''' = " + dy.ToString());
  257.             Console.WriteLine("---------------------------------------");
  258.         }
  259.  
  260.         static void TestCentralDifferenceMethod()
  261.         {
  262.             double h = 0.1;
  263.  
  264.             // Calculate derivatives using f(x) = cos(x) at x=0.5:
  265.             Console.WriteLine("\nUsing the CENTRAL difference method\n");
  266.  
  267.             double dy = DerivativeCentral1(f1, 0.5, h);
  268.             Console.WriteLine(" f'(x) = " + dy.ToString());
  269.             dy = DerivativeCentral2(f1, 0.5, h);
  270.             Console.WriteLine(" f''(x) = " + dy.ToString());
  271.             dy = DerivativeCentral3(f1, 0.5, h);
  272.             Console.WriteLine(" f'''(x) = " + dy.ToString());
  273.             dy = DerivativeCentral4(f1, 0.5, h);
  274.             Console.WriteLine(" f''''(x) = " + dy.ToString());
  275.  
  276.             // Calculate derivatives for array values at x=0.5 or i=5
  277.             Console.WriteLine("\nDerivatives for array values:\n");
  278.             double[] y = new double[10];
  279.             for (int i = 0; i < 10; i++)
  280.                 y[i] = f1(i * h);
  281.             dy = DerivativeCentral1(y, 5, h);
  282.             Console.WriteLine(" y' = " + dy.ToString());
  283.             dy = DerivativeCentral2(y, 5, h);
  284.             Console.WriteLine(" y'' = " + dy.ToString());
  285.             dy = DerivativeCentral3(y, 5, h);
  286.             Console.WriteLine(" y''' = " + dy.ToString());
  287.             dy = DerivativeCentral4(y, 5, h);
  288.             Console.WriteLine(" y'''' = " + dy.ToString());
  289.             Console.WriteLine("---------------------------------------");
  290.         }
  291.  
  292.  
  293.  
  294.  
  295.         #endregion
  296.      
  297.         static void Main(string[] args)
  298.         {
  299.             TestForwardDifferenceMethod();
  300.             TestBackwardDifferenceMethod();
  301.             TestCentralDifferenceMethod();
  302.             Console.ReadLine();
  303.         }
  304.     }
  305. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы