public double FindArgument(FunctionD function, double eps, double funcTarget) { double funcfirst, funcsec, funcmid, mid; //Значение функции в левой границе, правой,функция от середины интервала, середина интервала funcfirst = function(LeftBorder); funcsec = function(RightBorder); if (funcfirst * funcsec < 0) //Если границы имеют разные знаки, выполняем следующее: * { do { mid = (LeftBorder + RightBorder) / 2; //Находим середину интервала funcmid = function(mid); //Функция от середины интервала if (funcfirst * funcmid < 0) //Если левая граница и середина интервала имеют разные знаки, то берём середину интервала за правую границу ** { RightBorder = mid; funcsec = funcmid; } else //иначе, берём середину интервала за левую границу ** { LeftBorder = mid; funcfirst = funcmid; } }while (RightBorder - LeftBorder > eps); // Пока длина интервала превышает значение точности, выполняем цикл } else //Иначе говорим, что границы взяли неверно * { Console.WriteLine("Неверные границы "); return(Double.NaN); } return((LeftBorder + RightBorder) / 2); //Уменьшаем интервал }
public double FindArgument(FunctionD function, double eps, double funcTarget) { double delta = 0.2 * eps; //Точность double currX, nextX, currFunc, defcurrFunc; //Текущее приближение, следующее приближение, текущая функция, производная текущей функции double h; //Длина интервала currX = StartX; //Задаём текущий Х do { currFunc = function(currX); // Подставляем аргумент в заданное уравнение defcurrFunc = (function(currX + delta) - currFunc) / delta; //Подставляем аргумент в производную функции nextX = currX - (currFunc / defcurrFunc); //Вычисляем следующее приближение h = nextX - currX; //Длина интервала currX = nextX; //Выбираем следующее приближение за текущее } while (Math.Abs(h) > eps); return(nextX); //Возвращаем следующее приближение }
public double FindArgument(FunctionD function, double eps, double funcTarget) { double currX = StartX; //Выбираем текущий Х double FuncX = function(currX); //Подставляем в уравнение long iteration = 0; //Задаём номер итерации var t = Math.Abs(FuncX - currX); //Модуль разницы между F(x) и х do { currX = FuncX; // Х+1 = F(x) FuncX = function(currX); // обновляем значение функции от текущего Х var currentT = Math.Abs(FuncX - currX); // обновляем модуль разницы между F(x) и х if (currentT > t) // если обновленное значение больше предыдущего, то выполняем следующее: { return(double.NaN); } ++iteration; // увеличиваем номер итерации t = currentT; // приравниваем обновленное значение t }while (t >= eps); //цикл выполняется, пока не добьемся нужной точности return(FuncX); //возвращаем полученное значение функции }