49800

Нахождение корней нелинейного уравнения

Курсовая

Информатика, кибернетика и программирование

Блок-схемы реализующие численные методы -для метода дихотомии: Блок-схема для метода хорд: Блок-схема для метода Ньютона: Листинг программы unit Unit1; interfce uses Windows Messges SysUtils Vrints Clsses Grphics Controls Forms Dilogs TeEngine Series ExtCtrls TeeProcs Chrt Menus OleCtnrs StdCtrls xCtrls OleCtrls VCF1 Mth; type TForm1 = clssTForm GroupBox1: TGroupBox; OleContiner2: TOleContiner; MinMenu1: TMinMenu; N1: TMenuItem; Chrt1: TChrt; Series1:...

Русский

2014-01-08

3.95 MB

119 чел.

РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ НЕФТИ И ГАЗА им. И.М. ГУБКИНА

Кафедра информатики

Курсовая работа

по дисциплине «Информатика».                                                                                        

Тема: «Нахождение корней нелинейного уравнения»

Выполнил: студентка

Манепова А. М

группы: ГИ-12-05

Проверил:

                                                 Москва, 2013


Оглавление

[1]  

[2]
Задание на выполнение курсовой работы.

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

[4]                           1. Метод половинного деления (дихотомии)

[4.1] 2.Метод хорд

[4.2] 3. Метод Ньютона

[4.3] Расчеты в математическом пакете Mat lab

[5]
Отчет о результатах вычисления приближенного значения корня уравнения в MS Excel.  

[5.1] Результаты расчета с использованием Побора Параметра

[5.2]
Результаты расчета с использованием Поиска Решений

[6]
Описание приложения созданного в среде Delphi.

[6.1]
Блок – схемы реализующие численные методы

[6.2] Листинг программы

[6.3]
Изображение окна приложения

[7]
Анализ полученных результатов

[8]
Литература.

 


Задание на выполнение курсовой работы.

  1.  расчет, выполненный в математическом пакете Matlab (Mathematica 5.) (файл-функция для описания нелинейного уравнения, график, решение в символьном и численном виде).
  2.  Нахождение корней нелинейного уравнения  в электронных таблицах MS Excel (вид нелинейного уравнения, график нахождения корней нелинейного уравнения, найти корень нелинейного уравнения, используя средства условного анализа: «Побор параметра», «Поиск решения»).
  3.  Создание приложения для нахождения корней нелинейного уравнения в среде Delphi (вид нелинейного уравнения, график на заданном интервале, для каждого метода: результаты табулирования функции на заданном интервале с заданным шагом,  для каждого метода численного метода пользовательскую подпрограмму с передачей параметров). Результаты отобразить на форме в виде таблицы и в файле. Предусмотреть изменение точности значения (Е <= 0,001).
  4.  вид уравнения  


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

Пусть задана функция , непрерывная вместе со своими несколькими производными. Требуется найти все или некоторые вещественные корни уравнения

.
Данная задача распадается на несколько подзадач. Во-первых, необходимо определить количество корней, исследовать их
 характер и расположение. Во-вторых, найти приближенные значения корней. В-третьих, выбрать из них интересующие нас корни и вычислить их с требуемой точностью e. Первая и вторая задачи решаются, как правило, аналитическими или графическими методами. В случае, когда ищутся только вещественные корни уравнения, полезно составить таблицу значений функции . Если в двух соседних узлах таблицы функция имеет разные знаки, то между этими узлами лежит нечетное число корней уравнения (по меньшей мере, один). Если эти узлы близки, то, скорее всего, корень между ними только один. 
Найденные приближенные значения корней можно уточнить с помощью различных итерационных методов.

Рассмотрим три метода: 1) метод дихотомии (или деление отрезка пополам); 2) метод простой итерации и 3) метод Ньютона. 

                          1. Метод половинного деления (дихотомии) 

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

2.Метод хорд

