Нахождение минимума функции методом парабол.



Алгоритм программы.

Код программы.

Скачать программу в архиве.

Описание программы.
Поскольку функция может вести себя в окрестности точки по-разному, возникает трудность с выбором значения h достаточно малым, таким, чтобы знаки первой и второй производной функции сохранялись в этой окрестности. Во время работы программы знаменатель формулы

может обращаться в нуль, в результате чего произойдёт ошибка с кодом «деление на нуль».
Для предотвращения этой ошибки надо начать вычисления с точки, в которой вторая производная положительна, и итерационный процесс производить по равносильной формуле

По формуле Тейлора приближаем функцию параболой

Если

то эта парабола имеет вогнутость вниз и достигает своего минимума в точке

что доказывает равносильность формул

Напишем функцию вычисления первой производной, функцию вычисления второй производной, которые будем использовать при нахождении минимума функции.

При вычислении первой производной в точке x будем уменьшать значение h в формуле

до тех пор, пока либо значение этого выражения при h и h/2 не станут равными друг другу, либо отношение h/x не станет меньше 0.0000000001, так как при h< 0.0000000001*x будут резко возрастать погрешности машинной арифметики. (1+0.0000000000000001=1)

При вычислении второй производной в точке x будем уменьшать значение h в формуле

до тех пор, пока либо значение этого выражения при h и h/2 не станут равными друг другу, либо отношение h*h/x не станет меньше 0.0000000001.

При вычислении минимума функции

сначала вычислим значение второй производной в заданной точке x. Если условие

не выполнено, то график функции не имеет в заданной точки выпуклости вниз, то есть не может быть приближен параболой, ветви которой направлены вверх. Поэтому мы будем двигаться вправо с шагом 1 до тех пор, пока вторая производная не станет положительной, и выпуклость вниз не будет достигнута. После этого начинается рекурсивный алгоритм нахождения функции по формуле


Алгоритм завершит работу, либо когда разность между соседними точками x[k+1] и x[k] станет меньше по абсолютной величине заданной погрешности dx, либо когда значения функции в точках [k+1] и x[k] станут равны друг другу.
На время тестирования программы для выявления исключительных случаев длительной работы программы целесообразно также ограничить цикл 1000 шагами.


Программа также выводит значение x[k], значения первой и второй производной в каждой точке x[k], приращение функции f(x[k+1])-f(x[k]).
В конце работы алгоритма выводится значение минимума функции.
Шесть чисел x, a, b, c, d, e являются формальными параметрами как самой функции, так и функций вычисления первой и второй производной функции.





X[0]=1
X[0]=1
X[1]=1,625
f(X[0])=-7
f(X[1])=-8,263427734375
Вторая производная в точке X[0] = 16
Первая производная в точке X[0] = -10
Приращение функции в точке X[0] = -1,263427734375

X[1]=1,625
X[2]=1,4294274300932
f(X[1])=-8,263427734375
f(X[2])=-9,23067595172717
Вторая производная в точке X[1] = 46,9375
Первая производная в точке X[1] = 9,1796875
Приращение функции в точке X[1] = -0,96724821735217

X[2]=1,4294274300932
X[3]=1,40018058532794
f(X[2])=-9,23067595172717
f(X[3])=-9,24639654445609
Вторая производная в точке X[2] = 36,2488479614257
Первая производная в точке X[2] = 1,06016442924737
Приращение функции в точке X[2] = -0,01572059272891

X[3]=1,40018058532794
X[4]=1,39953931490417
f(X[3])=-9,24639654445609
f(X[4])=-9,24640368747637
Вторая производная в точке X[3] = 34,7293701171875
Первая производная в точке X[3] = 0,02227091789245
Приращение функции в точке X[3] = -7,14302028193004E-6

X[4]=1,39953931490417
X[5]=1,39953901260854
f(X[4])=-9,24640368747637
f(X[5])=-9,24640368747795
Вторая производная в точке X[4] = 34,6963500976562
Первая производная в точке X[4] = 0,00001048855483
Приращение функции в точке X[4] = -1,58273394390562E-12

