Разработка программного проекта определения локальных экстремумов функции

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 11.06.2015
Размер файла 2,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

46

Размещено на http://www.allbest.ru/

1

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

"Норильский Индустриальный институт"

Кафедра Информационных систем и технологий

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

По дисциплине:

Высокоуровневые методы информатики и программирования

На тему: «Разработка программного проекта определения локальных экстремумов функции»

Разработал студент

Лапшин И.А.

группа ИС - 14(дневн)

Руководитель:

к.т.н.,профессор, Фомичева С.Г.

Норильск, 2015

Оглавление

Назначение и цели создания проекта

Формализация задачи

Укрупненная блок-схема алгоритма

Листинг программы и модулей

Результат работы приложения

Файл-справка

Заключение

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

алгоритм инсталляция приложение экстремум функция

Введение

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

Первый объектно-ориентированный язык программирования Simula 67 был разработан в конце 60-х годов в Норвегии. Авторы этого языка очень точно угадали перспективы развития программирования: их язык намного опередил свое время. Однако современники (программисты 60-х годов) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran). Прохладному отношению к языку Simula 67 способствовало и то обстоятельство, что он был реализован как интерпретируемый, а не компилируемый язык, что было совершенно неприемлемым в 60-е годы, так как интерпретация связана со снижением скорости выполнения программ.

Но достоинства языка Simula 67 были замечены некоторыми программистами, и в 70-е годы было разработано большое число экспериментальных объектно-ориентированных языков программирования: например, языки CLU, Alphard, Concurrent Pascal и др. Эти языки так и остались экспериментальными, но в результате их исследования были разработаны современные объектно-ориентированные языки программирования: C++, C Sharp, Smalltalk, Delphi и др.

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

Delphi - чрезвычайно быстро развивающаяся система. Первая версия - Delphi 1. 0 была выпущена в феврале 1995 г. А затем новые версии выпускались ежегодно.

Каждая последующая версия Delphi дополняла предыдущую.

Большинство версий Delphi выпускается в нескольких вариантах: Standart - стандартном, Professional профессиональном, Client/Server - клиент/сервер, Enterprise - разработка баз данных предметных областей. Различаются варианты в основном разным уровнем доступа к системам управления базами данных. Последние варианты - Client/Server и Enterprise, в этом отношении наиболее мощные.

Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав C Sharp.

Назначение и цели создания проекта

Условие задачи: Задача нахождения локального экстремума функции одного аргумента. Построить график функции F(x), позволяющий выполнять зуммирование и скроллинг изображения.

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

Назначение проекта:

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

2. Построение графика функции для графического решения задачи.

3. Сохранение данных в файл и загрузка данных из этого файла.

К большому сожалению моя программа не может конкурировать с известными аналогами: MathCad, SciLab, SAGE. Но в дальнейшем, благодаря изучению новых языков программирования я мечтаю об усовершенствовании данной программы. Я задаюсь целью вычисления экстремумов сложных функций, вводимых пользователем вручную.

Цели, которые я ставил перед собой, приступая к работе:

1. Узнать больше о нахождение экстремумов функций одной переменной.

2. Придумать функции для выбора пользователем.

3. Ознакомиться с возможностями визуальной среды программирования Delphi и сделать удобный интерфейс для расчета. Написать программу для расчета экстремумов функций.

4. Протестировать данную программу на разных операционных системах.

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

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

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

Также нужно продумать вопросы, которые могут возникнуть у пользователя при использовании данной программы, и создать справку с ответами на вопросы такого рода.

Формализация задачи

Пусть функция f задана на некотором множестве X? R и ? X.

Определение 1: Точка называется точкой локального максимума (минимума) функции f, если существует такая окрестность U() точки , что для всех x ? X ? U() выполняется неравенство

f(x) ? f() (соответственно f(x) ?f())

Если для всех x ? X ? U() и x ? выполняется неравенство f(x) < f() (соответственно f(x) > f()), то точка называется точкой строгого локального максимума (минимума).

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

Теорема 2 (необходимое условие экстремума): Если функция имеет в точке локального экстремума производную, то эта производная равна нулю.

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

Замечание 2. Напомним, что под производной всегда понимается конечная производная, если специально не оговорено, что допускаются и бесконечные производные. Из комментариев к теореме Ферма следует, что в точке локального экстремума может существовать знаконеопределенная бесконечная производная, но не может существовать бесконечная производная определенного знака. Может случиться, что в точке локального экстремума вообще не существует производной - ни конечной, ни бесконечной (см. рис. №1).

(Рис. №1)

Отметим, что условия равенства нулю производной или ее несуществования в данной точке, будучи необходимыми условиями экстремума, не являются достаточными условиями для наличия экстремума в этой точке. Например, у функции f(x) = производная f '(x) = 3 в точке x =0 равна нулю, а экстремума в этой точке нет (рис. №2).

