Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_1_2_3 Разработка программ со структурой вложе...doc
Скачиваний:
4
Добавлен:
23.11.2019
Размер:
335.36 Кб
Скачать
  1. until (Y<Ymax)or(X>=B);

  2. Xn:= Xmax-H; //определение левого конца нового интервала вы-

  3. // Числения максимума

  4. if Xn<A then Xn:=A; //проверка, чтобы не выйти за пределы ин-

  5. // Тервала

Если известны аналитические выражения для первой и второй производных, то можно найти значение аргумента, при котором первая производная обращается в ноль (решить уравнение, например, методом деления отрезка пополам) и определить знак второй производной в найденной точке. Знак второй производной позволит определить вид экстремума (максимум или минимум) или его отсутствие на заданном интервале. В случае отсутствия экстремума следует сделать запрос о нахождении наибольшего или наименьшего значения функции.

Пример программы вычисления наибольшего (наименьшего) значения функции приведен ниже. В программе реализованы три рассмотренных подхода к определению максимального (мингимального) значения функции на заданном интервале.

  1. program extremum;

  2. {Вычисление наибольшего(наименьшего) значения функции

  3. y=2x3 +10x2 +6x-20 в интервале [a,b] с заданной точностью eps

  4. с начальным шагом изменения аргумента h}

  5. {первая производная функции y’=6x2 +20x+6,

  6. вторая производная y’’=12x+20}

  7. {$APPTYPE CONSOLE}

  8. uses

  9. SysUtils;

  10. var

  11. X,A,B,Aa,Bb,H,Y,Ymax,Ya,Yb,Ysr,Eps,Xmax,Dx,Xn,Xsr:Real;

  12. I,N1,N2,K,Mon:Integer;

  13. begin

  14. WriteLn('Введите a,b,eps,h');

  15. ReadLn(A,B,Eps,H);

  16. Mon:=0; //признак монотонности

  17. //определение точки на заданном интервале, в которой первая

  18. //производная функции обращается в ноль (уточнение корня

  19. //уравнения методом деления отрезка пополам)

  20. Ya:= 6*A*A+20*A+6;

  21. if Ya=0 then

  22. Xmax:=A

  23. else

  24. begin

  25. Yb:=6*B*B+20*B+6;

  26. if Yb=0 then

  27. Xmax:=B

  28. else if Ya*Yb>0 then

  29. begin

  30. WriteLn ('Функция на заданном интервале изменяется’

  31. +' монотонно');

  32. WriteLn ('Для нахождения максимума введите 1,'

  33. +' для минимума - -1');

  34. ReadLn(K);

  35. Mon:=1;

  36. end

  37. else

  38. begin

  39. Aa:=A;

  40. Bb:=B;

  41. Xsr:=(Aa+Bb)/2;

  42. Ysr:= 6*Xsr*Xsr+20*Xsr+6;

  43. while (Abs(Bb-Aa)>Eps)and(Ysr*Ya<>0) do

  44. begin

  45. if Ya*Ysr>0 then Aa:=Xsr else Bb:=Xsr;

  46. Xsr:=(Aa+Bb)/2;

  47. Ysr:= 6*Xsr*Xsr+20*Xsr+6;

  48. end;

  49. Xmax:=Xsr;

  50. end;

  51. end;

  52. //определение знака второй производной в критической точке

  53. //с целью определения вида экстремума

  54. //(вторая производная отрицательна – максимум,

  55. //вторая производная положительна – минимум)

  56. if Mon=0 then

  57. begin

  58. if 12*Xmax+20<0 then

  59. K:=1

  60. else

  61. K:=-1;//поиск минимума сводится к поиску максимума

  62. //функции –f(x)

  63. //вычисление значения функции в критической точке

  64. Ymax:=((2*Xmax+10)*Xmax+6)*Xmax-20;

  65. WriteLn('ymax=',ymax:10:5,' xmax=',xmax:10:5);

  66. ReadLn;

  67. end;

  68. //поиск максимума функции с использованием табулирования

  69. //значений функции при шаге изменения аргумента, равном

  70. //требуемой точности

  71. N1:=Trunc((B-A)/Eps)+1;

  72. //установка начального значения для максимума

  73. Ymax:=((2*A+10)*A+6)*A-20;

  74. Xmax:=A;

  75. Dx:=Eps;

  76. for I:=1 to N1-1 do

  77. begin

  78. X:=A+I*Dx;

  79. Y:= K*(((2*X+10)*X+6)*X-20);

  80. if Y>Ymax then

  81. begin

  82. Ymax:=Y;

  83. Xmax:=X;

  84. end;

  85. end;

  86. WriteLn ('ymax=',Ymax:10:5,' xmax=',Xmax:10:5,' n=',N1);

  87. ReadLn;

  88. //вычисление максимума функции с использованием итерационного

  89. //(вложенного) цикла

  90. N2:=0; //количество вычислений значения функции

  91. Xn:=A;

  92. //установка начального значения для максимума

  93. Ymax:=((2*A+10)*A+6)*A-20;

  94. Xmax:=A;

  95. while H>Eps do

  96. begin

  97. I:=0;

  98. //цикл определения максимума функции

  99. //на очередном интервале изменения аргумента

  100. repeat

  101. I:=I+1;

  102. X:=Xn+(I-1)*H; //вычисление текущего значения аргумента

  103. //вычисление значения функции в очередной точке

  104. Y:=K*(((2*X+10)*X+6)*X-20);

  105. N2:=N2+1;

  106. if Y>Ymax then

  107. //определение нового максимума и соответствующего

  108. //значения аргумента

  109. begin

  110. Ymax:=Y;

  111. Xmax:=X;

  112. end;

  113. until (Y<Ymax)or(X>=B);

  114. Xn:= Xmax-H; //определение левого конца нового интервала

  115. //вычисления максимума

  116. //проверка, чтобы не выйти за пределы интервала

  117. if Xn<A then

  118. Xn:=A;

  119. H:=H/2; //уменьшение шага изменения аргумента в два раза

  120. end;

  121. WriteLn('ymax=',Ymax:10:5,' xmax=',Xmax:10:5,' n=',N2);

  122. ReadLn;

  123. end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]