Реферат: Минимизация функций нескольких переменных. Метод спуска

Воронежскийинститут высоких технологий

Факультетзаочного и послевузовского обучения

Кафедра математики и информатики

Курсовая работа

По дисциплине: Методы оптимизации

На тему: Минимизация функций нескольких переменных. Метод спуска

Воронеж 2010


Введение

Методоптимизации как раздел математики существует достаточно давно. Оптимизация — это выбор, т.е. то, чем постоянно приходится заниматься в повседневной жизни.Термином «оптимизация» в литературе обозначают процесс илипоследовательность операций, позволяющих получить уточненное решение. Хотяконечной целью оптимизации является отыскание наилучшего или«оптимального» решения, обычно приходится довольствоваться улучшениемизвестных решений, а не доведением их до совершенства. Поэтому под оптимизациейпонимают скорее стремление к совершенству, которое, возможно, и не будетдостигнуто.

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

Возьмемпример: человек вышел утром из дому, чтобы ехать на работу. По ходу дела емуприходится принять целый ряд решений: брать ли с собой зонтик? В каком местеперейти улицу? Каким видом транспорта воспользоваться? И так далее. Разумеется,все эти решения человек принимает без специальных расчетов, просто опираясь наимеющийся у него опыт и на здравый смысл. Для обоснования таких решений никакаянаука не нужна, да вряд ли понадобится и в дальнейшем.

Однаковозьмем другой пример. Допусти, организуется работа городского транспорта. Внашем распоряжении имеется какое-то количество транспортных средств. Необходимопринять ряд решений, например: какое количество и каких транспортных средствнаправить по тому или другому маршруту? Как изменять частоту следования машин взависимости от времени суток? Где поместить остановки? И так далее.

Этирешения являются гораздо более ответственными, чем решения предыдущего примера.В силу сложности явления последствия каждого из них не столь ясны; для того, чтобыпредставить себе эти последствия, нужно провести расчеты. А главное, от этихрешений гораздо больше зависит. В первом примере неправильный выбор решениязатронет интересы одного человека; во втором — может отразиться на деловойжизни целого города.

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

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


Методы спуска

Общая схема

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

Решается задачаминимизации функции j(x) на всём пространстве En. Методыспуска состоят в следующей процедуре построения последовательности {xk}. Вкачестве начального приближения выбирается любая точка x0ÎEn.Последовательные приближения x1, x2, … строятся по следующей схеме:

1) в точке xk выбирают направление спуска — Sk;

2) находят (k+1)-е приближение по формулеxk+1=xk-hkSk.

Направление Sk выбираюттаким образом, чтобы обеспечить неравенство f(xk+1)<f(xk) по крайней мередля малых значений величины hk. На вопрос, какому из способов выборанаправления спуска следует отдать предпочтение при решении конкретной задачи,однозначного ответа нет.

Число hk определяетрасстояние от точки xk до точки хk+1. Это число называется длиной шага илипросто шагом. Основная задача при выборе величины hk — это обеспечить выполнениенеравенства j(xk+1)<j(xk).

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

xk+1=xk-hk cos/>


где — cos/>=/>

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

Наибольшеераспространение получили следующие алгоритмы:

1. />(без коррекции);

2. /> если />; /> если /> 

3. />, если /> ; />, если/>; />, если />,

где />–угол между градиентамина предыдущем и текущем шаге;

/>и/>– заданные пороговыезначения выбираются субъективно

(например, /> ).

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

Методпокоординатного спуска

Пусть нужно найтинаименьшее значение целевой функции u=f(M)=f(x,x,… ,xn).Здесь через М обозначена точка n-мерного пространства с координатами x,x,… ,xn:M=(x,x,… ,xn).Выберем какую-нибудь начальную точку М=(x,x,… ,xn0)и рассмотрим функцию f при фиксированных значениях всех переменных, кромепервой: f(x, x,x,… ,xn0). Тогда она превратится в функцию одной переменной x. Изменяя эту переменную, будем двигаться от начальной точки x=xв сторону убывания функции, пока не дойдем до ее минимума при x=x,после которого она начинает возрастать. Точку с координатами ( x,x,x,… ,xn0)обозначим через М,при этом f(M0) f(M).