(Рис. №2)

Определение 2. Если функция определена в некоторой окрестности точки x0 и в этой точке производная функции либо существует и равна нулю, либо не существует, то точка называется критической точкой этой функции. Критические точки функции, в которых производная функции равна нулю, называются также и стационарными точками.

Теорема 2 означает, что все точки локального экстремума функции находятся среди множества ее критических точек.

Определение 3. Точка называется точкой возрастания (убывания) функции f, если у существует такая окрестность U(), что при x ? X ? U(), и x < , выполняется неравенство f(x) ? f() (соответственно f(x) ? f()), а при x ? - неравенство f(x) ? f() (соответственно f(x) ? f()). Если при x ? выполняется, кроме того, неравенство f(x) ? f(), то точка называется точкой строгого возрастания (строгого убывания) функции f. Точки строгого экстремума, точки строгого возрастания и убывания удобно описывать в терминах знака приращения

?y = f( + ?x) - f()

функции f. В точке строгого максимума приращение функции в некоторой окрестности этой точки имеет отрицательное значение при ?x ? 0, в точке строгого минимума - положительное, в точке строгого возрастания при ?x < 0 - отрицательное, при ?x > 0 - положительное, а в точке строгого убывания - положительное при ?x < 0 и отрицательное при ?x > 0 (рис. №3). Конечно, здесь всегда предполагается, что приращение аргумента ?x таково, что точка + ?x принадлежит области определения X функции f. Таким образом, при переходе через точку строгого экстремума (т. е. при изменении знака приращения аргумента ?x) приращение функции не меняет знака, а при переходе через точки строгого возрастания и убывания меняет знак. Нетрудно сформулировать в терминах знака производной в точке достаточные условия того, что эта точка является точкой строгого возрастания или убывания (в этом случае согласно определению производной функция заведомо определена в некоторой окрестности рассматриваемой точки).

(Рис. №3)

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

Если функция f имеет в точке положительную производную

то для всех достаточно малых ?x выполняется неравенство

Отсюда следует, что при? x < 0 имеет место ?y < 0, а при? x > 0 также и ?y > 0, т. е. точка является точкой строгого возрастания.

Аналогично рассматривается случай f'().

Таким образом, если в точке существует не равная нулю производная (конечная или определенного знака бесконечная), то эта точка является либо точкой строгого возрастания, либо точкой строгого убывания, а следовательно, не может быть точкой экстремума. Тем самым мы еще раз доказали, что если в точке экстремума существует конечная или определенного знака бесконечная производная, то она равна нулю. Отметим, что доказанная лемма дает лишь достаточные, но не необходимые условия для точек строгого возрастания и строгого убывания функций, имеющих в этих точках конечные или бесконечные производные. Это видно уже на примере функции f(x) = x3, у которой точка x = 0 является точкой строгого возрастания, а производная в ней равна нулю: f'(0) = 0 (см. рис. 82).

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

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

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

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

Для того чтобы функция в этой точке имела строгий максимум (строгий минимум), необходимо и достаточно, чтобы при переходе через нее производная меняла знак с плюса на минус (соответственно с минуса на плюс).

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

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

Пусть функция f непрерывна в окрестности U() точки , дифференцируема в проколотой окрестности

?() и производная сохраняет постоянный знак во всех точках проколотой окрестности ?(), лежащих с каждой стороны от точки . Для любой точки x ? ?(), согласно формуле Лагранжа, имеем ?y = f'(е)?x, где точка е лежит между точками и x = + ?x. Таким образом,

(1)

Поэтому если производная f'(x) меняет знак с плюса на минус при переходе через точку :

f'(x) > 0 при ?x < 0 и f'(x) < 0 при ?x > 0, (1)>0 то при ?x < 0 и (1)<0 при ?x > 0. Отсюда ?y < 0 при всех ?x, + ?x ?(), т.е. приращение функции ?y не меняет знака при переходе через точку и является отрицательным. Это означает, что точка является точкой строгого локального максимума.

Аналогично, из формулы (1) следует, что если производная f'(x) меняет знак с минуса на плюс при переходе через точку , то (1)<0 при ?x < 0 и (1)>0 при ?x > 0, а поэтому при переходе через точку приращение функции ?y не меняет знака и положительно. Это означает, что точка является точкой строгого локального минимума.

Если производная f'(x) не меняет знака при переходе через точку , то из формулы (1) следует, что и отношение ?y/?x также не меняет знака при переходе через эту точку и его знак совпадает со знаком производной. Поэтому если f'(x) > 0, x ? ?(), то ?y < 0 при ?x < 0 и ?y > 0 при ?x > 0, т.е. точка является точкой строгого возрастания, а если f'(x) < 0, x ? ?(), то аналогично получаем, что точка является точкой строгого убывания.