X[5]=1,39953901260854
X[6]=1,39953901260854
f(X[5])=-9,24640368747795
f(X[6])=-9,24640368747795
Вторая производная в точке X[5] = 34,6962127685546
Первая производная в точке X[5] = 0
Приращение функции в точке X[5] = 0


X[0]=-4
X[0]=-4
X[1]=-3,38679245283018
f(X[0])=-7
f(X[1])=-29,7853974063811
Вторая производная в точке X[0] = 106
Первая производная в точке X[0] = -65
Приращение функции в точке X[0] = -22,7853974063811

X[1]=-3,38679245283018
X[2]=-3,16754918597949
f(X[1])=-29,7853974063811
f(X[2])=-31,4007203761561
Вторая производная в точке X[1] = 62,6819458007812
Первая производная в точке X[1] = -13,7425945699214
Приращение функции в точке X[1] = -1,61532296977502

X[2]=-3,16754918597949
X[3]=-3,1376056494904
f(X[2])=-31,4007203761561
f(X[3])=-31,4231185987762
Вторая производная в точке X[2] = 49,3844604492187
Первая производная в точке X[2] = -1,47874539345502
Приращение функции в точке X[2] = -0,02239822262007

X[3]=-3,1376056494904
X[4]=-3,13706215271951
f(X[3])=-31,4231185987762
f(X[4])=-31,4231256391025
Вторая производная в точке X[3] = 47,6578979492187
Первая производная в точке X[3] = -0,02590191364288
Приращение функции в точке X[3] = -7,04032633791485E-6

X[4]=-3,13706215271951
X[5]=-3,13706197547665
f(X[4])=-31,4231256391025
f(X[5])=-31,4231256391033
Вторая производная в точке X[4] = 47,6267852783203
Первая производная в точке X[4] = -8,4415078163147E-6
Приращение функции в точке X[4] = -7,67386154620908E-13

X[5]=-3,13706197547665
X[6]=-3,13706197555487
f(X[5])=-31,4231256391033
f(X[6])=-31,4231256391033
Вторая производная в точке X[5] = 47,6267700195312
Первая производная в точке X[5] = 3,72529029846191E-9
Приращение функции в точке X[5] = 0


X[0]=0
Введённое начальное значение X[0] не соответствует вогнутости вниз
Вторая производная в точке X[0] не является положительной  = -14
X[0]=1
X[1]=1,625
f(X[0])=-7
f(X[1])=-8,263427734375
Вторая производная в точке X[0] = 16
Первая производная в точке X[0] = -10
Приращение функции в точке X[0] = -1,263427734375

X[1]=1,625
X[2]=1,4294274300932
f(X[1])=-8,263427734375
f(X[2])=-9,23067595172717
Вторая производная в точке X[1] = 46,9375
Первая производная в точке X[1] = 9,1796875
Приращение функции в точке X[1] = -0,96724821735217

X[2]=1,4294274300932
X[3]=1,40018058532794
f(X[2])=-9,23067595172717
f(X[3])=-9,24639654445609
Вторая производная в точке X[2] = 36,2488479614257
Первая производная в точке X[2] = 1,06016442924737
Приращение функции в точке X[2] = -0,01572059272891

X[3]=1,40018058532794
X[4]=1,39953931490417
f(X[3])=-9,24639654445609
f(X[4])=-9,24640368747637
Вторая производная в точке X[3] = 34,7293701171875
Первая производная в точке X[3] = 0,02227091789245
Приращение функции в точке X[3] = -7,14302028193004E-6

X[4]=1,39953931490417
X[5]=1,39953901260854
f(X[4])=-9,24640368747637
f(X[5])=-9,24640368747795
Вторая производная в точке X[4] = 34,6963500976562
Первая производная в точке X[4] = 0,00001048855483
Приращение функции в точке X[4] = -1,58273394390562E-12

X[5]=1,39953901260854
X[6]=1,39953901260854
f(X[5])=-9,24640368747795
f(X[6])=-9,24640368747795
Вторая производная в точке X[5] = 34,6962127685546
Первая производная в точке X[5] = 0
Приращение функции в точке X[5] = 0




На главную страницу.