Фиксируем теперьпеременные: x=x,x=x,… ,xn=xn0и рассмотрим функцию f как функцию одной переменной x:f(x,x,x… ,xn0).Изменяя x, будем опятьдвигаться от начального значения x2=x20в сторону убывания функции, пока не дойдем до минимума при x2=x21.Точку с координатами {x,x,x… xn0}обозначим через М, при этом f(M1)f(M).

Проведем такую жеминимизацию целевой функции по переменным x,x,… ,xn.Дойдя до переменной xn,снова вернемся к x и продолжимпроцесс. Эта процедура вполне оправдывает название метода. С ее помощью мыпостроим последовательность точек МММ..., которой соответствует монотонная последовательность значений функции f(M0)f(M)f(M)Обрываяее на некотором шаге k можно приближенно принять значение функции f(Mk) за еенаименьшее значение в рассматриваемой области.

Проведем такую жеминимизацию целевой функции по переменным x,x,… ,xn.Дойдя до переменной xn,снова вернемся к x и продолжимпроцесс. Эта процедура вполне оправдывает название метода. С ее помощью мыпостроим последовательность точек М, М, М,..., которой соответствует монотонная последовательность значений функции

f(M0)f(M)f(M)Обрываяее на некотором шаге k можно приближенно принять значение функции f(Mk) за еенаименьшее значение в рассматриваемой области. Отметим, что данный методсводит задачу поиска наименьшего значения функции нескольких переменных кмногократному решению одномерных задач оптимизации. Если целевая функция f(x,x,… ,xn)заданаявной формулой и является дифференцируемой, то мы можем вычислить ее частныепроизводные и использовать их для определения направления убывания функции покаждой переменной и поиска соответствующих одномерных минимумов. В противномслучае, когда явной формулы для целевой функции нет, одномерные задачи следуетрешать с помощью одномерных методов

На рис.изображены линииуровня некоторой функции двух переменных u= f (х, у). Вдоль этих линий функциясохраняет постоянные значения, равные 1, 3, 5, 7, 9. Показана траектория поискаее наименьшего значения, которое достигается в точке О, с помощью методапокоординатного спуска. При этом нужно ясно понимать, что рисунок служит толькодля иллюстрации метода.

Пусть требуется решитьзадачу (2):

f(x) /> min, х Rn. (2)

В двумерномпространстве R2. Решение задачи (2) методомпокоординатного спуска, иначе называемого методом Гаусса — Зейделя, производятпо следующей общей схеме.

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

(3):x(k+1)=x(k)+t(k)S(k)(k=0,1,2, ...),

где вектор направленияспуска s(k)-это единичный вектор, совпадающий с каким-либо координатным направлением(например, если S(k) параллелен х1,то S(k)={1,0,0,...,0}, если он параллелен x2,то S(k)={0,1, 0,… ,0} и т.д.); величина t(k)является решением задачи одномерной минимизации: f(x(k)+ts(k))/> min, t R1,(k=0,1,2, ...), и может определяться, в частности, методом сканирования.Детальная реализация общей схемы в двумерном случае R2даеттраекторийприближения к точке х* методом покоординатного спуска, состоящую из звеньевломаной, соединяющих точки х(k), x1(k)x(k+1)(k=0, 1, 2,). При k=0, исходя из начальной точких(0)=(x1(0),x2(0)),находят точку х(0)= (x1(0),x2(0)),минимума функции одной переменной f(x1,x2(0));при этом f(x(0))f(x(0)).Затемнаходят точку минимума x(1) функции f (x1(0),x2)по второй координате. Далее делают следующийшаг вычислений при k=1. Полагают, что исходной точкой расчета является х(1).Фиксируявторуюкоординату точки х(1), находят точку минимумах(1)=(x1(1),x2(1)),функции f(x1,x2(1))одной переменной x(1); приэтомf(x(1))f(x(1))f(x(0)).Точку х(2)получают, минимизируя целевую функцию f(x1(1),x2),вновь по коорданате х2, фиксируя координату x1(1), точкиx(1),и т.д.Условиемпрекращения вычислительной процедуры при достижениизаданнойточности  может служить неравенство x(k+1)- x(k) <

Блок-схема поискаминимума функции двух переменных методом покоординатного спуска.

дискретныйоптимизация спуск функция

/>


Методградиентного спуска 