Мы доказали, что каждое из рассмотренных условий о знаке производной с разных сторон от точки является достаточным условием соответственно для строгого локального максимума, строгого локального минимума, строгого возрастания или убывания функции в точке. Поскольку были рассмотрены все возможные случаи знаков производной с каждой стороны от точки , то все сформулированные условия являются не только достаточными, но и необходимыми для соответствующих утверждений (рис. №4).

(Рис. №4)

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

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

Теорема 4. Пусть функция y = f(x) n раз дифференцируема в точке , n > 1 и () = 0, x = 1, 2, ..., n - 1, () ?0. (2)

Тогда если n = 2m, m ? N, т.е. n - четное число, то функция f имеет в точке строгий экстремум, а именно строгий максимум при () < 0 и строгий минимум при () > 0. Если же n = 2m - 1, m ? N, т. е. n - нечетное число, то функция f не имеет в точке экстремума; в этом случае при () > 0 точка является точкой строгого возрастания функции f, а при () < 0 - ее точкой строгого убывания.

Предпошлем доказательству одно простое замечание: если в(x) = o(б(x)), x>, где функции б и в заданы в некоторой окрестности точки ? R, то существует такая окрестность U() этой точки, что при x ? U() справедливо неравенство

|в(x)| = |б(x)|/2. (3)

В самом деле,

| в (x)| = (x)б(x), (4)

где = 0, и, следовательно, существует такая окрестность U(), что при x ? U() выполняется неравенство

| (x)| < 1/2. (5)

Из (4) и (5) следует неравенство (3).

Напишем формулу Тейлора порядка n для функции f в окрестности точки .В силу условий (2) будем иметь

?y = f( + ?x) - f() = ? + o(), ?x>0. (6)

Так как () ?0, то

o()= o, ?x>0,

т.е. второй член правой части равенства (6) является бесконечно малым по сравнению с первым. Поэтому, согласно (3), существует такая окрестность U() точки , что при x ? U() для функции o() в формуле (6) выполняется неравенство

|o(|<= |?|

и, следовательно, при достаточно малых ?x знак правой части равенства (6), а потому и знак приращения функции ?y, совпадает со знаком первого слагаемого правой части. Если n = 2k, то в формуле (6) приращение аргумента ?x возводится в четную степень, поэтому знак приращения функции ?y не зависит от знака ?x?0 и, следовательно, является точкой строгого экстремума, причем строгого максимума при () < 0 (в этом случае ?y < 0, ?x?0) и строгого минимума при () > 0 (в этом случае y > 0, ?x?0). Если же n = 2k - 1, то ?x возводится в нечетную степень, и поэтому знак ?y меняется вместе с изменением знака ?x, следовательно, точка не является точкой экстремума. Если ?x меняет знак с минуса на плюс, то при () > 0 приращение ?y также меняет знак с минуса на плюс и, следовательно, является точкой возрастания функции f, а при () < 0 приращение ?y меняет знак с плюса на минус и, следовательно, точка является точкой убывания функции f.

Отметим специально частный случай теоремы 4 при n = 2. Если f'(x) = 0, а f"(x) > 0, то точка является точкой строгого минимума, а если f'(x) = 0, а f"(x) < 0, (рис. №5), то - точкой строгого максимума. Подчеркнем, что все условия экстремума, полученные в этом параграфе, относятся к внутренним точкам промежутка, на котором была определена функция. На концах промежутка требуется проводить отдельные исследования и при применении методов дифференциального исчисления использовать в концевых точках понятие односторонних производных.

Минимум Максимум

(Рис. №5)

Укрупненная блок-схема алгоритма

procedure TfrmMain.edXminKeyPress(Sender: TObject; var Key: Char);

procedure TfrmMain.Button1Click(Sender: TObject);

procedure TfrmMain.mniPropSaveClick(Sender: TObject);

procedure TfrmMain.mniLoadPropClick(Sender: TObject);

procedure TfrmMain.cbFunctionCloseUp(Sender: TObject);

procedure TfrmMain.SetFunctionProperties(mf: TFunctionProperties);

function TfrmMain.GetFunctionProperties: TFunctionProperties;

procedure TfrmMain.FormCreate(Sender: TObject);

procedure TfrmMain.N1Click(Sender: TObject);

procedure TfrmMain.N2Click(Sender: TObject);

procedure TfrmGraf.CreateParams(var Params: TCreateParams);

procedure TfrmGraf.mniZoomPClick(Sender: TObject);

procedure TfrmGraf.mniZoomMClick(Sender: TObject);

procedure TfrmGraf.mni100Click(Sender: TObject);

procedure TfrmGraf.mniFileClick(Sender: TObject);

procedure TfrmGraf.FormClose(Sender: TObject; var Action: TCloseAction);

procedure TfrmGraf.SetFunctionProperties;

procedure TfrmGraf.BuildGraf;

procedure TfrmGraf.mniPropSaveClick(Sender: TObject);

procedure TfrmGraf.mniLoadPropClick(Sender: TObject);

procedure TfrmGraf.FormCreate(Sender: TObject);

procedure TfrmGraf.Button1Click(Sender: TObject);

Листинг программы и модулей

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, UmGlobal, Menus, ShellAPI;

type

TfrmMain = class(TForm)

Panel1: TPanel;

cbFunction: TComboBox;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

StringGrid1: TStringGrid;

GroupBox3: TGroupBox;

Label1: TLabel;

edXmin: TEdit;

Label2: TLabel;

edXmax: TEdit;

GroupBox4: TGroupBox;

Label3: TLabel;

eddX: TEdit;

Button1: TButton;

SaveDialog1: TSaveDialog;

OpenDialog1: TOpenDialog;

MainMenu1: TMainMenu;

mniFile: TMenuItem;

mniPropSave: TMenuItem;

mniLoadProp: TMenuItem;

mniAbout: TMenuItem;

N1: TMenuItem;

N2: TMenuItem;

procedure edXminKeyPress(Sender: TObject; var Key: Char);

procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);

