Автор работы: Пользователь скрыл имя, 10 Января 2013 в 10:46, курсовая работа
В отличие от систем линейных уравнений для систем нелинейных уравнений не известны прямые методы решения. Лишь в отдельных случаях систему можно решить непосредственно. Например, для системы из двух уравнений иногда удается выразить одно неизвестное через другое и таким образом свести задачу к решению одного нелинейного уравнения относительно одного неизвестного. Поэтому итерационные методы для нелинейных систем приобретают особую актуальность.
Введение
1.Численные методы решений систем нелинейных уравнений
1.Решение систем нелинейных уравнений
2.Метод Ньютона–Рафсона
3Метод спуска
4.Метод простой итерации и метод Зейделя
2.Задача о провисании цепи
1.Постановка задачи
2.Вывод уравнения цепной линии
3.Вычисление длины плоской линии
3 Программная реализация решений задач
3.1 Программная реализация решения задачи о провисании цепи
3.1.1 Описание программы
3.1.2 Тестирование программы
3.2 Программная реализация метода Ньютона – Рафсона
3.2.1 Описание программы
3.2.2 Тестирование программы
Заключение
Список использованных источников и литературы
Приложение А Листинг программы «Задача о провисании цепи»
Приложение Б Листинг программы «Метод Ньютона – Рафсона»
Логические операции
могут комбинироваться с
Константа – это область памяти, содержащая определённое значение, но значение остаётся на весь период существования константы. При определении константы тип данных не указывается. Константа определяется в разделе const.
Программа позволяет решить систему двух нелинейных уравнений методом Ньютона – Рафсона.
3.2.2 Тестирование программы
Используя метод Ньютона, решить систему нелинейных уравнений с точностью до 0,002.
Таблица 1 – Значения функций, входящих в первое и второе уравнение
x |
-1,1 |
-1 |
-0,8 |
-0,6 |
-0,4 |
-0,2 |
0,2 |
0,4 |
0,5 |
x2 |
1,21 |
1 |
0,64 |
0,36 |
0,16 |
0,04 |
0,04 |
0,16 |
0,25 |
0.8x2 |
0,97 |
0,80 |
0,51 |
0,29 |
0,13 |
0,03 |
0,03 |
0,13 |
0,20 |
1-0.8x2 |
0,03 |
0,20 |
0,49 |
0,71 |
0,87 |
0,97 |
0,97 |
0,87 |
0,80 |
|
0,02 |
0,13 |
0,33 |
0,47 |
0,58 |
0,65 |
0,65 |
0,58 |
0,53 |
y2 |
0,15 |
0,37 |
0,57 |
0,69 |
0,76 |
0,80 |
0,80 |
0,76 |
0,73 |
1.2x |
-1,32 |
-1,2 |
-0,96 |
-0,72 |
-0,48 |
-0,24 |
0,24 |
0,48 |
0,6 |
0.4+1.2x |
-0,92 |
-0,8 |
-0,56 |
-0,32 |
-0,08 |
0,16 |
0,64 |
0,88 |
1 |
2x-y |
-1,17 |
-0,93 |
-0,59 |
-0,33 |
-0,08 |
0,16 |
0,69 |
1,08 |
1,57 |
y1 |
-1,03 |
-1,07 |
-1,01 |
-0,87 |
-0,72 |
-0,56 |
-0,29 |
-0,28 |
-0,57 |
Значения для x можно брать исходя из следующих условий:
Таким образом, – 1.12<x<0.5.
Система имеет два решения. Уточним одно из них, принадлежащее области D: 0.4<x<0.5; – 0.76<y<– 0.73.
За начальное приближение примем x0=0.4; y0= – 0.75.
Имеем следующие системы:
Найдем элементы матрицы Якоби , где , и значения функций в x0=0.4; y0= – 0.75:
F(0,4;– 0,75)=0,11978; G(0,4;-0,75)=– 0,02825.
где ; .
Итерационные формулы:
Таблица 2 – Значения вычислений
n |
xn |
0.8xn2 |
2xn-yn |
sin(2xn-yn) |
F(xn,yn) |
detW |
detW1 |
∆x | ||
yn |
1.5yn2 |
cos(2xn-yn) |
G(xn,yn) |
detW2 |
∆y | |||||
0 |
0,40000 |
0,12800 |
1,55000 |
0,99978 |
0,11978 |
-1,15841 |
-0,02079 |
2,61973 |
0,27010 |
0,10310 |
-0,75000 |
0,84375 |
0,02079 |
-0,02825 |
0,64000 |
-2,25000 |
0,04394 |
0,01677 | |||
1 |
0,50310 |
0,20249 |
1,73943 |
0,98581 |
-0,01791 |
-1,53568 |
0,16784 |
3,24291 |
-0,03790 |
-0,01169 |
-0,73323 |
0,80644 |
-0,16784 |
0,00893 |
0,80496 |
-2,19969 |
-0,00071 |
-0,00022 | |||
2 |
0,49142 |
0,19319 |
1,71628 |
0,98944 |
-0,00026 |
-1,48994 |
0,14497 |
3,16440 |
-0,00057 |
-0,00018 |
-0,73345 |
0,80692 |
-0,14497 |
0,00011 |
0,78627 |
-2,20034 |
-0,00005 |
-0,00001 | |||
3 |
0,49124 |
|||||||||
-0,73346 |
Так как δ<ε, то можно прекратить производить вычисления. Таким образом, ответ:
На рисунке (3.2) представлены вычисления системы нелинейного уравнения.
Рисунок 3.2 – Решение системы нелинейного уравнения
ЗАКЛЮЧЕНИЕ
В работе изучены методы приближенного решения системы нелинейных уравнений (метод Ньютона – Рафсона, метод спуска, метод простой итерации и метод Зейделя). Решена задача о провисании цепи. Разработана программа для решения полученной в задаче системы трех нелинейных уравнений.
Решив задачу, мы пришли к тому, что цепь провисает под действием тяжести, но величины свободного падения в формуле провисания цепи нет. Это значит, что любая цепь одинаково провисает (тяжелая стальная и тонкая нитка).
Для решения системы нелинейных уравнений в данной курсовой работе были использованы возможности языка Delphi. Решена задача о провисании цепи, проведены тестирование и отладка программы.
В ходе выполнения курсовой работы получены как теоретические, так и практические навыки работы в языке Delphi. Были углублены и закреплены знания по алгоритмизации, программированию в среде программирования Delphi.
В процессе создания программы и последующего тестирования было устранено большинство ошибок при трансляции, запуске и использовании программного продукта. Поэтому данная программа, реализующая алгоритм решения систем нелинейных уравнений методом простой итерации и методом Зейделя вполне может быть применена в более крупных проектах по реализации нескольких математических методов решения тех или иных задач. Интерфейс программы удобен и элементарно прост в обращении даже для тех, кто в первый раз имеет дело с подобным типом программ.
Также, исходя из проработанной литературы, сделан вывод о том, что данная тема изучалась и изучается многими авторами, как зарубежными, так и советскими, и находит практическое применение в различных науках.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ А
Листинг программы «Задача о провисании цепи»
unit RSNY;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtnrs, StdCtrls,Math, ExtCtrls;
type
TForm1 = class(TForm)
OleContainer1: TOleContainer;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Label6: TLabel;
Label7: TLabel;
Edit3: TEdit;
Label8: TLabel;
Label9: TLabel;
Edit4: TEdit;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Eps:double; X,Y,Z:double; CounterIter:word; X0,Y0,Z0:double;n,max_it:
implementation
{$R *.dfm}
function
ReturnF(N:byte;X,Y,Z:double):
begin
if N = 1 then
ReturnF := Y+(((exp(X/Z)+exp(-X/Z))/2)-1)
else
if N = 2 then
ReturnF := Y+(((exp((30-X)/Z)+exp((30-X)/
else
if N = 3 then
ReturnF := ((exp(X/Z)-exp(-X/Z))/2)-0.52
end;
//метод Зейделя
procedure TForm1.Button2Click(Sender: TObject);
begin
X:=0;
Y:=0;
Z:=0;
{вот такие начальные
X0 := StrToFloat(Edit1.Text);
Y0 := StrToFloat(Edit2.Text);
eps:= StrToFloat(Edit3.Text);
Z0 := StrToFloat(Edit4.Text);
if (X0>0.6) or (Y>0.6) or (Z>0.6) then
begin
MessageBox(0,'Введите
exit;
end;
{поехали...}
X := ReturnF(1,Y0,X0,Z0);
Y := ReturnF(2,Y0,X0,Z0);
Z := ReturnF(3,Y0,X0,Z0);
CounterIter := 1;
while (power((power((X-X0),2)+power(
begin
X0 := X;
Y0 := Y;
Z0 := Z;
X := ReturnF(1,Y0,X0,Z0);
Y := ReturnF(2,Y0,X0,Z0);
Z := ReturnF(3,Y0,X0,Z0);
inc(CounterIter);
end;
Memo1.Clear;
if (power((power((X-X0),2)+power(
begin
Memo1.Lines.Add('Заданная точность достигнута');
end else
begin
Memo1.Lines.Add('Заданная точность не достигнута');
end;
Memo1.Lines.Add('Количество итераций: '+IntToStr(CounterIter));
Memo1.Lines.Add('X0
= '+FloatToStrF(x,ffgeneral,5,8)
Memo1.Lines.Add('H
= '+FloatToStrF(y,ffgeneral,5,8)
Memo1.Lines.Add('a
= '+FloatToStrF(y,ffgeneral,5,8)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:=FloatToStr(0);
Edit2.Text:=FloatToStr(0);
Edit4.Text:=FloatToStr(0);
Edit3.Text:=FloatToStr(0.001);
end;
//метод итераций
procedure TForm1.Button1Click(Sender: TObject);
begin
X:=0;
Y:=0;
Z:=0;
{вот такие начальные
X0 := StrToFloat(Edit1.Text);
Y0 := StrToFloat(Edit2.Text);
Z0 := StrToFloat(Edit4.Text);
eps:= StrToFloat(Edit3.Text);
if (X0>0.6) or (Y>0.6) or (Z>0.6) then
begin
MessageBox(0,'Введите
exit;
end;
{поехали...}
X := ReturnF(1,Y0,X0,Z);
Y := ReturnF(2,Y0,X0,Z0);
Z := ReturnF(3,Y0,X0,Z0);
CounterIter := 1;
while (power((power((X-X0),2)+power(
begin
X0 := X;
Y0 := Y;
Z0 := Z;
X := ReturnF(1,Y0,X0,Z0);
Y := ReturnF(2,Y0,X0,Z0);
Z := ReturnF(3,Y0,X0,Z0);
inc(CounterIter);
end;
Memo1.Clear;
if (power((power((X-X0),2)+power(
begin
Memo1.Lines.Add('Заданная точность достигнута');
end else
begin
Memo1.Lines.Add('Заданная точность не достигнута');
end;
Memo1.Lines.Add('Количество итераций: '+IntToStr(CounterIter));
Memo1.Lines.Add('X0
= '+FloatToStrF(x,ffgeneral,5,8)
Memo1.Lines.Add('H
= '+FloatToStrF(y,ffgeneral,5,8)
Memo1.Lines.Add('a
= '+FloatToStrF(y,ffgeneral,5,8)
end;
//"защита от дурака"
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in['0'..'9', #8, '-', ',']) then key:=#0;
end;
end.
ПРИЛОЖЕНИЕ Б
Листинг программы «Метода Ньютона – Рафсона»
unit RSNY2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtnrs, StdCtrls,Math;
type
TForm1 = class(TForm)
OleContainer1: TOleContainer;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Label6: TLabel;
Label7: TLabel;
Edit3: TEdit;
Label8: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Eps:double; X,Y:double; CounterIter:word; X0,Y0:double;n,max_it:integer;
implementation
{$R *.dfm}
function
ReturnF(N:byte;X,Y:double):
begin
if N = 1 then
ReturnF := sin(2*X*Y)-1.2*X-0.4
else
if N = 2 then
ReturnF := 0.8*X*X+1.5*Y*Y-1
end;
//метод Зейделя
procedure TForm1.Button2Click(Sender: TObject);
begin
X:=0;
Y:=0;
{вот такие начальные
X0 := StrToFloat(Edit1.Text);
Y0 := StrToFloat(Edit2.Text);
eps:= StrToFloat(Edit3.Text);
if (X0>0.6) or (Y>0.6)then
begin
MessageBox(0,'Введите правильное начальное
приближение','Ошибка',MB_OK+
exit;
end;
{поехали...}
X := ReturnF(1,Y0,X0);
Y := ReturnF(2,Y0,X);
CounterIter := 1;
while (power((power((X-X0),2)+power(
begin
X0 := X;
Y0 := Y;
X := ReturnF(1,Y0,X0);
Y := ReturnF(2,Y0,X);
inc(CounterIter);
end;
Memo1.Clear;
if (power((power((X-X0),2)+power(
begin
Memo1.Lines.Add('Заданная точность достигнута');
end else
begin
Memo1.Lines.Add('Заданная точность не достигнута');
end;
Memo1.Lines.Add('Количество итераций: '+IntToStr(CounterIter));
Memo1.Lines.Add('X
= '+FloatToStrF(x,ffgeneral,5,8)
Memo1.Lines.Add('Y
= '+FloatToStrF(y,ffgeneral,5,8)
Информация о работе Численное решение и программная реализация задачи о провисании цепи