Рассмотрим функцию f,считая для определенности, что она зависит от трех переменных x,y,z. Вычислимее частные производные дf/дх, дf/ду, дf/дz и образуем с их помощью вектор,который называют градиентом функции:

gradf(x,у, z) = дf(х,у,z) /дх*i+дf(x, у, z)/ду*j+дf(x,y,z)/дг*k.

Здесь i, j, k — единичные векторы, параллельные координатным осям. Частные производныехарактеризуют изменение функции f по каждой независимой переменной вотдельности. Образованный с их помощью вектор градиента дает общеепредставление о поведении функции в окрестности точки (х, у,z). Направлениеэтого вектора является направлением наиболее быстрого возрастания функции вданной точке. Противоположное ему направление, которое часто называют антиградиентным,представляет собой направление наиболее быстрого убывания функции. Модульградиента grad (х, у,z)дf/дх(х, у,z))2 +(дf/ду( x, у, z))2+(дf/дг(x, y,z))2. определяет скоростьвозрастания и убывания функции в направлении градиента и антиградиента. Длявсех остальных направлений скорость изменения функции в точке (х, у, z) меньшемодуля градиента. При переходе от одной точки к другой как направлениеградиента, так и его модуль, вообще говоря, меняются. Понятие градиентаестественным образом переносится на функции любого числа переменных.

Перейдем к описаниюметода градиентного спуска. Основная его идея состоит в том, чтобы двигаться кминимуму в направлении наиболее быстрого убывания функции, которое определяетсяантиградиентом. Эта идея реализуется следующим образом.

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

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

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

f(x1,...,xi+gi, ..., xn)- f(x1,..., xi,..., xn)

f(x1,...,xi+gi, ..., xn)- f(x1,..., xi-gi,..., xn)

будет допущена большаяошибка.

Первый алгоритм требуетменьших затрат по сравнению со вторым (обычно затраты выражаются количествомвычислений критерия оптимальности), но позволяет получить решение менее точно,чем второй, эта погрешность зависит от величины пробного шага

Методнаискорейшего спуска

Суть методанаискорейшего спуска состоит в следующем. Как и прежде, в начальной точкеопределяется антиградиент минимизируемой функции. Однако теперь в направленииантиградиента делается ни один шаг, а движутся в данном направлении до тех пор,пока целевая функция убывает, достигает в некоторой точке минимума. В этойточке опять определяют антиградиент и ищут новую точку минимума целевой функциии так далее. В данном методе спуск имеет более целеустремлённый характер,производится более крупными шагами и градиент функции вычисляется в меньшемчисле точек.

Описание программы:

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

В программе реализованодин из методов спуска – Градиентный метод спуска с выбором шага. Начальный шагзадается.

Изменение шагаосуществляется по схеме

/> если />; /> если />

Вычисление градиентапроисходит по методу с парными пробами, это улучшает поиск за счёт болееточного вычисления градиента.

Метод наискорейшегоспуска по сравнению с обычным градиентным методом дает некоторое ускорение,метод хорошо «работает» при минимизации гладких функций и еслиначальное приближение выбрано достаточно далеко от оптимума. Если же очереднаяточка окажется в окрестности оптимума, то уменьшение целевой функции будеточень медленным. Это происходит из-за того, что для получения оптимума свысокой точностью необходимо выполнить большое число мелких шагов.

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

В связи с этим впрограмме был реализован более точный метод градиентного спуска.

В качестве условияокончания поиска задаётся требуемая малость модуля градиента функции, т.е.должно выполнятся условие

/>

(В области оптимумаградиент равен 0, но достичь этого значения практически не возможно, поэтомузадаётся требуемая малость близкая к 0).

Так же в программеможно задавать номер итерации выхода из цикла,

Другими словами придостижении какого количества точек прерывать цикл, если он не прервется самраньше.

Исследование функции U=1*x1^3+2*x2^2-3*x1-4*x2 (изменением шага).

h=0,1; x1 =-0,5; x2=-1; x1нач=-2, x1кон=2, x2нач=-2, x2кон=2

