Автор работы: Пользователь скрыл имя, 07 Ноября 2012 в 09:28, курсовая работа
Часто приходится находить корни уравнений вида , где f(x) определена и непрерывна на некотором интервале.
Если f(x) представляет собой многочлен, то уравнение - алгебраическое, если в функцию входят функции типа: тригонометрических, логарифмических, показательных и т.п., то уравнение называется трансцендентным.
ВВЕДЕНИЕ 2
ГЛАВА 1. ИССЛЕДОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ 3
1.1.Предпроектное обследование 3
1.2.Методы решения нелинейного уравнения 3
ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ «РЕШЕНИЕ СИСТЕМЫ НЕЛИНЕЙНЫХ УРАВНЕНИЙ» 5
2.1.Постановка задачи 5
2.2.Функциональная структура программа 5
2.3. Математическое обеспечение программы 6
2.4. Разработка алгоритма программы 7
2.5. Описание пользовательского интерфейса 11
2.6. Техническое обеспечение программы 13
ЗАКЛЮЧЕНИЕ 14
ПЕРЕЧЕНЬ ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 15
ПРИЛОЖЕНИЕ А 16
СОДЕРЖАНИЕ
Данный проект разработан для вычисления корней нелинейного уравнения методом итераций. Программа написана на языке высокого уровня Delphi.
……
Пояснительная записка состоит из следующих разделов: теоретическая часть – теория, описывающая правила вычисления коней нелинейного уравнения методом итераций, а также блок-схема метода, и практической реализации - создание и описание элементов (частей) из которых состоит данная программа, последовательный показ работы проекта на вычисление корней уравнения методом итераций, сравнение результатов программы с решением в математическом пакете Mathcad 14.
Часто приходится находить корни уравнений вида , где f(x) определена и непрерывна на некотором интервале.
Если f(x) представляет собой многочлен, то уравнение - алгебраическое, если в функцию входят функции типа: тригонометрических, логарифмических, показательных и т.п., то уравнение называется трансцендентным.
Решение уравнения вида разбивается на два этапа:
Первый этап более сложный, в этом случае может помочь построение приближенного графика функции с анализом на монотонность, смену знака, выпуклость и т.д.
Для вычисления выделенного корня существует множество методов, например:
На рисунке 1 представлен график функции y=x-2+sin(1/x)
Рисунок 1 - График функции y=x-2+sin(1/x)
В данной курсовой работе будет рассмотрено нахождение корней уравнения x-2+sin(1/x)=0 методом итераций.
Уравнение можно представить в виде: . То есть
x-2+sin(1/x)=0→ x=2-sin(1/x)
Далее на отрезке [a,b], где функция имеет корень, выбирается произвольная точка x0 и далее последовательно вычисляется:
Процесс вычисления значений xk называется итерационным процессом.
Если на отрезке [a,b] выполнено условие |φ΄(x)| ≤ q <1, то итерационный процесс сходится к корню уравнения .
Если необходимо вычислить корень с точностью ε, то процесс итераций продолжается до тех пор, пока для двух последовательных приближений xn и xn-1 не будет выполнено:
,
где ε задается погрешностью корня x*.
Соответственно описанной выше методике составим блок–схему решения уравнения методом итераций[2].
Для вычисления корней уравнения используется подпрограмма – функция iter(x0,xk,eps:real): real. Она составлена по блок схеме представленной выше (1 теоритическая часть). Функции нужно сообщить начало и конец промежутка, результат функции корень уравнения;
function iter(x0,xk,eps:real): real;
var
x1,y,d,j:real;
begin
x1:=x0;
repeat
if (fnsh(x1)<1)then begin
y:=form1.fn(x1);
d:=abs(y-x1);
x1:=y;
end else begin
j:=messagedlg('Задайте другое
break;
end;
until (d<=eps)or (x1>=xk);
if x1>=xk then
j:=messagedlg('На заданном промежутке корней нет!',mtinformation,[mbok],0)
else
iter:=y;
end;
Уравнение задано подпрограммой – функцией tform1.fn(x:real): real
function tform1.fn(x:real): real;
begin
fn:=2-sin(1/x);
end;
Производная задана подпрограммрй – функцией fnsh(x:real): real;
function fnsh(x:real): real;
begin
fnsh:=cos(1/x)/sqr(x);
end;
В обоих случаях начальные данные это значение переменной x. В первом случае результат значение функции, во втором значение производной функции.
В главном окне выберем пункт меню «Визуализация»;
Перед нами появляется окно, где демонстрируется график функции, изоброженного красным цветом, при этом предусмотрена возможность визуализации итерационного процесса, зеленым цветом, посредством нажатия кнопки «Итерации».
Построение графика
procedure TForm2.FormCreate(Sender: TObject);
var
i:real;
begin
series1.Clear;
Series2.Clear;
i:=1;
While i<=1.5 do begin
if i<>0 then
series1.AddXY(i,i-2+sin(1/i),'
i:=i+0.0001;
end;
end;
График строится в момент создания Form2. Построение ведется на промежутке от 1 до 1,5. В цикле переменная i меняется в этих пределах с шагом 0,0001, и строится график от значения переменной i.
При нажатии кнопки итерации выполнятся следующий код:
procedure TForm2.Button1Click(Sender: TObject);
begin
x1:=strtofloat(form1.
xk :=strtofloat(form1.
eps:=strtofloat(form1.
series2.Clear;
Timer1.Enabled:=true;
end;
После чего запускается таймер, который повторяет свои действия через определенный промежуток времени.
procedure TForm2.Timer1Timer(Sender: TObject);
begin
y:=form1.fn(x1);
series2.AddXY(x1,y-x1,'',
d:=abs(y-x1);
x1:=y;
if d<eps then timer1.Enabled:=false;
end;
Здесь строится итерационная кривая, показывающая последовательное приближение к корню уравнения до определенной точности. Основой кода построения итерационной кривой является блок – схема из теоретической части.
Запуская программу, появляется заставка:
Рисунок 2 - Заставка
Спустя 2 секунды окно заставки закрывается и появляется главное окно программы:
Рисунок 3. - Главное окно
На нем, как и задумывалось, обозначены: главное меню состоящее из пунктов «Визуализация», «Титульный лист», «Выход», а также поля «Начало промежутка», «Конец промежутка», «Точность», а также поле «Корень», в которое после нажатия кнопки «Решение» будет выводится ответ.
Выбирая «Титульный лист», открывается окно, из которого узнаем о назначении программы, ее разработчике, а так же о проверяющем преподавателе.
Рисунок 4 - Титульный лист.
В поля, расположенные в главном окне вводим соответствующие их названию данные, после чего нажимаем кнопку «Решение» и получаем результат. В программном коде предусмотрена обработка исключительных ситуаций, при возникновении которых выводится информационное окно с рекомендациями по устранению возникших неполадок.
Выбирая пункт меню «Исследование», мы открываем окно, где приведены результаты решения уравнения в математическом пакете Mathcad 14 и в созданной мной программе, а также разность этих значений:
Рисунок 5 - Исследование
Результаты записываются в текстовый Файл «issled.txt»
Выбирая пункт меню «Визуализация», отображается график уравнения и при нажатии кнопки итнрации отображается итерационная кривая:
Рисунок 6 - Визуализация.
Сначала создадим главное окно программы, без которой нам никак нельзя обойтись [1]. Сделаем в нем главное меню, состоящее из пунктов «Визуализация», «Исследование», «Титульный лист», «Выход». Далее нам будет необходимы поля для ввода и вывода данных, создадим поля «Начало промежутка», «Конец промежутка», «Точность», а так же поле «Корень», в которое после нажатия кнопки «Решение» будет выводиться ответ. Это окно будет являться опорным пунктом для наших дальнейших действий. Обозначим его как Form1.(Рис. 2)
Рисунок 7 - Form1
Далее, создадим другие «формы» для последующей работы, на которые в дальнейшем просто будем ссылаться:
· окно для визуализации метода итераций – Form2. Выводится при выборе пункта меню «Визуализация»:
Рисунок 8 - Form2
При нажатии на кнопку «Итерации» появится график, отражающий итерационный процесс
· окно заставки, появляющееся при запуске программы – Form3:
Рисунок 9 - Form3
· окно титульного листа – Form4:
Рисунок 10 - Form4
Теперь, после того как мы создали все необходимые формы, можем приступать к создании программного кода, в котором будем ссылаться на каждую из них [4]. В этом коде нам необходимо будет:
¾ для Form1 - обеспечить безошибочное подключение ко всем остальным формам.
¾ для Form2 -обеспечить вывод графика и визуализацию итерационного процесса.
¾ для Form3, Form4- включить в программу.
Разработан проект по вычислению корней нелинейных уравнений методом итераций, в среде программирования Delphi.
Спроектирован интерфейс программы и написан программный код на языке высокого уровня.
Проведена визуализация метода.
Также произведен вычислительный эксперимент и сравнение результатов решения полученных в математическом пакете Mathcad 14 и методом итераций. При подстановке в уравнение полученных корней значения функции более близки к нулю у корня, полученного в Mathcad 14, но стоит отметить, что значения корня совпадают до заданной точности.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ImgList, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
N4: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
function fn(x:real):real;
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit4, Unit5;
{$R *.dfm}
function tform1.fn(x:real): real;
begin
fn:=2-sin(1/x);
end;
function fnsh(x:real): real;
begin
fnsh:=cos(1/x)/sqr(x);
end;
function iter(x0,xk,eps:real): real;
var
x1,y,d,j:real;
begin
x1:=x0;
repeat
if (fnsh(x1)<1)then begin
y:=form1.fn(x1);
d:=abs(y-x1);
x1:=y;
end else begin
j:=messagedlg('Çàäàéòå äðóãîå
íà÷àëî ïðîìåæóòêà',
break;
end;
until (d<=eps)or (x1>=xk);
if x1>=xk then
j:=messagedlg('Íà çàäàííîì ïðîìåæóòêå êîðíåé íåò!',mtinformation,[mbok],0)
else
iter:=y;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:word;
f:Textfile;
begin
LabeledEdit4.Text:='';
if (LabeledEdit1.Text='')or(
i:=messagedlg('Íà÷àëî è êîíåö ïðîìåæóòêà'+#10#13+'äîëæíû áûòü îòëè÷íû îò íóëÿ',mtwarning,[mbok],0)
else LabeledEdit4.Text:=floattostr(
form5.StringGrid1.Cells[1,1]:=
form5.StringGrid1.Cells[1,2]:=
form5.StringGrid1.Cells[2,1]:=
form5.StringGrid1.Cells[2,2]:=
assignfile(f,'issled.txt');
rewrite(f,'issled.txt');
writeln(f, '
'+ form5.StringGrid1.Cells[1,0]+'
writeln(f, form5.StringGrid1.Cells[0,1]+' '+form5.StringGrid1.Cells[1,1]
writeln(f, form5.StringGrid1.Cells[0,2]+'
closefile(f);
end;
procedure TForm1.N1Click(Sender: TObject);
var
i:word;
begin
form4.show;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
form2.showmodal;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
form5.show;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeEngine, TeeFunci, Series, TeeProcs, Chart, StdCtrls;
type
TForm2 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
TeeFunction1: TAddTeeFunction;
Series2: TLineSeries;
Button1: TButton;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;