private double GoldenSection(out string log, double leftBorder, double rightBorder, double accuracy) { log = "Метод золотого сечения:\r\n\r\n" + "Входные данные:\r\n" + " Левая граница a = " + leftBorder + "\r\n" + " Правая граница b = " + rightBorder + "\r\n" + " Точность eps = " + accuracy + "\r\n\r\n" + "Итерации:\r\n\r\n"; double tau = (-1 + Math.Sqrt(5)) / 2.0; double x1 = leftBorder + (rightBorder - leftBorder) * tau; double x2 = rightBorder - (rightBorder - leftBorder) * tau; double xm = (leftBorder + rightBorder) / 2; double y1 = FunctionClass.Function1(x1); double y2 = FunctionClass.Function1(x2); double ym = FunctionClass.Function1(xm); log += "a = " + leftBorder + " " + "b = " + rightBorder + " " + "xm = " + xm + " " + "x1 = " + x1 + " " + "x2 = " + x2 + "\r\n"; log += "F(a) = " + FunctionClass.Function1(leftBorder) + " " + "F(b) = " + FunctionClass.Function1(rightBorder) + " " + "F(xm) = " + ym + " " + "F(x1) = " + y1 + " " + "F(x2) = " + y2 + "\r\n\r\n"; int i = 0; while (Math.Abs(rightBorder - leftBorder) > accuracy) { i++; if ((y1 < y2)) { log += "# " + i + " y1 < y2\r\n"; leftBorder = x2; x2 = x1; x1 = leftBorder + (rightBorder - leftBorder) * tau; log += "x1 = " + x1 + "\r\n"; log += "x2 = " + x2 + "\r\n"; } else if ((y1 > y2)) { log += "# " + i + " y1 > y2\r\n"; rightBorder = x1; x1 = x2; x2 = rightBorder - (rightBorder - leftBorder) * tau; log += "x1 = " + x1 + "\r\n"; log += "x2 = " + x2 + "\r\n"; } y1 = FunctionClass.Function1(x1); y2 = FunctionClass.Function1(x2); xm = (leftBorder + rightBorder) / 2; ym = FunctionClass.Function1(xm); log += "# " + i + " " + xm + "\r\n\r\n"; } return(xm); }
private double Bisection(out string log, double leftBorder, double rightBorder, double accuracy) { log = "Метод половинного деления:\r\n\r\n" + "Входные данные:\r\n" + " Левая граница a = " + leftBorder + "\r\n" + " Правая граница b = " + rightBorder + "\r\n" + " Точность eps = " + accuracy + "\r\n\r\n" + "Итерации:\r\n\r\n"; double x1 = leftBorder + (rightBorder - leftBorder) / 4; double xm = (leftBorder + rightBorder) / 2; double x2 = rightBorder - (rightBorder - leftBorder) / 4; double y1 = FunctionClass.Function1(x1); double ym = FunctionClass.Function1(xm); double y2 = FunctionClass.Function1(x2); log += "a = " + leftBorder + " " + "b = " + rightBorder + " " + "xm = " + xm + " " + "x1 = " + x1 + " " + "x2 = " + x2 + "\r\n"; log += "F(a) = " + FunctionClass.Function1(leftBorder) + " " + "F(b) = " + FunctionClass.Function1(rightBorder) + " " + "F(xm) = " + ym + " " + "F(x1) = " + y1 + " " + "F(x2) = " + y2 + "\r\n\r\n"; int i = 0; while (Math.Abs(rightBorder - leftBorder) > accuracy) { i++; if ((y1 > ym) && (ym < y2)) { log += "# " + i + " y1 > ym && ym < y2\r\n"; leftBorder = x1; rightBorder = x2; log += "a = " + leftBorder + " " + "b = " + rightBorder + "\r\n"; x1 = leftBorder + (rightBorder - leftBorder) / 4; x2 = rightBorder - (rightBorder - leftBorder) / 4; log += "x1 = " + x1 + " " + "x2 = " + x2 + "\r\n"; } else if ((y1 > ym) && (ym > y2)) { log += "# " + i + " y1 > ym && ym > y2\r\n"; leftBorder = xm; log += "a = " + leftBorder + "\r\n"; x1 = leftBorder + (rightBorder - leftBorder) / 4; x2 = rightBorder - (rightBorder - leftBorder) / 4; xm = (leftBorder + rightBorder) / 2; log += "x1 = " + x1 + " " + "xm = " + xm + " " + "x2 = " + x2 + "\r\n"; ym = FunctionClass.Function1(xm); } else if ((y1 < ym) && (ym < y2)) { log += "# " + i + " y1 < ym && ym < y2\r\n"; rightBorder = xm; log += "b = " + rightBorder + "\r\n"; x1 = leftBorder + (rightBorder - leftBorder) / 4; x2 = rightBorder - (rightBorder - leftBorder) / 4; xm = (leftBorder + rightBorder) / 2; log += "x1 = " + x1 + " " + "xm = " + xm + " " + "x2 = " + x2 + "\r\n"; ym = FunctionClass.Function1(xm); } y1 = FunctionClass.Function1(x1); y2 = FunctionClass.Function1(x2); log += "y1 = " + y1 + " " + "ym = " + ym + " " + "y2 = " + y2 + "\r\n"; log += "xm = " + xm + "\r\n\r\n"; } return(xm); }