Численные методы решения алгебраических уравнений

Программы, позволяющие решать алгебраические уравнения различными методами: EMSolutionLight, Task Light, SMath Studio. Реализация программы на языке Delphi, выполняющей решения алгебраических уравнений методом простых итераций и деления отрезка пополам.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.10.2012
Размер файла 265,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

"Самарский государственный университет"

Кафедра безопасности информационных систем

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

Численные методы решения алгебраических уравнений

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

курса 2 группы 20201.10

Романенкова Наталья Михайловна

Самара 2012

Содержание

Введение

1. Алгебраические уравнения. Определение

2. Методы решения алгебраических уравнений

2.1 Метод простых итераций

2.2 Метод деления отрезка пополам

3. Реализация анализируемых методов в программе

Заключение
Список используемой литературы
Приложение
Введение
Численные методы решения различных видов уравнений - это алгоритмы нахождения приближённых (а иногда и точных) значений искомого решения. Решение алгебраических уравнений при этом получаются в виде значений аргументов, вычисленных с определённой степенью точности, а решения дифференциальных уравнений в виде таблицы. Численные методы не позволяют найти общего решения системы; они могут дать только частное решение. Однако эти методы применимы к очень широким классам уравнений и всем типам задач для них.
Численные методы можно применять только к корректно поставленным задачам.
Успешное решение большинства научно-технических задач зависит в значительной степени от быстрого и точного решения систем линейных алгебраических уравнений. Многие методы решения нелинейных задач также сводятся к решению некоторой последовательности линейных систем. В настоящее время хорошо разработан арсенал численных методов решения линейных алгебраических уравнений с использованием ЭВМ, а также математический аппарат, который позволяет оценить точность полученного решения и определить количество верных знаков вычисленного решения. Несмотря на то, что существует ряд программ, позволяющих решать алгебраические уравнения различными методами (такие, как EMSolutionLight, Task Light, SMath Studio и др.), периодически на практике возникает необходимость написания программы для удобства вычисления. В данной курсовой работе реализуется программа, которая выполняет решения некоторых алгебраических уравнений методом простых итераций и методом деления отрезка пополам. Программа выполнена на языке программирования Delphi.
программа алгебраический уравнение delphi
1. Алгебраические уравнения. Определение
Пусть функции f(x) и ц(x) определены на некотором множестве A. И пусть необходимо найти множество X, на котором эти функции принимают равные значения, другими словами, найти все значения x, для которых выполняется равенство: f(x)= ц(x).
При такой постановке это равенство называется уравнением с неизвестным x.
Уравнение называется алгебраическим, если в нем над неизвестным выполняются только алгебраические операции - сложение, вычитание, умножение, деление, возведение в степень и извлечение корня с натуральным показателем [1].
Алгебраические уравнения содержат только алгебраические функции (целые, рациональные, иррациональные). Алгебраическое уравнение в общем виде можно представить многочленом n-ой степени с действительными коэффициентами:
Например,
.
Множество A называется множеством (областью) допустимых значений неизвестного для данного уравнения.
Множество X называется множеством решений, а всякое его решение x=a - корнем данного уравнения. Решить уравнение - значит найти множество всех его решений или доказать, что их нет.
2. Методы решения алгебраических уравнений

Во многих научных и инженерных задачах требуется решить уравнение вида

, (1)

где f (x) - заданная непрерывная нелинейная функция.

Аналитически удается найти решение только для простейших уравнений. В большинстве же случаев приходится решать уравнение вида (1) численными методами.

Численное решение уравнения (1) обычно проводится в два этапа. На первом этапе нужно найти такие интервалы изменения переменной x, где расположен только один корень. Эта задача обычно решается графически. На втором этапе проводится уточнение отдельных корней. Для этого используются различные методы.

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

Прямые методы - решение находится за ранее известное число арифметических действий, решение строгое. Примеры: метод Гаусса, метод квадратного корня, правило Крамера и т. д.

