Обратная функция. Поиск исходного значения - C#

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

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

Есть математическая функция a=(1-b)^4+4*b*(1-b)^4+10*b^2*(1-b)^4+20*b^3*(1-b)^3*((1-b)^2/(b^2+(1-b)^2)) По сути сама формула не важна, главное в ней что нет возможности вывести обратную формулу зависимости а от b. Известно что чем больше значение а, тем больше и b. Известен так же диапазон значения а, от 0 до 1. Как найти а, зная b. С заданной точностью, например 0,001. Чисто по "человечески", я бы занялся подбором. Сначала подставил значение 0,5. Потом, в зависимости от результата, подставлял 0,25 или 0,75. И т.д. Как реализовать такой подбор? Или может есть какой то другой способ?
Хотя, возможно проще будет создать массив значений... и от туда выдергивать нужные. Но может есть и другой способ?

Решение задачи: «Обратная функция. Поиск исходного значения»

textual
Листинг программы
using System;
using System.Diagnostics;
 
class Program
{
   static void Main(string[] args)
   {
      //Заполняем массив значениями функции.
      //Массив заполняем наоборот, чтобы потом его не сортировать.
      double[] arr = new double[10000];
      for(int i = 0; i < arr.Length; ++i)
      {
         arr[arr.Length - i - 1] = Func2((double)i / (arr.Length - 1));
      }
 
      Random rnd = new Random();
      Stopwatch sw = new Stopwatch();
      for(int i = 0; i < 10; ++i)
      {
         //Это число a, для которого надо найти число b.
         double a = rnd.NextDouble();
         sw.Restart();
         //Это искомое число b.
         double b = Find(a, arr);
         sw.Stop();
         //Это точность.
         double precision = Math.Abs(a - Func2(b));
         Console.WriteLine($"Время на бинарный поиск: {sw.Elapsed}");
         Console.WriteLine($"Число a: {a}");
         Console.WriteLine($"Число b: {b}");
         Console.WriteLine($"Точность: {precision.ToString("f10")}");
         Console.WriteLine();
      }
      Console.ReadKey();
   }
 
   public static double Find(double a, double[] arr)
   {
      //Выполняем бинарный поиск.
      int index = Array.BinarySearch(arr, a);
      index = (index < 0) ? ~index : index;
      return (double)(arr.Length - index - 1) / (arr.Length - 1);
   }
 
   //Это оригинальная полиномиальная функция.
   public static double Func1(double x)
   {
      return Math.Pow(1 - x, 4) +
         4 * x * Math.Pow(1 - x, 4) +
         10 * Math.Pow(x, 2) * Math.Pow(1 - x, 4) +
         20 * Math.Pow(x, 3) * Math.Pow(1 - x, 5) / (Math.Pow(x, 2) + Math.Pow(1 - x, 2));
   }
 
   //Это та же функция, что и Func1, но по-другому записанная.
   public static double Func2(double x)
   {
      double a = Math.Pow(1 - x, 2);
      return a * a * (1 + 4 * x + 10 * x * x + 20 * x * x * x * (1 - x) / (x * x + a));
   }
}

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


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

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

11   голосов , оценка 3.727 из 5
Похожие ответы