public static double getRoot(MyFunction func) { f = func.getF(); df = Derivative.get(f); a = func.getA(); b = func.getB(); eps = func.getEps(); int i = 1; if (!Auxiliary.isMonotonous(f, a, b)) { throw new System.InvalidOperationException("Функція не строго монотонна на цьому проміжку. Виберіть інший проміжок."); } else if (!Auxiliary.isRootOnRange(a, b, f)) { throw new System.InvalidOperationException("Функція не має коренів на цьому проміжку. Виберіть інший проміжок."); } findLambda(); Console.WriteLine("Лямбда: " + lambda); while (true) { b = phi(a); if (stopCriteria(a, b)) { break; } a = b; Console.WriteLine("№" + i + " Наближене значення: " + a); i++; } return((a + b) / 2); }
static void findLambda() { if (Auxiliary.isMonotonous(df, a, b)) { double alpha = Math.Min(df(a), df(b)); double gamma = Math.Max(df(a), df(b)); lambda = 2 / (alpha + gamma); q = (gamma - alpha) / (gamma + alpha); } }
public static double getRoot(MyFunction func) { double a = func.getA(); double b = func.getB(); double eps = func.getEps(); Func <double, double> f = func.getF(); Func <double, double> df = Derivative.get(f); Func <double, double> d2f = Derivative.get(df); int i = 1; if (!Auxiliary.isMonotonous(f, a, b)) { throw new System.InvalidOperationException("Функція не строго монотонна на цьому проміжку. Виберіть інший проміжок."); } else if (!Auxiliary.isRootOnRange(a, b, f)) { throw new System.InvalidOperationException("Функція не має коренів на цьому проміжку. Виберіть інший проміжок."); } Console.WriteLine("Початковий проміжок [ " + a + " ; " + b + " ]."); bool a_by_hord = false; if (f(a) * d2f(a) < 0) { a_by_hord = true; } do { if (a_by_hord) { Console.WriteLine("a хордами"); a = a - f(a) * (b - a) / (f(b) - f(a)); b = b - f(b) / df(b); } else { a = a - f(a) / df(a); b = a - f(a) * (b - a) / (f(b) - f(a)); } Console.WriteLine("№" + i + " Наближене значення: (a) " + a); Console.WriteLine("№" + i + " Наближене значення: (b) " + b); i++; }while (!Auxiliary.simplifiedStopCriteria(a, b, f, eps)); return((a + b) / 2); }
public static double getRoot(MyFunction func) { double a = func.getA(); double b = func.getB(); double eps = func.getEps(); Func <double, double> f = func.getF(); Func <double, double> df = Derivative.get(f); double c = 0; int i = 1; Console.WriteLine("Початковий проміжок [ " + a + " ; " + b + " ]."); if (!Auxiliary.isMonotonous(f, a, b)) { throw new System.InvalidOperationException("Функція не строго монотонна на цьому проміжку. Виберіть інший проміжок."); } else if (!Auxiliary.isRootOnRange(a, b, f)) { throw new System.InvalidOperationException("Функція не має коренів на цьому проміжку. Виберіть інший проміжок."); } do { c = a - (f(a) * (b - a)) / (f(b) - f(a)); if (Math.Abs(f(c)) < eps) { return(c); } else if (f(c) * f(a) < 0) { b = c; } else if (f(c) * f(b) < 0) { a = c; } Console.WriteLine("№" + i + " Наближене значення: " + c); i++; }while (!Auxiliary.simplifiedStopCriteria(a, b, f, eps)); return((a + b) / 2); }