№ x1 x2 R -0,5 -1 7,375 1 -0,2750 -0,1999 1,6842 2 0,0023 0,2800 -0,9701  3 0,3023 0,5680 -2,5059  4 0,5749  0,7408 -3,4002  5 0,7757 0,8445 -3,8120  6 0,8952 0,9067 -3,9508  7 0,9548 0,9440 -3,9877  8 0,9813 0,9664 -3,9967  9 0,9924 0,9798 -3,9990 10 0,9969 0,9879 -3,9997 11 0,9988 0,9927 -3,9999 12 0,9995 0,9956 -4,0000 13 0,9998 0,9974 -4,0000 14 1,0000 0,9984 -4,0000

h=0,2; x1 =-0,5; x2=-1; x1нач=-2, x1кон=2, x2нач=-2, x2кон=2

№ x1 x2 R -0,5 -1 7,375 1 0,0500 0,6000 -1,5301 2 0,5485 0,9200 -3,4676 3 0,9680 0,9840 -3,9964 4 1,0058 0,9968 -3,9999 5 0,9988 0,9994 -4,0000

h=0,3; x1 =-0,5; x2=-1; x1нач=-2, x1кон=2, x2нач=-2, x2кон=2

№ x1 x2 R  0 -0,5 -1 7,375 1 0,1750 1,4 -2,1996  2 1,0473 0,9200 -3,9804  3 0,9600 1,016 -3,9948  4 1,0305 0,9968 -3,9972  5 0,9747 0,0006 -3,9981  6 1,0196 0,9999 -3,9988  7 0,9839 1,0000 -3,9992  8 1,0126 1,0000 -3,9995  9 0,9898 1,0000 -3,9997 10 1,0081 1,0000 -39998 11 0,9935 1,0000 -3,9999 12 1,0052 1,0000 -3,9999 13 0,9958 1.0000 -3,9999 14 1,0033 1,0000 -4,0000 15 0,9973 1,0000 -4,0000 16 1,0021 1,0000 -4,0000 17 0,9983 1,0000 -4,0000 18 1,0013 1,0000 -4,0000

h=1; x1 =-0,5; x2=-1;x1нач=-2, x1кон=2, x2нач=-2, x2кон=2

№ x1 x2 R -0,5 -1 7,375 1 0,6250 3 4,3692 2 1,5391 -1,0000 5,0283 3 0,5125 1 -3,4029 4 1,0655 1 -3,9869 5 0,9640 1 -3,9961 6 1,0170 1 -3,9991 7 0,9913 1,0000 -3,9998 8 1,0043 1 -3,9999 9 0,9978 1 -4,0000 10 1,0011 1 -4,0000
Заключение

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

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


Список используемойлитературы

1.  Корнеенко В. П. Методыоптимизации: Учебник / В. П. Корнеенко. – М.: Высш. шк., 2007.

2. Пантелеев А. В. Методыоптимизации в примерах и задачах: Учеб. пособие /А. В. Пантелеев, Т. А. Летова. – М.: Высш. шк., 2005.

3.  Батищев Д. И. Оптимизацияв САПР: Учебник / Д. И. Батищев, Я. Е. Львович,В. Н. Фролов. – Воронеж: Изд-во ВГУ, 1997.

4.  БандиБ. Методы оптимизации. Вводный курс / Б. Банди. – М.: Радио исвязь, 1988.

5.  Реклейтис Г. Оптимизацияв технике: в 2 кн. / Г. Реклейтис, А. Рейвиндран. –М.: Мир, 1986.


Приложение

 

Листингпрограммы:

#include <vcl.h>

#pragmahdrstop

#include«Math.hpp»

#include«math.h»

#include«Unit1.h»

//---------------------------------------------------------------------------

#pragmapackage(smart_init)

#pragmaresource "*.dfm"

TForm1*Form1;

//---------------------------------------------------------------------------

__fastcallTForm1::TForm1(TComponent* Owner)

:TForm(Owner)

{

}

//---------------------------------------------------------------------------

intii=0,n=0,s=0;

AnsiStringFormula[3]={«U=A*x1^3+B*x2^2-C*x1-D*x2»,«U=x1^2+x1*x2+x2^2»,«U=X1^2+X2^2»};

intKolPer[3]={2,2,2};// массив в котором хранится кол-во перемен. для каждой ф-ии

boolDD=true,Diapozon=true; // если true то точка входит в диапозон иначе нет

doublePeremenN[5]={0};//double *PeremenN =new double[n]; //нул.приб

doubleInterN[5]={0};//double *InterN =new double[n]; //нач

doubleInterK[5]={0};//double *InterK =new double[n]; //кон