При решении нелинейного уравнения методом хорд задаются интервалы [a,b], на котором существует только одно решение, и точность Ɛ. Затем через две точки с координатами (a,F(a)) и (b,F(b)) проводим отрезок прямой линии (  хорду) и определяем точку пересечения этой линии с осью абцисс. Ели при этом F(a)*F(b) <0, то праву границу интервала пееносиим в точку x (b=x). Если указанное условие не выполняется, то в точку x переносится левая граница интервала (a=x). Поиск решения пекращается при достижении заданной точности |F(x)|>Ɛ. Вычисления ведутся до тех пор, пока не выполнится неравенство: .  Итерационная формула метода хорд имеет вид:

3. Метод Ньютона

 

Чтобы численно решить уравнение  методом простой итерации, его необходимо привести к следующей форме: , где  — сжимающее отображение.

Для наилучшей сходимости метода в точке очередного приближения  должно выполняться условие . Решение данного уравнения ищут в виде , тогда:

В предположении, что точка приближения «достаточно близка» к корню , и что заданная функция непрерывна , окончательная формула для  такова:

С учётом этого функция  определяется выражением:

Эта функция в окрестности корня осуществляет сжимающее отображение[1], и алгоритм нахождения численного решения уравнения  сводится к итерационной процедуре вычисления:

Расчеты в математическом пакете Mat lab

В математическом пакете по условию задания был построен график функции и найден корень уравнения с использование символьного решения(solve) и в численном виде используя встроенные функции: fzero и fsolve. Для описания моей функции использовала файл-функцию.

На следующем рисунке представлен графи функции:


Для записи команд использовала
M-файл:


В командном окне были получены следующие результаты:

r1 =

-8

r2 =

   -8

r3 =

   -8

r4 =

  -8.0000

r5 =

  -7.9979   -8.0000


Отчет о результатах вычисления приближенного значения корня уравнения в MS Excel.  

MS Excel  был проведен расчет приближенного значения корня уравнения с помощью встроенных возможностей «Подбор параметров» и «Поиск решений». Для выбора начального приближения предварительно мной была построена диаграмма.

Результаты расчета с использованием Побора Параметра

В качестве начального приближения был выбран x=-9 (исходя из диаграммы)

В результате использования Подбора Параметра был найден корень x=-8,01.


Результаты расчета с использованием Поиска Решений

В качестве начального приближения был выбран x=-9 (исходя из диаграммы)


После выполнения был получен следующий результат:

Поиск решения дал мне значение x= -8,00002


Описание приложения созданного в среде Delphi.

При создании приложения в среде Delphi в интерфейсе был предусмотрен вывод вида функции и графика. Нахождение корня нелинейного уравнения было реализовано с использование трех методов: Метод дихотомии, Метод Хорд и Метод Ньютона. В отличии от расчета в Excel,  где корни находились с помощью подбора параметров и поиска решения, в программе предусмотрен ввод точности вычисления пользователем. Результаты расчета выводятся как в окно приложения так и в текстовый файл.  


Блок – схемы реализующие численные методы

Блок-схема для метода дихотомии:


Блок-схема для метода хорд:


Блок-схема для метода Ньютона:


Листинг программы

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Menus, OleCtnrs,

 StdCtrls, AxCtrls, OleCtrls, VCF1, Math;

type

 TForm1 = class(TForm)

   GroupBox1: TGroupBox;

   OleContainer2: TOleContainer;

   MainMenu1: TMainMenu;

   N1: TMenuItem;

   Chart1: TChart;

   Series1: TPointSeries;

   N2: TMenuItem;

   N3: TMenuItem;

   N4: TMenuItem;

   N5: TMenuItem;

   Label1: TLabel;

   Edit1: TEdit;

   GroupBox2: TGroupBox;

   GroupBox3: TGroupBox;

   GroupBox4: TGroupBox;

   Label2: TLabel;

   Label3: TLabel;

   Edit2: TEdit;

   Edit3: TEdit;

   Edit4: TEdit;

   Label4: TLabel;

   Edit5: TEdit;

   Label5: TLabel;

   Edit7: TEdit;

   Label7: TLabel;

   F1Book1: TF1Book;

   F1Book2: TF1Book;

   F1Book3: TF1Book;

   F1Book4: TF1Book;

   procedure N1Click(Sender: TObject);

   procedure N3Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure N4Click(Sender: TObject);

   procedure N5Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