procedure Button1Click(Sender: TObject);

procedure mniPropSaveClick(Sender: TObject);

procedure mniLoadPropClick(Sender: TObject);

procedure cbFunctionCloseUp(Sender: TObject);

function GetFunctionProperties: TFunctionProperties;

procedure SetFunctionProperties(mf:TFunctionProperties);

procedure FormCreate(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

uses Unit2,unit3;

{$R *.dfm}

procedure TfrmMain.edXminKeyPress(Sender: TObject; var Key: Char);

//запрет ввода неверных символов в компонеты ввода Edit

var s,text:string;

begin

Text:=TEdit(Sender).text;

case key of

'0'..'9',#8,#13:; // разрешены только числовые значения,

',','.': begin //разделитель дробной части,

if (Text<>'') and (Text[Length(Text)] in ['0'..'9']) then

Key:=DecimalSeparator

else

Key:=#0;

if pos(DecimalSeparator,text)<>0 then

key:=#0;

end;

'-': begin // и минус.

Key:=#0;

if (Length(text)>0)and(Text[1]='-') then

Text:=Copy(text,2,Length(text)-1)

else Text:='-'+Text;

TEdit(Sender).text:=Text;

TEdit(Sender).SelStart:=Length(Text);;

end;

else key:=#0;

end;

end;

procedure TfrmMain.StringGrid1KeyPress(Sender: TObject; var Key: Char);

//запрет ввода неверных символов в StringGrid

var text:string;

begin

Text:=TStringGrid(Sender).Cells[TStringGrid(Sender).Col,

TStringGrid(Sender).Row];

case key of

'0'..'9',#8:; // разрешены только числовые значения,

',','.': begin //разделитель дробной части,

if (Text<>'') and (Text[Length(Text)] in ['0'..'9']) then

Key:=DecimalSeparator

else Key:=#0;

if pos(DecimalSeparator,text)<>0 then key:=#0;

end;

'-': begin // и минус

Key:=#0;

if (Length(text)>0)and(Text[1]='-') then

Text:=Copy(text,2,Length(text)-1)

else Text:='-'+Text;

TStringGrid(Sender).Cells[TStringGrid(Sender).Col,

TStringGrid(Sender).Row]:=Text;

Application.ProcessMessages;

sendMessage(Windows.getFocus,EM_SETSEL,length(text),length(text));

end;

#13: // Enter

if (TStringGrid(Sender).Col+1)<TStringGrid(Sender).ColCount then

TStringGrid(Sender).Col:=TStringGrid(Sender).Col+1;

else key:=#0;

end;

end;

procedure TfrmMain.Button1Click(Sender: TObject);

// запуск построения графика функции

var gf:TfrmGraf;

begin

gf:=TfrmGraf.create(Self);

gf.mF:=GetFunctionProperties;

gf.Show;

gf.BuildGraf;

end;

procedure TfrmMain.mniPropSaveClick(Sender: TObject);

// сохранеие выбранных параметров функции

var cf:TFunctionProperties;

begin

cF:=GetFunctionProperties;

if SaveDialog1.Execute then

SavePropertis(SaveDialog1.FileName,cF);

end;

procedure TfrmMain.mniLoadPropClick(Sender: TObject);

// защита от поврежденных файлов

var mf:TFunctionProperties;

i:integer;

begin

if OpenDialog1.Execute then

begin

try

mf:=LoadProperties(OpenDialog1.FileName);

except

MessageDlg('Ошибка загрузки файла',mtError,[mbOk],0);

exit;

end;

SetFunctionProperties(mf);

end;

end;

procedure TfrmMain.cbFunctionCloseUp(Sender: TObject);

var cF:TFunctionProperties;

begin

cF.FName:=cbFunction.Text;

cF.FNumb:=cbFunction.ItemIndex;

// при выборе функции задаем некоторые начальные значанения (для примера)

case cF.FNumb of

0:begin // y = n * e^mx

cF.FConstName:='nm';

cF.FConstValues[1]:=2;

cF.FConstValues[2]:=3;

cF.Xmin:=-1;

cF.Xmax:=1;

cF.dX:=0.01;

end;

1:begin // y = n * tg(m * x)

cF.FConstName:='nm';

cF.FConstValues[1]:=1.3;

cF.FConstValues[2]:=2;

cF.Xmin:=-3;

cF.Xmax:=3;

cF.dX:=0.01;

end;

2:begin // y = k * ctg(m * x)

cF.FConstName:='km';

cF.FConstValues[1]:=0.001;

cF.FConstValues[2]:=400;

cF.Xmin:=-0.05;

cF.Xmax:=0.05;

cF.dX:=0.01;

end;

3:begin // y = n * ln(m * x)

cF.FConstName:='nm';

cF.FConstValues[1]:=2;

cF.FConstValues[2]:=0.1;

cF.Xmin:=0;

cF.Xmax:=4;

cF.dX:=0.01;

end;

4:begin // y = n * arcsin(m * x)

cF.FConstName:='nm';

cF.FConstValues[1]:=2;

cF.FConstValues[2]:=2;

cF.Xmin:=-0.3;

cF.Xmax:=0.53;

cF.dX:=0.01;

end;

5:begin // y = n * arccos(m * x)

cF.FConstName:='nm';

cF.FConstValues[1]:=2;

cF.FConstValues[2]:=5;

cF.Xmin:=-0.25;

cF.Xmax:=0.18;

cF.dX:=0.01;

end;

end;

SetFunctionProperties(cF);

end;

procedure TfrmMain.SetFunctionProperties(mf: TFunctionProperties);

// установка параметров функции в компонеты ввода StringGrid

var I:integer;

begin

cbFunction.ItemIndex:=mf.FNumb;

StringGrid1.ColCount:=1+Length(mf.FConstName);

for I:=1 to StringGrid1.ColCount-1 do

begin

StringGrid1.Cells[i,1]:=FloatToStrF(mf.FConstValues[i],ffGeneral,8,8);

StringGrid1.Cells[i,0]:=mf.FConstName[i];

end;

edXmin.Text:=FloatToStrF(mf.Xmin,ffGeneral,8,8);

edXmax.Text:=FloatToStrF(mf.Xmax,ffGeneral,8,8);

eddX.Text:=FloatToStrF(mf.dX,ffGeneral,8,8);

end;

function TfrmMain.GetFunctionProperties: TFunctionProperties;

// получение параметров функции из компонентов ввода StringGrid

var i:integer;

begin

Result.FNumb:=cbFunction.ItemIndex;

Result.FConstName:='';

Result.FName:=cbFunction.Text;

for i:=1 to StringGrid1.ColCount-1 do

Result.FConstName:=Result.FConstName+StringGrid1.Cells[i,0];

for I:=1 to StringGrid1.ColCount-1 do

Result.FConstValues[i]:=StrToFloat(StringGrid1.Cells[i,1]);

Result.Xmin:=StrToFloat(edXmin.Text);

Result.Xmax:=StrToFloat(edXmax.Text);

Result.dX:=StrToFloat(eddX.Text);

end;

procedure TfrmMain.FormCreate(Sender: TObject);

var i:integer;

begin

for i:=1 to StringGrid1.ColCount-1 do

begin

StringGrid1.Cells[i,1]:='0';

end;

StringGrid1.Cells[0,0]:='Коэффициенты';

StringGrid1.Cells[0,1]:='Значения';

cbFunctionCloseUp(self);

end;

procedure TfrmMain.N1Click(Sender: TObject);

var f:TAboutBox;

begin

f:=TAboutBox.create(self);

f.ShowModal;

f.free;

end;

procedure TfrmMain.N2Click(Sender: TObject);

var dir:string;

begin

dir:=GetCurrentDir+'\help.doc';

ShellExecute(handle,'open',PChar(dir),nil,nil,SW_SHOWNORMAL);

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, umGlobal, ImgList, Menus, TeeProcs, TeEngine, Chart, ExtCtrls,

ExtDlgs, Buttons, Series,math, StdCtrls, Grids;

type

TfrmGraf = class(TForm)

Panel1: TPanel;

Panel2: TPanel;

Chart1: TChart;

MainMenu1: TMainMenu;

mniFile: TMenuItem;

N1: TMenuItem;

mniZoomP: TMenuItem;

mniZoomM: TMenuItem;

ImageList1: TImageList;

mni100: TMenuItem;

btnZoomP: TSpeedButton;

btn100: TSpeedButton;

btnZoomM: TSpeedButton;

SavePictureDialog1: TSavePictureDialog;

Series1: TLineSeries;

mniSaveGraf: TMenuItem;

mniPropSave: TMenuItem;

mniLoadProp: TMenuItem;

SaveDialog1: TSaveDialog;

OpenDialog1: TOpenDialog;

StringGrid1: TStringGrid;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

lbXmin: TLabel;

Label4: TLabel;

lbXmax: TLabel;

Label5: TLabel;

lbdX: TLabel;

Memo1: TMemo;

Button1: TButton;

procedure mniZoomPClick(Sender: TObject);

procedure mniZoomMClick(Sender: TObject);

procedure mni100Click(Sender: TObject);

procedure mniFileClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

Procedure BuildGraf;

procedure mniPropSaveClick(Sender: TObject);

procedure mniLoadPropClick(Sender: TObject);

procedure SetFunctionProperties;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure CreateParams(var Params: TCreateParams); override;

private

{ Private declarations }

public

{ Public declarations }

mF:TFunctionProperties;

end;

var

frmGraf: TfrmGraf;

implementation

{$R *.dfm}

procedure TfrmGraf.CreateParams(var Params: TCreateParams);

// каждое окно будет иметь свою кнопку на панели задач

begin

inherited CreateParams(Params);

with Params do

ExStyle := ExStyle or WS_EX_APPWINDOW;

end;

procedure TfrmGraf.mniZoomPClick(Sender: TObject);

begin

Chart1.ZoomPercent(110);

end;

procedure TfrmGraf.mniZoomMClick(Sender: TObject);

begin

Chart1.ZoomPercent(90);

end;

procedure TfrmGraf.mni100Click(Sender: TObject);

begin

chart1.UndoZoom;

end;

procedure TfrmGraf.mniFileClick(Sender: TObject);

// сохранеие графика в графическом виде

begin

if savepicturedialog1.Execute then

if extractfileext(SavePictureDialog1.FileName)='.bmp' then

Chart1.SaveToBitmapFile(savepicturedialog1.FileName)

else

Chart1.SaveToMetafile(savepicturedialog1.FileName);

end;

procedure TfrmGraf.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree; // при закрытии окна оно уничтожается в памяти

end;

procedure TfrmGraf.SetFunctionProperties;

// установка значений функции в визуальные элементы формы

var I:integer;

begin

StringGrid1.RowCount:=1+Length(mf.FConstName);

for I:=1 to StringGrid1.RowCount-1 do

begin

StringGrid1.Cells[1,i]:=FloatToStrF(mf.FConstValues[i],ffGeneral,8,8);

StringGrid1.Cells[0,i]:=mf.FConstName[i];

end;

lbXmin.Caption:=FloatToStrF(mf.Xmin,ffGeneral,8,8);

lbXmax.Caption:=FloatToStrF(mf.Xmax,ffGeneral,8,8);

lbdX.Caption:=FloatToStrF(mf.dX,ffGeneral,8,8);

end;

procedure TfrmGraf.BuildGraf;

// построение графика

var cX,cY:double;

fl:boolean;

Ymax,Ymin,Xmin,Xmax:double;

begin

Ymax:=-MaxDouble;

Ymin:=MaxDouble;

chart1.UndoZoom;

fl:=False;

Series1.Clear; Memo1.Clear;

SetFunctionProperties;

Chart1.Title.Text.Text:=mf.FName;

Caption:='График: '+ mf.FName;

cX:=mF.Xmin; // начальное значение X Функции

while cX<=mF.Xmax do

begin

try

case mf.FNumb of // вычисляем выбранную функцию

0: cY:=mF.FConstValues[1]* exp(mF.FConstValues[2]*cX);

1: cY:=mF.FConstValues[1]* Tan(mF.FConstValues[2]*cX);

2: cY:=mF.FConstValues[1]* CoTan(mF.FConstValues[2]*cX);

3: cY:=mF.FConstValues[1]* Ln(mF.FConstValues[2]*cX);

4: cY:=mF.FConstValues[1]* ArcSin(mF.FConstValues[2]*cX);

5: cY:=mF.FConstValues[1]* ArcCos(mF.FConstValues[2]*cX);

end;

if Ymax<cY then

begin

Ymax:=cY;

Xmax:=cX;

end;

if Ymin>cY then

begin

Ymin:=cY;

Xmin:=cX;

end;

if fl then //проверка на разрыв графика функции

Memo1.Lines.Add('Х='+Floattostrf(cX,ffGeneral,8,8)

+' - первое возможное расчетное значение');

fl:=False;

except

if not Fl then

Memo1.Lines.Add('При значении Х='+Floattostrf(cX,ffGeneral,8,8)

+' функция терпит разрыв');

fl:=True;

end;

Series1.Addxy(cX,cY); // заносим значение функции в график

cX:=cX + mF.dX;// увеличиваем значение Х функции

end;

Memo1.Lines.Add('На заданном промежутке значения экстремумов составили:');

Memo1.Lines.Add('Ymin='+floatToStrF(Ymin,ffGeneral,8,8)+

' Xmin='+floatToStrF(Xmin,ffGeneral,8,8));

Memo1.Lines.Add('YMax='+floatToStrF(Ymax,ffGeneral,8,8)+

' Xmax='+floatToStrF(Xmax,ffGeneral,8,8));

end;

procedure TfrmGraf.mniPropSaveClick(Sender: TObject);

// сохранеие параметров в файл

begin

If SaveDialog1.Execute then

SavePropertis(SaveDialog1.FileName,mF);

end;

procedure TfrmGraf.mniLoadPropClick(Sender: TObject);

begin

// загрузка параметров из файла

if OpenDialog1.Execute then

begin

try

mf:=LoadProperties(OpenDialog1.FileName);

except

MessageDlg('Ошибка загрузки файла',mtError,[mbOk],0);

exit;

end;

BuildGraf;

end;

end;

procedure TfrmGraf.FormCreate(Sender: TObject);

begin

StringGrid1.Cells[0,0]:='Коэф';

StringGrid1.Cells[1,0]:='Знач';

end;

procedure TfrmGraf.Button1Click(Sender: TObject);

begin

TForm(Owner).Show; // показать окно параемтров

end;

end.

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,

Buttons, ExtCtrls;

type

TAboutBox = class(TForm)

Panel1: TPanel;

ProgramIcon: TImage;

ProductName: TLabel;

Version: TLabel;

Copyright: TLabel;

Comments: TLabel;

OKButton: TButton;

Label1: TLabel;

private

{ Private declarations }

public

{ Public declarations }

end;

var

AboutBox: TAboutBox;

implementation

{$R *.dfm}

end.

interface

Type TFunctionProperties=record //описание функции общедоступой для всех форм

FName:string[40];

FNumb:byte;

FConstName:string[5];

FConstValues:array[1..5] of double;

Xmin:double;

Xmax:double;

dX:double;

end;

procedure SavePropertis(FileName:string; fP:TFunctionProperties);

function LoadProperties (FileName:string):TFunctionProperties;

implementation

procedure SavePropertis(FileName:string; fP:TFunctionProperties);

var f:file of TFunctionProperties;

begin

AssignFile(f,FileName);

Rewrite(f);

Write(f, fP);

CloseFile(f);

end;

function LoadProperties (FileName:string):TFunctionProperties;

var f:file of TFunctionProperties;

begin

AssignFile(f,FileName);

Reset(f);

Read(f, Result);

CloseFile(f);

end;

end.

program Graf;

uses

Forms,

Unit1 in 'Unit1.pas' {frmMain},

UmGlobal in 'UmGlobal.pas',

Unit2 in 'Unit2.pas' {frmGraf},

Unit3 in 'Unit3.pas' {AboutBox};

$R *.res}

