Численное решение и программная реализация задачи о провисании цепи

Автор работы: Пользователь скрыл имя, 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 Тестирование программы
Заключение
Список использованных источников и литературы
Приложение А Листинг программы «Задача о провисании цепи»
Приложение Б Листинг программы «Метод Ньютона – Рафсона»

Вложенные файлы: 1 файл

Габдрахимова М41.docx

— 410.50 Кб (Скачать файл)

Логические операции могут комбинироваться с помощью  связок:

  • and (логическое И);
  • or (логическое ИЛИ);
  • xor (исключающее ИЛИ).

Константа – это область памяти, содержащая определённое значение, но значение остаётся на весь период существования константы. При определении константы тип данных не указывается. Константа определяется в разделе 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<1.2x+4<1, т.е. – 1.16<x<0.5;
  • из второго уравнения – <x< , т.е. – 1.12<x<1.12.

Таким образом, – 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.

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

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

 

 

 

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ

 

  1. Абрамов, С.А., Зима, Е.В., Начала программирования / Е. В. Зима. Изд. – М.: Наука, 1987. – 112 с.
  2. Демидович, Б.П., Марон, И.А., Основы вычислительной математики / Б.П. Демидович. Изд. – Москва «Наука», 1970. – 305с.
  3. Васильков, Ф.В., Василькова, Н.Н., Компьютерные технологии вычислений вматематическом моделировании. Учеб. Пособие / Ф.В.Васильков. Изд. – М.: Финансы и статистика, 1999. – 125с.
  4. Вержбицкий, В.М., Численные методы (линейная алгебра и нелинейные уравнения) / В.М. Вержбицкий. Изд. – Москва, «Высшая школа», 2000. – 451с.
  5. Бахвалов, Н.С., Численные методы в задачах и упражнениях / Н.С.Бахвалов. Изд. – Москва, «Высшая школа», 2000. – 76с.
  6. Корн, Г., Корн, Т., Справочник по математике / Т. Корн. Изд. – М: Наука, 1984. – 324с.
  7. Фильчаков, П.Ф., Численные методы / П. Ф. Фильчаков. Изд. – Киев: Наукова думка, 1976. – 148с.
  8. Жидков, Кобельков, Численные методы / Жидков. Изд. – М: Наука, 1970. – 664с.
  9. Киреев, В.И., Пантелеев, А.В., Численные методы в примерах и задачах./ В.И. Киреев. Изд.  – М.: Высш. шк., 2004. – 480с.
  10. Дубровская, Н.С., Численные методы. / Н.С. Дубровская. Изд.: – М.: Наука, 2001. – 210с.
  11. Деннис, Дж., Шнабель Р., Численные методы безусловной оптимизации и решения нелинейных уравнений. / Дж. Шнабель. Изд. – М.: Мир, 1988. – 320с.
  12. Волков, Е.А., Численные методы / Изд. – М.: Наука, 1997. – 125с.

 

ПРИЛОЖЕНИЕ  А

 

Листинг программы «Задача о провисании цепи»

 

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:integer;

  implementation

{$R *.dfm}

function ReturnF(N:byte;X,Y,Z:double):double;{N - номер уравнения  в нелинейной системе}

begin

  if N = 1 then

    ReturnF := Y+(((exp(X/Z)+exp(-X/Z))/2)-1)-7

  else

    if N = 2 then

      ReturnF := Y+(((exp((30-X)/Z)+exp((30-X)/Z))/2)-1)-15

       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,'Введите правильное начальное  приближение','Ошибка',MB_OK+MB_ICONERROR);

   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((Y-Y0),2)+power((Z-Z0),2)),(1/2))) >= eps do

  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((Y-Y0),2)+power((Z-Z0),2)),(1/2))) <= eps  then

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,'Введите правильное начальное  приближение','Ошибка',MB_OK+MB_ICONERROR);

   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((Y-Y0),2)+power((Z-Z0),2)),(1/2))) >= eps do

  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((Y-Y0),2)+power((Z-Z0),2)),(1/2))) <= eps  then

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):double;{N - номер уравнения в нелинейной системе}

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+MB_ICONERROR);

   exit;

  end;

  {поехали...}

  X := ReturnF(1,Y0,X0);

  Y := ReturnF(2,Y0,X);

  CounterIter := 1;

  while (power((power((X-X0),2)+power((Y-Y0),2)),(1/2))) >= eps do

  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((Y-Y0),2)),(1/2))) <= eps  then

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));

Информация о работе Численное решение и программная реализация задачи о провисании цепи