Итерационные методы - это методы последовательных приближений, в которых нельзя предсказать число арифметических действий, которое потребуется для решения уравнения (системы) с заданной точностью [3]. Примеры: метод простых итераций, метод Гаусса-Зейделя, метод деления отрезка пополам и т.д.

В данной работе изучаются и сравниваются метод простых итераций и метод половинного деления отрезка.

2.1 Метод простых итераций

Одним из наиболее важных численных методов решения нелинейных уравнений является метод итераций (метод последовательных приближений). Сущность метода заключается в следующем. От исходного уравнения (1) нужно перейти к эквивалентному уравнению

, (2)

где.

Пусть имеется некоторое начальное приближение к корню. Подставив его в правую часть уравнения (2) и получив новое приближение: , аналогичным образом находится и т.д.,

. (3)

Корень найден, если , где е - заданная погрешность.

Необходимо установить при каких условиях итерационный процесс (3) будет сходиться к корню уравнения . Пусть в итерационной формуле (3)

,

где и - отклонения k -го и (k +1)-го приближений от корня.

Если процесс уточнения осуществляется вблизи корня , то функцию ц(x) можно приближенно представить двумя членами ряда Тейлора. Тогда (3) примет вид:

.

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

Итерационные процессы могут быть односторонними, если и двусторонними, если [2].

2.2 Метод деления отрезка пополам (метод бисекций).

Пусть на отрезке [a,b] расположен один корень уравнения (1), который необходимо уточнить с погрешностью е (рис.1).

Рис.1 - Метод половинного деления

Т.к. известно, что на интервале [a,b] уравнение имеет только один корень и f (x) - непрерывная функция, то выполняется условие f (a) f (b) < 0.

Суть метода половинного деления заключается в следующем. Сначала необходимо найти середину отрезка [a,b]:

и вычислить f (c). Теперь надо сделать выбор, какую из двух частей отрезка взять для дальнейшего уточнения корня. Т.к. f (x) - непрерывная функция, то корень будет находиться в той половине отрезка, на концах которого f (x) имеет разные знаки. На рис. (1) это будет отрезок [a,c], т.е. для очередного шага уточнения точку a нужно переместить в середину отрезка c и продолжить процесс деления как с первоначальным интервалом [a,b ].

Итерационный процесс продолжается, пока интервал [a,b ] не станет меньше заданной погрешности е.

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

3. Реализация анализируемых методов в программе

Блок-схема исследуемого метода простых итераций приведена на рис.

Рис. 2. - Блок-схема метода простых итераций

Часть кода программы, непосредственно реализующая изучаемый метод простых итераций:

ynul:=j;

repeat //метод простой итерации

y:=znach1(ynul);

i:=abs(y-ynul);

ynul:=y;

until (i<eps);

Блок-схема исследуемого метода бисекций приведена на рис. 3.

Рис.3. - Блок-схема алгоритма метода деления отрезка пополам

Часть кода программы, непосредственно реализующая изучаемый метод деления отрезка пополам:

begin

repeat

if Abs(znach(l))<eps then

{являются ли границы отрезка корнями уравнения}

begin

t:=l;

break;

end

else if Abs(znach(s))<eps then

begin

t:=s;

break;

end

else begin

t:=0.5*(l+s);

r1:=znach(l);

r2:=znach(t);

if r1*r2<=0 then

begin

s:=t

end

else

begin

l:=t

end;

end

until false;

Листинг программы приведен в приложении.

Заключение

В данном курсовом проекте проанализирован метод простых итераций и метод бисекций.

Была углубленно изучена возможность реализации этих методов в графическом режиме на языке Delphi.

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

При выполнении данной работы были рассмотрены теоретически и практически основные характеристики метода простой итерации и метода бисекций для алгебраических уравнений.

Метод бисекций является самым точным методом поиска простого корня уравнения. Этот метод требует непрерывности функции, кроме того, на концах отрезка функция должна иметь разные знаки. Скорость его сходимости невысока. Не обобщается на системы из нескольких уравнений. Требуемое обычно большее число итераций по сравнению с методом простых итераций не является препятствием к применению этого метода, если каждое вычисление значения функции несложно. Этот метод является надежным для заданной точности.