begin

Application.Initialize;

Application.CreateForm(TfrmMain, frmMain);

Application.Run;

end.

Результат работы приложения

Данное окно пользователь видит первым. Тут же выбирается функция, задаются коэффициенты и промежутки. После нажатия кнопки «Построить график» появляется новое окно:

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

Сохраненный график в формате wmf:

Файл-справка

О программе

НАХОЖДЕНИЕ ЛОКАЛЬНОГО ЭКСТРЕМУМА

ФУНКЦИИ ОДНОГО АРГУМЕНТА.

Данная программа разработана для расчета экстремумов и построения графиков данных функций:

1. y = n * e^mx

2. y = n * tg(m * x)

3. y = k * ctg(m * x)

4. y = n * ln(m * x)

5. y = n * arcsin(m * x)

6. y = n * arccos(m * x)

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

Расчет экстремума.

1. При запуске программы необходимо выбрать функцию из списка.

2. После - расставить значения коэффициентов строках для заполнения:

Значения коэффициентов(n,m,k);

Область построения(Xmin,Xmax);

Шаг дискретизации(dX);

3. Нажать на кнопку «Построить график». Откроется новое окно, где есть возможность увидеть график, приблизить его, зажав левую клавишу мыши и потянув по диагонали вправо-вниз что бы увеличить (влево-вверх что бы уменьшить). Скроллинг изображения производиться зажатием правой кнопки мыши. Под графиком выведены значения экстремумов на данном промежутке.