doubleParam[4]={0}; //параметры

doubleT1[5]={0};//double *T1 =new double[n]; //tochka i -я

doubleT2[5]={0};//double *T2 =new double[n]; //tochka i+1 -я

doubleTempT[5]={0};//double *TempT =new double[n]; // временнаяtochka i+1 -я

doubleBB[5]={0};//double *BB= new double [n]; // BB — массивсизмененойi-ойточкойX[i]+g

doubleB[5]={0};//double *B= new double [n]; //B — массивсизмененойi-ойточкойX[i]-g

intg=0;

doubleModG =0; //модуль градиента

int ss=0,ind=0;

double **Tochki; //указатель на массив с точками приближения

//---------------------------------------------------------------------------

doubleTForm1::F1( double T[]) //Formula1 U=A*x1^3+B*x2^2-C*x1-D*x2

{double U = 0;

U=IntPower(T[0],3)+2*IntPower(T[1],2)-3*T[0]-4*T[1];

returnU; }

//---------------------------------------------------------------------------

doubleTForm1::F2( double T[]) //Formula2 U=x1^2+x1*x2+x2^2

{double U = 0;

U= IntPower(T[0],2)+T[0]*T[1]+IntPower(T[1],2);

returnU; }

//---------------------------------------------------------------------------

doubleTForm1::F3( double T[]) //Formula3 U=X1^2+X2^2

{double U = 0;

U=T[0]*T[0]+T[1]*T[1]+1;

returnU; }

//---------------------------------------------------------------------------

voidTForm1::Tochka(double shag) // функциясчитаеткоординатыследующейточки

{// n — количествопеременных

for(int i = 0; i < n; i++)

{

TempT[i]=T2[i]-shag*Gr(i);

//точкаX[j+1]=точкаX[j]- h козфшага*градиетgrad R(X[j])

}

}

//---------------------------------------------------------------------------

doubleTForm1::Gr( int i) //gradient i-номерпеременной

{

doubledR=0; // dR — градиент поi

for(int j=0;j<n;j++) //BB,B==T1;

{

BB[j]=T2[j];

B[j]=T2[j];

}

BB[i]=T2[i]+Param[1]; // добавляем иотнимаемпробныйшаг

B[i]=T2[i]-Param[1]; // к i-ойпеременной

switch(UD->Position) {

case0: dR = (F1(BB)- F1(B))/(2*Param[1]); break;

case1: dR = (F2(BB)-F2(B))/(2*Param[1]); break;

case2: dR = (F3(BB)-F3(B))/(2*Param[1]); break;

}

returndR;

}

//--------------------------------------------------------------------------

voidTForm1::Min()