Метод простых итераций также обладает медленной скоростью сходимости. К недостаткам этого метода добавляется неоднозначность в выборе общей формулы для итераций. При этом успех во многом определяется удачным выбором начальных приближений неизвестных: они должны быть достаточно близкими (несколько долей единицы) к истинному решению.

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

Список используемых источников

1 Пирумов, У.Г. Численные методы. Учебное пособие. - М.: МАИ, 1998. - 188 с.

2 Марчук, Г.И. Методы вычислительной математики. - М.: Наука,1980.-213с.

3 Колдаев, В. Д. Численные методы и программирование. - ИД "ФОРУМ": ИНФРА-М, 2009.-336с.

Приложение

unit Unit1;

interface

uses

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

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioButton3: TRadioButton;

Button1: TButton;

Memo1: TMemo;

Button2: TButton;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Edit2: TEdit;

Label6: TLabel;

Edit3: TEdit;

Edit1: TEdit;

Label7: TLabel;

Button3: TButton;

Button4: TButton;

Memo2: TMemo;

Edit4: TEdit;

Label8: TLabel;

Edit5: TEdit;

Label9: TLabel;

Label10: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const eps=1/1000;

var

Form1: TForm1;

nach,kon,l,s,tmp:extended;

n,m:integer;

x,p:array of integer;

a,b:extended;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

{осуществляет ввод необходимых коэф и их обработку}

var i:integer;

begin

nach:=StrToFloat(Edit2.Text);

kon:=StrToFloat(Edit3.Text);

if RadioButton1.Checked then //если нажимаем выбрать логарифм

begin

a:=StrToFloat(inputbox('Коэффициенты','Введите чему равен А','1'));

end

else if RadioButton2.Checked then //если выбрали синус

begin

b:=StrToFloat(inputbox('Коэффициенты','Введите чему равен В','1'));

end

else//или полином

begin

n:=StrToInt(inputbox('Полином','Введите степень полинома','2'));

SetLength(x,n+1);//создание динам массива Х с колличеством элементов n+1

for i:= 0 to n do x[i]:=StrToInt(inputbox('Полином','Введите коеффициент перед х в '+IntToStr(i)+'-ой степени','2'));

//вводим коэф полинома и их в массив

end; end;

function Znach1(t:extended):extended;//значение логарифма в точке

begin

znach1:=ln(a*t)

end;

function Proizvod1(t:extended):extended;//значение производной логарифма в точке

begin

Proizvod1:=1/t;

end;

function Znach2(t:extended):extended;//синус

begin

znach2:=sin(b*t);

end;

function Proizvod2(t:extended):extended;

begin

Proizvod2:=b*cos(b*t);

end;

function Znach3(t:extended):extended;//аналогично для полинома

var i:integer;

sum,k:extended;

begin

if x[1]=0 then Form1.Memo1.Lines.Add('введен недопустимый коэффициент перед х. пожалуйста, повторите ввод')

{если перед Х коэф нуль}

else

begin

k:=t; sum:=x[0];

for i:=2 to n do

begin

k:=t*k;

sum:=sum+x[i]*k;

end;

result:=sum/(-x[1]);

end; end;

function Proizvod3(t:extended):extended;

var i:integer;

sum,k:extended;

begin

k:=1; sum:=0;

for i:=2 to n do

begin

k:=t*k;

sum:=sum+x[i]*k*i;

end;

result:=sum/(-x[1]);

end;

procedure TForm1.Button2Click(Sender: TObject);

var fa,fb,j,ynul,y,i:extended;

begin

if RadioButton1.Checked then //ОДЗ для логарифма

begin

if (nach<=0) or (kon<=0) then Memo1.Lines.Add('введен недопустимый отрезок. пожалуйста, повторите ввод')

else

if (a<=2.7) then Form1.Memo1.Lines.Add('введен недопустимый коэффициент A - решений не будет. пожалуйста, повторите ввод')

else

begin

fa:=proizvod1(nach);//если все норм, то производные на концах отрезка находим

