М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
lislibert
lislibert
17.09.2022 18:22 •  Информатика

Найти точку минимума целевой функции методом дихотомии f(x) = x3 - x,x' € [0,1], = 0,1

👇
Ответ:
bvoznyk69
bvoznyk69
17.09.2022

Идея такая: разбиваем отрезок [a, b] на два: [a, m] и [m, b], где m = (a + b)/2. Длина такого отрезка h = b - a. Cмотрим значения функции f в точках m - ε и m + ε. Если f(m - ε) < f(m + ε), то думаем, что функция возрастает в точке m, и разумно искать ответ на отрезке [a, m]; если f(m - ε) > f(m + ε), то оставляем отрезок [m, b]. Если нам ОЧЕНЬ не повезло, и f(m - ε) = f(m + ε), то оставим отрезок [m - h/4, m + h/4]. При этом в любом случае длина нового отрезка будет h/2. В качестве ε разумно взять желаемую точность, и останавливаться, если новая длина h/2 окажется меньше ε.

Очень маленький ε ставить не следует, при этом очень большую роль начинаю играть ошибки округления.

Точный ответ можно найти, посчитав производную. Должно получиться 1/\sqrt{3}

Реализация (python 3.7):

from math import sqrt

def find_min(function_to_minimize, left, right, tolerance=1e-6):

   assert left <= right

   # print(left, right) # если хотите проследить за тем, как меняются границы

   length = right - left

   if length <= tolerance:

       return left

   midpoint = (left + right) / 2

   y_left, y_right = function_to_minimize(midpoint - tolerance), function_to_minimize(midpoint + tolerance)

   if y_left < y_right:

       return find_min(function_to_minimize, left, midpoint, tolerance)

   elif y_left > y_right:

       return find_min(function_to_minimize, midpoint, right, tolerance)

   else:

       return find_min(function_to_minimize, midpoint - length / 4, midpoint + length / 4)

calculated = find_min(lambda x: x ** 3 - x, 0, 1)

exact = 1 / sqrt(3)

print(calculated)

print(calculated - exact)

Мне выводится ответ 0.5773496627807617

Разница между точным решением и найденным примерно 6\cdot10^{-7}

4,4(41 оценок)
Открыть все ответы
Ответ:
sas4ha
sas4ha
17.09.2022
Выполняя алгоритм, получаем следующий результат (15 итераций)

1. 0..65534 -> 32767
2. 0..32766 -> 16383
3. 0..16382 -> 8191
4. 0..8190  -> 4095
5. 0..4094  -> 2047
6. 2048..4094 -> 3071
7. 2048..3070 -> 2559
8. 2560..3070 -> 2815
9. 2816..3070 -> 2943
10. 2944..3070 -> 3007
11. 2944..3006 -> 2975
12. 2976..3006 -> 2991
13. 2992..3006 -> 2999
14. 3000..3006 -> 3003
15. 3000..3002 -> 3001

Если лень перебирать вручную, можно воспользоваться программой

var k,l,r,x,f:integer;
begin
f := 3001;
l := 0;
r := 65534;
x := (l + r) div 2;
k := 1;
while (x <> f) and (l < r) do
  begin
  writeln(k,' ',l,' ',r,' ',x);
  k := k + 1;
  if f < x then r := x - 1
    else l := x + 1;
  x := (l + r) div 2
  end;
writeln(k,' ',l,' ',r,' ',x);
end.
4,7(61 оценок)
Ответ:

program Number_of_mounth;

var month:byte;

begin

write('Введите номер месяца:');

readln(month);

if(month<1)or(month>12)then

writeln('Вы ввели неправильный номер месяца!')

else

begin

write('Название месяца:');

case month of

1:writeln('Январь');

2:writeln('Февраль');

3:writeln('Март');

4:writeln('Апрель');

5:writeln('Май');

6:writeln('Июнь');

7:writeln('Июль');

8:writeln('Август');

9:writeln('Сентябрь');

10:writeln('Октябрь');

11:writeln('Ноябрь');

12:writeln('Декабрь');

end;

write('Количество дней в месяце:');

case month of

1,3,5,7,8,10,12:writeln('31');

4,6,9,11:writeln('30');

2:writeln('28 или 29');

end;

write('Времягода:');

case month of

1,2,12:writeln('Зима');

3,4,5:writeln('Весна');

6,7,8:writeln('Лето');

9,10,11:writeln('Осень');

end;

if not (month=1)then writeln('Это не первый месяц в году');

if not (month=12)then writeln('Это не последний месяц в году');

end;

Объяснение:

Ошибка была в объявлении переменой а именно в начале блока бегин к переменой month задавался тип byte, это делает до начала блока в Var

4,5(3 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