Численное определение экстремума функции по методу деления пополам
Сущность деления отрезка пополам (метода дихотомии). Использование свойства унимодальной функции для сокращения отрезка локализации точки минимума. Алгоритм решения вычислительной задачи. Код программы. Примеры ее работы. Руководство пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 16.02.2015 |
Размер файла | 572,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru
Задание
программа алгоритм функция
Численное определение экстремума функции по методу деления пополам.
Задан вид функции:
где e - константа 2,72.
Заданы коэффициенты a, b, c, d, f. Заданы отрезок поиска экстремума [x1 x2] и максимальная погрешность определения точки экстремума. Найти координаты (x,y) точки экстремума по методу деления пополам.
График - исследуемая функция y(x). Отмечаемая точка - точка экстремума.
Решение
В основе этого метода лежит свойство унимодальной функции , благодаря которому можно сокращать отрезок локализации точки минимума.
Пусть f(x) - непрерывная и унимодальная на отрезке [a,b] функция, принимающая во всех точках этого отрезка конечные значения. Пусть число пробных точек x1, x2, …, xn конечно, и для определения каждой точки xk можно использовать информацию о значениях функции во всех предыдущих точках x1, x2, …, xk - 1 . Положим a0 = a, b0 = b. Середина отрезка [a, b] = [a0, b0] находится в точке . Выберем две симметричные точки
x1 = , x2 =
Величина , удовлетворяющая условию 0 < < b - a , является параметром метода, как правило, - малая величина.
Вычислим значения функции в выбранных точках: f(x1) и f(x2). Определим новый отрезок локализации [a1, b1] следующим образом:
если f(x1) f(x2), то a1 = a0, b1 = x2;
если f(x1) > f(x2), то a1 = x1, b1 = b0.
Далее процедура деления отрезка [a1, b1] повторяется.
Деление продолжают до тех пор, пока половина длины отрезка [an, bn] не станет меньше заданной точности решения задачи , , т. е. пока не выполнится неравенство
< .
Тогда за приближение x* принимают середину отрезка [an, bn], т.е. x* .
Разработка алгоритма решения вычислительной задачи
Будем рассматривать метод половинного деления как простейший однопараметрический метод. Данный метод является методом прямого поиска. В нем при поиске экстремума функции используются только вычисленные значения функции.
Дана функция . Необходимо найти , доставляющий минимум (или максимум) функции на интервале с заданной точностью , т.е. найти
.
Запишем словесный алгоритм метода.
1. На каждом шаге процесса поиска делим отрезок пополам, - координата середины отрезка .
2. Вычисляем значение функции в окрестности вычисленной точки , т.е.
.
3. Сравниваем и и отбрасываем одну из половинок отрезка .
При поиске минимума:
Если , то отбрасываем отрезок , тогда .
Иначе отбрасываем отрезок , тогда .
При поиске максимума:
Если , то отбрасываем отрезок , тогда .
Иначе отбрасываем отрезок , тогда .
4. Деление отрезка продолжается, пока его длина не станет меньше заданной точности , т.е. .
Схема алгоритма метода представлена на рис 1.
На рис 1. - константа,
Рис.1. Блок-схема алгоритма.
Организация ввода-вывода.
В программе предусмотрено 2 варианта ввода данных:
- непосредственно с помощью ввода данных в поля «Еdit»(рис. 2):
Рис. 2 . Ввод данных с помощью формы
- с помощью файла (рис . 3):
Рис. 3. Ввод данных из файла.
Вывод данных реализуется 2 способами :
- в поле формы (рис.4)
- с помощью графика (рис. 5)
Рис.5 График функции.
Для сброса данных служит кнопка «Очистить», после нажатия которой можно вводить новые данные из файла или формы.
Контроль ошибочных ситуаций
Контроль ошибочных ситуаций реализуется с помощью вывода сообщений в отдельное окно:
Текст кода программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button1: TButton;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Button2: TButton;
Button3: TButton;
Label9: TLabel;
Button4: TButton;
Button5: TButton;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
a,b,c,d,f,eps,x1,x2,x,y1,y2,ymin:real;
fi:text;
buf:string;
implementation
uses Math, Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
Edit6.Text:='';
Edit7.Text:='';
Edit8.Text:='';
Label9.Caption:='';
Label12.Caption:='';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
a:=StrToFloat(Edit1.text);
b:=StrToFloat(Edit2.text);
c:=StrToFloat(Edit3.text);
d:=StrToFloat(Edit4.text);
f:=StrToFloat(Edit5.text);
x1:=StrToFloat(Edit6.text);
x2:=StrToFloat(Edit7.text);
eps:=StrToFloat(Edit8.text);
repeat
x:=(x1+x2)/2;
y1:= a*sin(b*(x-eps)+c)+d*exp(f*(x-eps));
y2:= a*sin(b*(x+eps)+c)+d*exp(f*(x+eps));
if y1<y2 then x2:=x else x1:=x;
until abs(x2-x1) < eps;
x:=(x1+x2)/2;
ymin:=a*sin(b*x+c)+d*exp(f*x) ;
Label9.Caption:=FloatToStr(x)+' '+FloatToStrf(ymin,fffixed,6,4);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.Show;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
a:=StrToFloat(Edit1.text);
b:=StrToFloat(Edit2.text);
c:=StrToFloat(Edit3.text);
d:=StrToFloat(Edit4.text);
f:=StrToFloat(Edit5.text);
x1:=StrToFloat(Edit6.text);
x2:=StrToFloat(Edit7.text);
eps:=StrToFloat(Edit8.text);
repeat
x:=(x1+x2)/2;
y1:= a*sin(b*(x-eps)+c)+d*exp(f*(x-eps));
y2:= a*sin(b*(x+eps)+c)+d*exp(f*(x+eps));
if y1>y2 then x2:=x else x1:=x;
until abs(x2-x1) < eps;
x:=(x1+x2)/2;
ymin:=a*sin(b*x+c)+d*exp(f*x) ;
Label12.Caption:=FloatToStr(x)+' '+FloatToStrf(ymin,fffixed,6,4);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Form1.Close();
Form2.Close();
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
AssignFile(fi, 'data.mp');
Reset(fi); // открыть для чтения
begin
readln(fi, buf);
Edit1.text:=buf;
readln(fi, buf);
Edit2.text:=buf;
readln(fi, buf);
Edit3.text:=buf;
readln(fi, buf);
Edit4.text:=buf;
readln(fi, buf);
Edit5.text:=buf;
readln(fi, buf);
Edit6.text:=buf;
readln(fi, buf);
Edit7.text:=buf;
readln(fi, buf);
Edit8.text:=buf;
end;
CloseFile(fi);
end;
end.
Построение графика
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
bb,ff:real;
implementation
uses Unit1;
{$R *.dfm}
Function f(x:real):real;
begin
a:=StrToFloat(form1.Edit1.text);
bb:=StrToFloat(form1.Edit2.text);
c:=StrToFloat(form1.Edit3.text);
d:=StrToFloat(form1.Edit4.text);
ff:=StrToFloat(form1.Edit5.text);
f:=a*Sin(bb*x+c)+d*exp(x*ff);
end;
procedure GrOfFunc;
var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
x:real; // аргумент функции
y:real; // значение функции в точке x
dx:real; // приращение аргумента
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
x0,y0:integer; // точка - начало координат
begin
// область вывода графика
l:=10; // X - координата левого верхнего угла
b:=Form2.ClientHeight-20; // Y - координата левого верхнего угла
h:=Form2.ClientHeight-40; // высота
w:=Form2.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
x2:=10; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); // максимум
x:=x1;
repeat
y := f(x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx;
until (x>=x2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
// оси
x0:=l;
y0:=b-Abs(Round(y1*my));
with form2.Canvas do
begin
// оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
{TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));}
// построение графика
x:=x1;
repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x>=x2);
end;
end;
procedure TForm2.FormPaint(Sender: TObject);
begin
GrOfFunc;
end;
procedure TForm2.FormResize(Sender: TObject);
begin
// очистить форму
form2.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
end.
Руководство пользователя по работе с программой
1. Для работы программы необходимо наличие ПК с установленной операционной системой WINDOWS _XP и выше.
2. Для запуска приложения достаточно загрузить Project1.exe из папки «Вариант 22».
3. Приложение имеет интуитивно-понятный интерфейс. Все функции, реализуемые приложением, привязаны к объектам управления формы.
4. Ввод данных производится с помощью непосредственного ввода данных в соответствующие подписанные поля или из файла
5. Для расчета экстремумов функции на заданном интервале необходимо нажать на соответствующие кнопки.
6. Для получения графика функции необходимо нажать на соответствующую кнопку «График»
7. Для сброса данных необходимо нажать кнопку «Очистить»
8. Для выхода из приложения необходимо нажать кнопку «Выход».
Примеры работы программы
Размещено на Allbest.ru
...Подобные документы
Разработка программного обеспечения для решения нелинейного уравнения методом деления отрезка пополам, методом деления Гаусса. Алгоритм определения и методика уточнения корней. Составление и тестирование программы, ее листинг и оценка эффективности.
контрольная работа [638,0 K], добавлен 16.12.2013Сравнение методов деления отрезка пополам, хорд, касательных и итераций, поочередно используя их для решения одного и того же уравнения. Построение диаграммы и графика изменения числа. Исследование алгоритма работы программы, перечня идентификаторов.
курсовая работа [1,3 M], добавлен 06.08.2013Метод установления границ начального отрезка локализации минимума. Метод золотого сечения. Оценивание точки минимума внутри найденного отрезка локализации. Программная реализация метода Свенна на языке C++. Текст программы нахождения точки минимума.
контрольная работа [47,3 K], добавлен 27.01.2011Методы решения нелинейных уравнений: прямые и итерационные. Методы решения трансцендентных, алгебраических уравнений. Метод деления отрезка пополам, Ньютона, простой итерации. Поиск корня уравнения методом простой итерации с помощью электронных таблиц.
контрольная работа [2,4 M], добавлен 16.12.2011Расчет максимальной мощности двигателя автомобиля и расчет внешней характеристики двигателя. Вычислить функцию. Метод деления отрезка пополам на данном интервале и найти с точностью корни уравнения. Вычислить определенный интеграл методом прямоугольников.
курсовая работа [233,8 K], добавлен 13.02.2007Метод численного интегрирования. Использование метода половинного деления для решения нелинейного уравнения. Определение отрезка неопределенности для метода половинного деления. Получение формулы Симпсона. Уменьшение шага интегрирования и погрешности.
курсовая работа [3,0 M], добавлен 21.05.2013Решение системы линейных уравнений методами деления отрезка пополам, Гаусса и подбора параметров. Формализация задач при моделировании; построение математических, алгоритмических и программных моделей задач с помощью электронных таблиц Microsoft Excel.
лабораторная работа [1,4 M], добавлен 21.07.2012Выбор наиболее эффективного метода поиска экстремума для функции. Оценка погрешности определения точки минимума. Проверка унимодальности уравнения аналитическим методом и по графику. Сравнение алгоритмов по количеству обращений к функции и по точности.
контрольная работа [909,0 K], добавлен 14.08.2019Описание математической модели. Обоснование метода реализации. Вид алгоритма и программы. Руководство системного программиста, оператора. Комбинирование метод хорд и касательных. Интерпретация и анализ результатов. Листинг программы, контрольный пример.
курсовая работа [3,3 M], добавлен 12.01.2014Математическое описание, алгоритм и программа вычисления нелинейного уравнения методом дихотомии. Метод половинного деления. Метод поиска корней функции. Написание текста программы с комментариями. Проведение тестовых расчетов. Вывод ответа на экран.
курсовая работа [67,2 K], добавлен 15.02.2016Необходимые условия экстремума. Разработка машинного алгоритма и программы многомерной оптимизации для градиентного метода с использованием метода равномерного поиска. Проверка необходимых и достаточных условий экстремума для найденной точки минимума.
курсовая работа [249,8 K], добавлен 25.09.2013Особенности точных и итерационных методов решения нелинейных уравнений. Последовательность процесса нахождения корня уравнения. Разработка программы для проверки решения нелинейных функций с помощью метода дихотомии (половинного деления) и метода хорд.
курсовая работа [539,2 K], добавлен 15.06.2013Построение графика функции. Поиск корней уравнения методом половинного деления. Определение минимума функции методом перебора и значения аргумента. Вычисление определенного интеграла на заданном отрезке с использованием метода правых прямоугольников.
контрольная работа [316,1 K], добавлен 13.11.2014Ознакомление с методами решения оптимизационных задач. Алгоритм метода ломанных. Определение наименьшего значения целевой функции. Описание метода анализа математической модели. Расчет поиска минимума по методу ломаных. Листинг программы, интерфейс.
курсовая работа [2,2 M], добавлен 06.12.2014Процесс и порядок написания программы, реализующей графическое решение логической задачи (игры). Обзор аналогичных продуктов. Описание и алгоритм решения задачи. Структура программы, ее процедуры и функции. Настройка и руководство для пользователя.
курсовая работа [35,7 K], добавлен 29.06.2010Решение задачи на тему максимизации функций многих переменных. Описание метода дихотомии, его применение для решения нелинейных уравнений. Решение данной задачи с использованием метода покоординатного спуска. Составление алгоритмов, листинг программы.
курсовая работа [138,5 K], добавлен 01.10.2009Тестирование модуля отыскания корня уравнения методом половинного деления. Схема алгоритма тестирующей программы. Численное интегрирование по методу Симпсона с оценкой погрешности по правилу Рунге. Проверка условий сходимости методов с помощью MathCAD.
курсовая работа [1,1 M], добавлен 04.02.2011Обзор элементов языка программирования Паскаль, решение задач путем использования численных методов на компьютере. Алгоритм нахождения интеграла функции с помощью метода прямоугольников. Комплекс технических средств, необходимых для решения задачи.
контрольная работа [36,6 K], добавлен 07.06.2010Математическое описание численных методов решения уравнения, построение графика функции. Cтруктурная схема алгоритма с использованием метода дихотомии. Использование численных методов решения дифференциальных уравнений, составление листинга программы.
курсовая работа [984,2 K], добавлен 19.12.2009Описание методов дихотомии (половинного деления) и касательных. Их применение для решения нелинейных уравнений. Графическое отделение корней. Блок-схемы алгоритмов. Тексты (листинги) программ на языке Delphi. Тестовый пример решения задачи с помощью ЭВМ.
курсовая работа [944,6 K], добавлен 15.06.2013