fb:=proizvod1(kon);

end;

end

else if RadioButton2.Checked then//аналогично для синуса и полинома

begin

fa:=proizvod2(nach);

fb:=proizvod2(kon);

end

else

begin

fa:=proizvod3(nach);

fb:=proizvod3(kon);

end;

j:=(nach+kon)/2;//начальное приближение определяем как середину отрезка

if RadioButton1.Checked then

begin //если логарифм, то

if (fa<1) and (fb<1) then

begin

if (fa>0) and (fb>0) then Memo1.Lines.Add('сходимость односторонняя')

else if (fa>(-1)) and (fb>(-1)) then Memo1.Lines.Add('сходимость двусторонняя');

//проверяем необходимое условие сходимости и, если все нормально, то считаем корень

ynul:=j;

repeat //метод простой итерации

y:=znach1(ynul);

i:=abs(y-ynul);

ynul:=y;

until (i<eps);

Memo1.Lines.Add('корень на заданном отрезке: ' + FloatToStr(y) + ' с точностью = '+FloatToStr(eps))

end

else Memo1.Lines.Add('итерации не сходятся');

end

else if RadioButton2.Checked then //тоже самое для синуса и полинома

begin

if (fa<1) and (fb<1) then

begin

if (fa>0) and (fb>0) then Memo1.Lines.Add('сходимость односторонняя')

else if (fa>(-1)) and (fb>(-1)) then Memo1.Lines.Add('сходимость двусторонняя');

ynul:=j;

repeat

y:=znach2(ynul);

i:=abs(y-ynul);

ynul:=y;

until (i<eps);

Memo1.Lines.Add('корень на заданном отрезке: '+FloatToStr(y)+' с точностью = '+FloatToStr(eps))

end

else Memo1.Lines.Add('итерации не сходятся');

end

else begin

if (fa<1) and (fb<1) then

begin

if (fa>0) and (fb>0) then Memo1.Lines.Add('сходимость односторонняя')

else if (fa>(-1)) and (fb>(-1)) then Memo1.Lines.Add('сходимость двусторонняя');

ynul:=j;

repeat

y:=znach3(ynul);

i:=abs(y-ynul);

ynul:=y;

until (i<eps);

Memo1.Lines.Add('корень на заданном отрезке: '+FloatToStr(y)+' с точностью = '+FloatToStr(eps))

end

else Memo1.Lines.Add('итерации не сходятся');

end

end;

procedure TForm1.Button3Click(Sender: TObject);

var i:integer;

begin

m:=StrToInt(Edit1.Text);//степень полинома

SetLength(p,m+1);

for i:= 0 to m do p[i]:=StrToInt(inputbox('Полином','Введите коеффициент перед х в '+IntToStr(i)+'-ой степени','2'));

//для второго метода заполняем массив коэффициентами полинома

end;

function Znach(t:extended):extended; //значение полинома в точке

var i:integer;

sum,k:extended;

begin

k:=1; sum:=p[0];

for i:=1 to m do

begin

k:=t*k;

sum:=sum+p[i]*k;

end;

result:=sum;

end;

procedure TForm1.Button4Click(Sender: TObject);

var t,r1,r2:extended;

begin

l:=StrToFloat(Edit4.Text);

s:=StrToFloat(Edit5.Text);//считываем отрезок

r1:=znach(l);

r2:=znach(s); //ну и сам метод математический

if r1*r2>0 then

Memo2.Lines.Add('корня на заданном отрезке нет!')

else begin

repeat

if Abs(znach(l))<eps then

{являются ли границы отрезка корнями уравнения}

begin

t:=l;

break;

end

else if Abs(znach(s))<eps then

begin

t:=s;

break;

end

else begin

t:=0.5*(l+s);

r1:=znach(l);

r2:=znach(t);

if r1*r2<=0 then

begin

s:=t

end

else

begin

l:=t

end;

end

until false;

Memo2.Lines.Add('корень на заданном отрезке: '+FloatToStr(t)+' с точностью = '+FloatToStr(eps))

end;

end;

end.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.