4. Также можно охранить свои параметры и график, кликнув на пункт меню “Файл”> ”Сохранить параметры функции/график”

5. Загрузить свои параметры можно так же нажав на пункт меню “Файл”> ”Загрузить параметры”

Спасибо за использование данной программы!

Заключение

Данная программа проверена на операционных системах Microsoft XP/7/8.1. Для ее корректной работы требуется 1,01 Мб.

Ошибок при запуске не обнаружено. Удобство программы было отмечено некоторыми пользователями. Они были довольны интерфейсом и быстродействием программ. В среднем для прорисовки графика и нахождения экстремумов требуется 1-3 секунды.

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

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

1.Круценюк, К. Ю. Численные методы решения уравнений (Excel, Turbo Pascal, Delphi) [Текст] : учеб. пособие / К. Ю. Круценюк ; Норильский индустр. ин-т. - Норильск : НИИ, 2010. - 76 с. - Библиогр.: с. 73-74 ( 24 назв.).

2.Круценюк, К. Ю. Технология визуального программирования (DELPHI для экономистов) [Текст]: лабораторный практикум / К. Ю. Круценюк ; Норильский индустр. ин-т. - Норильск : НИИ, 2008. - 92 с. - Библиогр.: с. 90 ( 19 назв.).

3.Delphi 7 [Текст] / Хомоненко А.Д. [ и др.] ; под ред. А.Д. Хомоненко. - СПб. : БХВ-Петербург, 2006. - 1216 с. : ил. - Предм. указ.: с. 1196-1200.

