Контрольная работа по "Математике"
Автор: vikt5 • Май 22, 2018 • Контрольная работа • 7,690 Слов (31 Страниц) • 431 Просмотры
Задание 1
Найти точку минимума функции методами дихотомии, золотого сечения, Фибоначчи. Сравнить скорости сходимости методов.
Вариант 8 – f(x) = ex−x3 +4
Метод дихотомии
Данный метод применяется для нахождения значений действительно-значной функции, определяемых по какому-либо критерию (это может быть сравнение на минимум, максимум или конкретное число).
Разобьём заданный отрезок пополам и возьмём две симметричные относительно центра точки x1 и x2 так, что:
[pic 1]
где δ — некоторое число в интервале (0, (b-a)/2)
Вычислим два значения функции f(x) в двух новых точках. Сравнением определим в какой из двух новых точек значение функции f(x) максимально. Отбросим тот из концов изначального отрезка, к которому точка с максимальным значением функции оказалась ближе, то есть:
- Если f(x1) > f(x2)то берётся отрезок (x1,b), а отрезок (a,x1) отбрасывается.
- Иначе берётся зеркальный относительно середины отрезок (a,x2), а отбрасывается (x2,b).
Процедура повторяется, пока не будет достигнута заданная точность.
Код программы:
public class Opr {
int count = 0;
//функция для минимизации
static double f(double x) {
double a1=Math.exp(1);
double a2=x;
return Math.pow(a1,a2) - x * x * x + 4;
}
double dich(double a, double b, double delta, double eps) {
double x1, x2;
if ((b - a) > eps) {
x1 = a + (b - a) / 2 - delta;
x2 = a + (b - a) / 2 + delta;
if (f(x1) > f(x2)) {
count++;
return dich(x1, b, delta / 2, eps);
} else {
count++;
return dich(a, x2, delta / 2, eps);
}
} else {
count++;
return a;
}
}
public static void main(String[] args) {
Opr d = new Opr();
double x = d.dich(0, 20, 0.05, 0.0001);
System.out.println("Iterations= " + d.count + " x = " + x + " f(x) = " + f(x));
}
[pic 2]
Рисунок 1 – Результат выполнения метода дихотомии
Метод золотого сечения
Золотое сечение — это деление какой-либо величины в отношении 62% и 38%; деление отрезка АВ точкой С на две части (меньший отрезок АС и больший отрезок ВС), чтобы для длин отрезков было верно AC/BC = BC/AВ.
Для того, чтобы найти неопределённое значение этой функции на заданном отрезке, отвечающее критерию поиска, рассматриваемый отрезок делится в пропорции золотого сечения в обоих направлениях, то есть выбираются две точки x1 и x2 такие, что:
[pic 3]
То есть точка x1 делит отрезок (a,x2) в отношении золотого сечения. Аналогично x2 делит отрезок (x1,b) в той же пропорции.
Далее рассчитывают значения целевой функции в этих точках f(x1) и f(x2).
- Если f(x1) > f(x2), то a = x1;
- Иначе b = x2.
Если |b – a| < ε(точность), то x = (a+b)/2 и остановка поиска, иначе возвращаемся к рассчитыванию точек деления x1 и x2.
Код программы:
public class crossSection {
final static double PHI = (1 + Math.sqrt(5)) / 2;
int count;
//функция для минимизации
static double f(double x) {
double a1=Math.exp(1);
double a2=x;
return Math.pow(a1,a2) - x * x * x + 4;
}
double gold(double a, double b, double x, double y, double n, double eps) {
double x1, x2, f1, f2;
if ((b - a) > eps) {
if (n == 1) {
x1 = 2 * (a + (b - a) / 2) - x;
x2 = x;
f1 = f(x1);
f2 = y;
} else {
...