{ // массив в котором

//double Tochki[1][5];//хранится первое приближение

//double**Tochki; //создаем массивTemp[ss][n]

Tochki= new double*[100];

for(int j = 0; j < 100; j++)

Tochki[j]= new double[3];

boolMinimum=false,Pogresh=false,shag=false;

doublesh=Param[0];

for(int j=0;j<n;j++) //T1,T2,TempT=PeremenN;

{

T1[j]=PeremenN[j];

T2[j]=PeremenN[j];

TempT[j]=PeremenN[j];

Tochki[0][j]=PeremenN[j];

}

while ( Minimum ==false ) // после выхода из цикла

{ // минимум в точке T2

shag=false;

//началоблока2

while(shag == false)

{

doubleR=0;

Tochka(sh);

switch(UD->Position) {

case0: R=F1(TempT)-F1(T1); break;

case1: R=F2(TempT)-F2(T1); break;

case2: R=F3(TempT)-F3(T1); break; }

if (R > 0) // шагбольшой то

{ // уменьшаем его в 2раза

sh=sh/2;

}

else

{shag =true; }

}

// конец блока 2

// Проверяем входит ли точкав указанный диапозон

// если нет то считаемпредыдущую точку минимальной

if(DD==true )

{

for( int i=0; i<n; i++)

{

if( InterN[i] > TempT[i])

{

Diapozon=false;

Minimum= true;

}

if(InterK[i] < TempT[i])

{

Diapozon=false;

Minimum= true;

}

}

}

for(int j=0;j<n;j++)

{

T1[j]=T2[j];//T1=T2

T2[j]=TempT[j];//T2=TempT

}

//началоблока3

ModG=0;//- модульградиента

for(int i = 0; i < n; i++)

{

ModG+=Gr(i)*Gr(i);

}

ModG=sqrt(ModG);

if( ModG < Param[2]) // /gradient/ < e гдеe-погрешность

{Minimum=true; } // /gradient/ — модульградиента

//конецблока3

ss++;

if(Param[3] != -1 )

if(ss == Param[3])

Minimum=true;

//началоблока4

if( ss > 99 )

{ MessageDlg(«Пределпревышен… точек более 100… измените шаг»,mtWarning,

TMsgDlgButtons()<< mbOK, 0);break;}

if(Diapozon==true)

{

for(int j = 0; j < n; j++)

Tochki[ss][j]= T2[j];

}

}

for(int j = 0; j <= ss; j++)

{

for(int i = 0; i < n; i++)

TempT[i]=Tochki[j][i];

switch(UD->Position) {

case0: Tochki[j][2] = F1(TempT); break;

case1: Tochki[j][2] = F2(TempT); break;

case2: Tochki[j][2] = F3(TempT); break; }

}

//

/*double **Temp; //создаем массивTemp[ss][n]

Temp= new double*[ss];

for(int j = 0; j < ss; j++)

Temp[j]= new double[n];

//

for(int i = 0; i < ss; i++)

for(int j = 0; j < n; j++)

Temp[i][j]=Tochki[i][j];

//

//for(int i = 0; i < ss; i++) //удаляеммассивTochki[ss][n]

//delete[]Tochki[i];

//deleteTochki;

//

intmm=ss+1;

double**Tochki; //создаем массивTochki[ss+1][n]

Tochki= new double*[mm];

for(int j = 0; j < mm; j++)

Tochki[j]= new double[n];

//

for(int i = 0; i < mm-1; i++)

for(int j = 0; j < n; j++)

Tochki[i][j]= Temp[i][j];

//

for(int j = 0; j < n; j++)

Tochki[ss][j]= T2[j];

//

//for(int i = 0; i < ss; i++) //удаляеммассивTemp[ss][n]

//delete[]Temp[i];

//delete[] Temp;

}

//конецблока4 */

}

//--------------------------------------------------------------------------

void__fastcall TForm1::UDClick(TObject *Sender, TUDBtnType Button)

{

Edit2->Text=Formula[UD->Position];

}

//---------------------------------------------------------------------------

void__fastcall TForm1::StartClick(TObject *Sender)