4.С.Г. Фомичева. Визуальная среда программирования Delphi/Учеб. пособие Норильск, НИИ,1999.

5.Пискунов Н.С. Дифференциальное и интегральное исчисления: Учеб. Для втузов. В 2-х т. Т. I: - М.: Интеграл - Пресс, 2001. - 416 с.

6.Научная библиотека: 4.17. Локальный экстремум функции, http://sernam.ru/lect_math2.php?id=57

7.Школьная коллекция: Локальный экстремум, http://school-collection.edu.ru/catalog/res/e0bd4447-c571-4282-a3e5-7915a08c949e/view/

8.Нуклипс: 15.2. Локальные экстремумы функций, http://nuclphys.sinp.msu.ru/mathan/p1/m1502.html

9.Mazprofs: Возрастание, убывание и экстремумы функции, http://mathprofi.ru/vozrastanie_ubyvanie_ekstremumy_funkcii.html

10.Math24: Локальные экстремумы функции, http://www.math24.ru/локальные-экстремумы-функции.html

11.Википедия: Экстремум, https://ru.wikipedia.org/wiki/Экстремум

12.Википедия: Delphi (язык программирования), https://ru.wikipedia.org/wiki/Delphi_(язык_программирования)

Размещено на Allbest.ru


Подобные документы

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

    дипломная работа [3,2 M], добавлен 18.06.2012

  • Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.

    курсовая работа [823,0 K], добавлен 18.12.2011

  • Разработка алгоритма и программы "Расчет стыкового паяного соединения" в среде Microsoft Visual Studio для облегчения расчётов сварных швов. Создание главной формы приложения и его кодирование для расчёта углового шва. Тестирование программы на ошибки.

    курсовая работа [1,5 M], добавлен 06.02.2013

  • Разработка программы для работы в операционных системах семейства Windows. Использование среды Delphi - современной технологии визуального проектирования. Создание пользовательского интерфейса, оконного приложения, меню; задание исходной матрицы.

    курсовая работа [1,5 M], добавлен 12.01.2011

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

    курсовая работа [501,4 K], добавлен 07.12.2016

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

    курсовая работа [303,4 K], добавлен 19.01.2016

  • Изучение основ программирования и создание полноценного приложения в среде программирования Delphi. Разработка эскизного и технического проектов программы. Внедрение выполнения программы. Разработка рабочего проекта, спецификация и текст программы.

    курсовая работа [560,1 K], добавлен 18.07.2012

  • Разработка графического интерфейса проекта (панель инструментов имеет 6 кнопок). Процедуры разделов программы: документа ThisDocument, программного модуля Module1 и пользовательских форм UserForm1, UserForm2 и Деление_амёбы. Тестирование программы.

    курсовая работа [29,5 K], добавлен 14.12.2010

  • Разработка в среде Delphi приложения "Записная книжка" для ввода и корректировки информации, поиска данных. Выбор состава технических и программных средств. Текст программы, ее описание и тестирование. Основные условия программы, требования к компьютеру.

    курсовая работа [565,7 K], добавлен 08.12.2011

  • Обзор различных способов реализации много поточности в языках программирования и операционных системах, а также разработка прототипа приложения реализующего многопоточность. Создание приложения в Delphi, реализующего потоки выполнения уровня пользователя.

    курсовая работа [86,7 K], добавлен 27.05.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.