const

xmin:real=-20;

xmax:real=20;

var

 Form1: TForm1;

 x,y,t,a,b,cor:real;

 i,n:integer;

 fail:textfile;

implementation

{$R *.dfm}

function f(x:real):real;

begin

f:=(8+x)/(x*sqrt(sqr(x)-4));

end;

function f1(x:real):real;

begin

f1:=(-power(x,3)-16*x*x+32)/(x*X*sqrt(power(x*x-4,3)));

end;

procedure metoddix(ta,tb,eps:real;var xk:real;var kolvo: integer);

begin

kolvo:=0;

repeat

xk:=(ta+tb)/2;

kolvo:=kolvo+1;

Form1.F1book1.NumberRC[kolvo,1]:=xk;

Form1.F1book1.NumberRC[kolvo,2]:=f(xk);

if f(ta)*f(xk)<0 then tb:=xk

else ta:=xk;

until (abs(f(xk))<=eps);

end;

procedure metodhord(ta,tb,eps:real;var xk:real;var kolvo: integer);

begin

kolvo:=0;

repeat

xk:= ta-f(ta)*(ta-tb)/(f(ta)-f(tb));

kolvo:=kolvo+1;

Form1.F1book2.NumberRC[kolvo,1]:=xk;

Form1.F1book2.NumberRC[kolvo,2]:=f(xk);

if f(ta)*f(xk)<0 then tb:=xk

else ta:=xk;

until (abs(f(xk))<=eps);

end;

procedure metodnyutona(ta,eps:real;var xk:real;var kolvo: integer);

begin

kolvo:=0;

repeat

xk:= ta-f(ta)/f1(ta);

ta:=xk;

kolvo:=kolvo+1;

Form1.F1book3.NumberRC[kolvo,1]:=xk;

Form1.F1book3.NumberRC[kolvo,2]:=f(xk);

until (abs(f(xk))<=eps);

end;

procedure TForm1.N1Click(Sender: TObject);

begin

x:=xmin;

i:=0;

while x<=xmax do

begin

if abs(x)>5 then

 begin

 i:=i+1;

 y:=f(x);

 series1.Addxy(x,y);

 F1book4.NumberRC[i,1]:=x;

 F1book4.NumberRC[i,2]:=y;  

 end;

x:=x+0.5;

end;

end;

procedure TForm1.N3Click(Sender: TObject);         //Вычисление корня методом половинного деления

begin

F1book1.ClearRange(1,1,100,2,3);

t:=strtofloat(Edit1.Text);

a:=strtofloat(Edit2.Text);

b:=strtofloat(Edit3.Text);

metoddix(a,b,t,cor,n);

F1book4.TextRC[1,4]:='дихотомия';

F1book4.TextRC[2,4]:='корень=';

F1book4.NumberRC[2,5]:=cor;

F1book4.TextRC[3,4]:='y=';

F1book4.NumberRC[3,5]:=f(cor);

F1book4.TextRC[4,4]:='количество итераций =';

F1book4.NumberRC[4,5]:=n;

assignfile(fail,'отчет.txt');

append(fail);

writeln(fail);

writeln(fail,'Расчет методом дихотомии');

 writeln(fail,'Точность расчета = ',t:10:7);

writeln(fail,'Начальное приближение:a = ',a:8:3,'  b = ',b:8:3);

 writeln(fail, 'Найден корень: x = ',cor:8:3,  '    y=f(x)= ',f(cor):8:6);

 writeln(fail, 'Количество итераций = ',n);

 closefile(fail);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

assignfile(fail,'отчет.txt');

rewrite(fail);

closefile(fail);

end;

procedure TForm1.N4Click(Sender: TObject);    // Вычисление корня методом хорд

begin

F1book2.ClearRange(1,1,100,2,3);

t:=strtofloat(Edit1.Text);

