def dihotomiaMethodGetTable(f, epsilon, a, b): data = { 'a': [], 'b': [], 'Отношение длин': [], 'x1': [], 'x2': [], 'f(x1)': [], 'f(x2)': [] } delta = epsilon / 4 x1 = (a + b) / 2 - delta x2 = (a + b) / 2 + delta f1 = f(x1) f2 = f(x2) prev_length = None u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) count = 0 while True: count += 1 prev_length = abs(b - a) if f1 < f2: b = x2 else: a = x1 x1 = (a + b) / 2 - delta x2 = (a + b) / 2 + delta f1 = f(x1) f2 = f(x2) u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) if abs(b - a) < epsilon: break return (count, pd.DataFrame(data))
def dihotomiaMethod(f, epsilon, a, b): delta = epsilon / 4 x1 = (a + b) / 2 - delta x2 = (a + b) / 2 + delta f1 = f(x1) f2 = f(x2) while True: if f1 < f2: b = x2 else: a = x1 x1 = (a + b) / 2 - delta x2 = (a + b) / 2 + delta f1 = f(x1) f2 = f(x2) if abs(b - a) < epsilon: break return (a + b) / 2
def fibonacciMethod(f, n, a, b): x1 = a + (b - a) * fibonacci(n - 2) / fibonacci(n) x2 = a + (b - a) * fibonacci(n - 1) / fibonacci(n) f1 = f(x1) f2 = f(x2) while True: n -= 1 if f1 > f2: a = x1 x1 = x2 x2 = b - (x1 - a) f1 = f2 f2 = f(x2) else: b = x2 x2 = x1 x1 = a + (b - x2) f2 = f1 f1 = f(x1) if n == 1: return (x1 + x2) / 2
def goldenRatioMethodGetTable(f, epsilon, a, b): data = { 'a': [], 'b': [], 'Отношение длин': [], 'x1': [], 'x2': [], 'f(x1)': [], 'f(x2)': [] } F = (1 + math.sqrt(5)) / 2 x1 = b - (b - a) / F x2 = a + (b - a) / F f1 = f(x1) f2 = f(x2) prev_length = None count = 0 u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) while True: count += 1 prev_length = abs(b - a) if f1 < f2: b = x2 x2 = x1 f2 = f1 x1 = b - (b - a) / F f1 = f(x1) else: a = x1 x1 = x2 f1 = f2 x2 = a + (b - a) / F f2 = f(x2) u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) if abs(b - a) < epsilon: break return (count, pd.DataFrame(data))
def goldenRatioMethod(f, epsilon, a, b): F = (1 + math.sqrt(5)) / 2 x1 = b - (b - a) / F x2 = a + (b - a) / F f1 = f(x1) f2 = f(x2) while True: if f1 < f2: b = x2 x2 = x1 f2 = f1 x1 = b - (b - a) / F f1 = f(x1) else: a = x1 x1 = x2 f1 = f2 x2 = a + (b - a) / F f2 = f(x2) if abs(b - a) < epsilon: break return 0.5 * (a + b)
def fibonacciMethodGetTable(f, n, a, b): data = { 'a': [], 'b': [], 'Отношение длин': [], 'x1': [], 'x2': [], 'f(x1)': [], 'f(x2)': [] } x1 = a + (b - a) * fibonacci(n - 2) / fibonacci(n) x2 = a + (b - a) * fibonacci(n - 1) / fibonacci(n) f1 = f(x1) f2 = f(x2) prev_length = None count = 0 u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) while True: count += 1 prev_length = abs(b - a) n -= 1 if f1 > f2: a = x1 x1 = x2 x2 = b - (x1 - a) f1 = f2 f2 = f(x2) else: b = x2 x2 = x1 x1 = a + (b - x2) f2 = f1 f1 = f(x1) u.writeRow(data, a, b, prev_length, x1, x2, f1, f2) if n == 1: break return (count, pd.DataFrame(data))
def brandtMethod(f, epsilon, a, c): K = (3 - math.sqrt(5)) / 2 x = (a + c) / 2 w = (a + c) / 2 v = (a + c) / 2 fx = f(x) fw = f(w) fv = f(v) d = e = c - a u = None count = 0 while True: count += 1 prev_u = u g = e e = d if x != w and x != v and w != v and fx != fw and fx != fv and fw != fv: #u = w - (((w - x) ** 2) * (fw - fv) - ((w - v) ** 2) * (fw - fx)) / 2 / ( # (w - x) * (w - v) - (w - v) * (w - x)) u = calculateX_hat(x, w, v, fx, fw, fv) if a + epsilon <= u and u <= c - epsilon and abs(u - x) < g / 2: d = abs(u - x) else: u = None if u is None: if x < (c + a) / 2: u = x + K * (c - x) d = c - x else: u = x - K * (x - a) d = x - a if abs(u - x) < epsilon: u = x + sign(u - x) * epsilon fu = f(u) if fu <= fx: if u >= x: a = x else: c = x v = w w = x x = u fv = fw fw = fx fx = fu else: if u >= x: c = u else: a = u if fu <= fw or w == x: v = w w = u fv = fw fw = fu elif fu <= fv or v == x or v == w: v = u fv = fu if count != 1: if abs(prev_u - u) < epsilon: break return (a + c) / 2