Обратная функция. Поиск исходного значения - 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)); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д