a:=strtofloat(Edit5.Text);

b:=strtofloat(Edit4.Text);

metodhord(a,b,t,cor,n);

F1book4.TextRC[6,4]:='хорды';

F1book4.TextRC[7,4]:='корень=';

F1book4.NumberRC[7,5]:=cor;

F1book4.TextRC[8,4]:='y=';

F1book4.NumberRC[8,5]:=f(cor);

F1book4.TextRC[9,4]:='количество итераций =';

F1book4.NumberRC[9,5]:=n;

assignfile(fail,'отчет.txt');

append(fail);

writeln(fail);

writeln(fail,'Расчет методом хорд');

 writeln(fail,'Точность расчета = ',t:10:7);

writeln(fail,'Начальное приближение:a = ',a:8:3,'  b = ',b:8:3);

 writeln(fail, 'Найден корень: x = ',cor:8:3,  '    y=f(x)= ',f(cor):8:6);

 writeln(fail, 'Количество итераций = ',n);

 closefile(fail);

end;

procedure TForm1.N5Click(Sender: TObject);      // Вычисление корня методом Ньютона

begin

F1book3.ClearRange(1,1,100,2,3);

t:=strtofloat(Edit1.Text);

a:=strtofloat(Edit7.Text);

metodnyutona(a,t,cor,n);

F1book4.TextRC[11,4]:='Ньютона';

F1book4.TextRC[12,4]:='корень=';

F1book4.NumberRC[12,5]:=cor;

F1book4.TextRC[13,4]:='y=';

F1book4.NumberRC[13,5]:=f(cor);

F1book4.TextRC[14,4]:='количество итераций =';

F1book4.NumberRC[14,5]:=n;

assignfile(fail,'отчет.txt');

append(fail);

writeln(fail);

writeln(fail,'Расчет методом Ньютона');

 writeln(fail,'Точность расчета = ',t:10:7);

writeln(fail,'Начальное приближение:a = ',a:8:3,'  b = ',b:8:3);

 writeln(fail, 'Найден корень: x = ',cor:8:3,  '    y=f(x)= ',f(cor):8:6);

 writeln(fail, 'Количество итераций = ',n);

closefile(fail);

end;

end.


Изображение окна приложения

Первоначальный интерфейс имеет следующий вид:

После выполнения расчетов при E<= 0,001:

В качестве отчета был сформирован файл  «Отчет.txt.»:


Анализ полученных результатов

В соответствии с заданием на курсовую работу в математическом пакете мною был найден корень нелинейного уравнения (x=-8) и построен график.

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

Для поиска корня в среде Delphi пользователь имеет возможность ввести точность вычисления с клавиатуры. Тестирование программы показало,  что при одной и той же заданной точности вычисления метод Ньютона находит искомое значение при меньшем числе итераций.

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


Литература.

  1.  Амосов А.А. и др. вычислительные методы для инженеров М., Высшая школа, 1994.
  2.  Фаронов В.В. Delphi. Программирование на зыке высокого уровня

               3.    Уокенбах Д. Microsoft Office Excel 2007. Библия пользователя

       Волков В.Б. Понятный самоучитель Excel 2010


 

А также другие работы, которые могут Вас заинтересовать

26307. Экономика стран Западной Европы в период новой истории. Переход к капиталистическому хозяйству 25.36 KB
  XVI в. вторая треть XVIII в. На экономическое развитие западноевропейских стран периода разложения феодализма и зарождения капитализма решающее влияние оказали: великие географические открытия XV XVI вв. В XVI в.
26308. Причины великих географических открытий 16.73 KB
  Причины великих географических открытий Особое место в процессе зарождения рыночных отношений занимали Великие географические открытия конец XVXVII век благодаря которым удалось установить новые торговые пути вовлечь в мировой хозяйственный оборот огромные ресурсы других стран и континентов. главными из которых были открытие Америки и морского пути в Индию вокруг Африки. В XIIIXV веках все кратчайшие торговые пути туда были перекрыты: турки захватили Балканы и Ближний Восток арабы Северную Африку Русь находилась под гнетом монгол...
