Разработка программного проекта определения локальных экстремумов функции
Проведение формализации математической модели и разработка алгоритма программы для определения локальных экстремумов функции средствами 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