{

Panel1->Visible=false;

Edit2->Text=Formula[UD->Position];

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Sh1NextClick(TObject *Sender)

{

ii++;

PageControl1->ActivePageIndex=ii;

g=1;

switch(UD->Position) {

case0: Kol->Caption=KolPer[0];break;

case1: Kol->Caption=KolPer[1];break;

case2: Kol->Caption=KolPer[2];break;

}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Sh2NextClick(TObject *Sender)

{

ii++;

PageControl1->ActivePageIndex=ii;

g=3;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Sh3BackClick(TObject *Sender)

{

ii--;

PageControl1->ActivePageIndex=ii;

Panel5->Visible=false;

Sh2Next->Visible=false;

g=2;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Sh2BackClick(TObject *Sender)

{

if(g ==1 )

{

ii--;

PageControl1->ActivePageIndex=ii;

Panel2->Visible=true;

Panel3->Visible=false;

Panel4->Visible=false;

Panel5->Visible=false;

}

if(g == 2)

{

Panel3->Visible=true;

Panel4->Visible=false;

Panel5->Visible=false;

n=KolPer[UD->Position];

Per->Caption=«X1=»;

s=0;

g=1;

}

if(g == 3)

{

Panel5->Visible=false;

Sh2Next->Visible=false;

g=2;

}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Button1Click(TObject *Sender)

{

Panel3->Visible=true;

n=KolPer[UD->Position];

Per->Caption=«X1=»;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Button2Click(TObject *Sender)

{

PeremenN[s]=StrToFloat(Edit4->Text);//нул.приб

InterN[s]=StrToFloat(Edit3->Text);//нач

InterK[s]=StrToFloat(Edit5->Text);//кон

s++;

Per->Caption=«X»+IntToStr(s+1)+"=";

g=2;

if(s == n)

{Panel4->Visible=true;g=2;}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Button3Click(TObject *Sender)

{

Param[0]=StrToFloat(Edit6->Text);//коэ.шага

Param[1]=StrToFloat(Edit7->Text);// проб.шаг

Param[2]=StrToFloat(Edit8->Text);// погр.

if(CB1->Checked== true )

{Param[3]=StrToFloat(NT->Text);}

else

{Param[3]=-1;}

Sh2Next->Visible=true;

Panel5->Visible=true;

g=3;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::PuskClick(TObject *Sender)

{

ss=0; //количествоточек которых получилось

Diapozon=true;

Min();

if(Diapozon==false)

ss=ss-1;

Sh3Back->Visible=true;

Panel6->Visible=true;

Series1->Clear();

for(inti = 0; i <ss; i++)

{

Series1->AddXY(i,Tochki[i][2],"",clBlue);

Nomer->Items->Add(i);

}

Nomer->Items->Add(ss);

//Nomer->Items->St

//ListT->Items->Add(123);

//if( Diapozon=true )

//{Itog->Caption=«Точка минимумавуказанномдиапозоне»; }

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void__fastcall TForm1::CB1Click(TObject *Sender)

{

if(CB1->Checked== true )

NT->Visible=true;

if(CB1->Checked== false )

NT->Visible=false;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Button8Click(TObject *Sender)

{

Panel6->Visible=false;

ListT->Items->Clear();

Nomer->Items->Clear();

Nomer->ItemIndex=-1;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::NomerChange(TObject *Sender)

{

intind=Nomer->ItemIndex;

ListT->Items->Clear();

for(int i=0;i<n;i++)

ListT->Items->Add(Tochki[ind][i]);

ListT->Items->Add(Tochki[ind][2]);

if(ind == ss)

if(Diapozon==true)

{ListT->Items->Add(" Минимум");}

else

{

ListT->Items->Add("Минимум");

ListT->Items->Add(«Следующаяточкав»);

ListT->Items->Add(«диапозонне входит»);

}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::Pr1Click(TObject *Sender)

{

if(Pr1->Checked== true )

DD=true;

if(Pr1->Checked== false )

{

DD=false;

MessageDlg(«Выотключили проверку диапозона точки,»

«убедитесь в этом»,mtWarning,

TMsgDlgButtons()<< mbOK, 0);

}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::CB2Click(TObject *Sender)

{

if(CB2->Checked== true )

{

Panel7->Visible=true;

Series1->Active=false;

Series2->Clear();

Perem->Text=«Xi»;

Perem->Items->Clear();

CB3->ItemIndex=-1;

CB3->Items->Clear();

CB4->ItemIndex=-1;

CB4->Items->Clear();

for(inti = 0; i < n; i++)

Perem->Items->Add(i+1);

for(inti = 0; i <= ss; i++)

{

CB3->Items->Add(i);

}

}

if(CB2->Checked== false )

{

Series2->Clear();

Series2->Active=false;

Series1->Active=true;

Panel7->Visible=false;

CB4->Enabled=false;

CB3->Enabled=false;

}

}

//---------------------------------------------------------------------------

void__fastcall TForm1::PeremChange(TObject *Sender)

{

intind=Nomer->ItemIndex;

CB3->Enabled=true;

CB3->ItemIndex=0;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::CB3Change(TObject *Sender)

{

CB4->Items->Clear();

CB4->ItemIndex=-1;

intin=CB3->ItemIndex;

CB4->Enabled=true;

for(inti = in; i <=ss; i++)

CB4->Items->Add(i);

CB4->ItemIndex=0;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::CB4Change(TObject *Sender)

{

Bild->Visible=true;

}

//---------------------------------------------------------------------------

void__fastcall TForm1::BildClick(TObject *Sender)

{

Series2->Clear();

ListP->Items->Clear();

intnh=CB3->ItemIndex;

intnk=CB4->ItemIndex;

Series2->Active=true;

for(inti = nh; i <=nk+nh; i++)

{

Series2->AddXY(i,Tochki[i][ind],"",clBlue);

ListP->Items->Add(Tochki[i][ind]);

}

Bild->Visible=false;

CB4->Enabled=false;

CB4->Items->Clear();

CB4->ItemIndex=-1;

}

//---------------------------------------------------------------------------

еще рефераты
Еще работы по математике