26309. Важнейшие открытия XV – середины XVII в 19.21 KB
  В 14821486 годах Диогу Кан Cao пересек экватор открыл устье реки Конго и прошел вдоль побережья Африки до мыса Кросс. В 14871488 годах Бартоломеу Диаш совершил новое беспримерное плавание на юг. В 15921504 годах он совершил четыре плавания через Атлантический океан открыл Большие Антильские и часть Малых Антильских островов побережье Южной и Центральной Америки. В 14971498 годах Васко да Гама на четырех судах обогнул Африку и с помощью арабских кормчих достиг настоящей Индии.
26310. Последствия Великих географических открытий 17.9 KB
  Важнейшим следствием открытия и колонизации новых земель явилась революция цен которая дала мощный импульс первоначальному накоплениюкапитала в Европе и ускорила формирование капиталистического уклада в хозяйстве. цен на сельскохозяйственные и промышленные товары. цены были в основном стабильными то за 70 лет с 30х годов XVI в. Такое движение цен современники связывали либо с большим притоком драгоценных металлов в Европу либо с их утечкой.
26311. Колониальные захваты Испании и Португалии в XVI – XVII в 26.59 KB
  Плантационное рабство получило наибольшее развитие в Бразилии где выращивались сахарный тростник рис кукуруза и табак а также в ВестИндии Венесуэле и Новой Гранаде. С совершенно иными условиями встретились португальцы в Индии. Но португальцы сумели воспользоваться одним важным преимуществом: они обладали более сильным флотом чем мелкие феодальные владетели в Индии Индонезии ИндоКитае. Пиратскими методами захватывая грабя истребляя экипажи кораблей мусульманских купцов державших в своих руках морскую торговлю Индии до прихода...
26312. Реформация в Германии. М.Лютер 42.72 KB
  Религиозное настроение Германии проявлялось в переводах Библии и в развитии церковной песни еще до Лютера; своим знаменитым переводом и своей богослужебной лирикой он только затмил более ранние проблески стремления читать Священное Писание и молиться на родном языке. Годы непосредственно предшествовавшие выступлению Лютера и избранию на престол Карла V были временем большого возбуждения выразившегося в развитии литературы памфлетов и летучих листков. когда Лютер выступил со своими тезисами против индульгенций. после того как и Лютер и...
26313. Крестьянская война в Германии. Т.Мюнцер 40.51 KB
  Крестьянская война в Германии: Обострение классовой борьбы народных масс в деятельность союза Башмак С наступлением феодальной реакции нарастала борьба крестьян. характерно значительно более тесное сближение крестьянской массы с городскими низами чем в предшествовавший период. Усиление же крестьянскоплебейского лагеря не могло не оказать влияния на радикальные элементы в бюргерстве и на известный подъём бюргерской оппозиции вообще. Такое крестьянское общество было раскрыто в 1502 г.
26314. Реформация в Швейцарии. У.Цвингли и Ж.Кальвин 34.59 KB
  Начало же этому было положено в Цюрихе где в 1518 году священником кафедрального собора был избран известный проповедник Ульрих Цвингли. Даже изгнание Цвингли торговца индульгенциями монаха Самсона удостоилась не осуждения а похвалы представителя местного епископа. Так продолжалось до 1522 года когда Цвингли сам пошел на обострение ситуации. Однако и этот вызов не вызвал ожидаемых мер со стороны римского священноначалия напротив папский легат передал Цвингли письмо в котором ему сулились огромные блага если бы он стал поддерживать...
26315. Реформация и религиозные (гражданские) войны во Франции 29.06 KB
  Широко стали распространяться идеи Кальвина во Франции при короле Генрихе II. Именно при Генрихе II кальвинизм во Франции достиг наибольшего распространения. Ослабление королевской власти при сыновьях Генриха II благоприятствовало политическим притязаниям феодальной аристократии и борьба за религиозную свободу слилась с борьбой за власть. Своего короля Генриха Наваррского гугеноты воспринимали как конституционного государя.