Численные методы решения алгебраических уравнений
Программы, позволяющие решать алгебраические уравнения различными методами: 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
Подобные документы
Методы решения систем линейных алгебраических уравнений. Метод простых итераций и метод Зейделя. разработка программы для решения СЛАУ с произвольным количеством уравнений. Реализация методов Зейделя и простых итераций для получения вектора решений СЛАУ.
курсовая работа [25,0 K], добавлен 20.11.2008Методы решения нелинейных уравнений: прямые и итерационные. Методы решения трансцендентных, алгебраических уравнений. Метод деления отрезка пополам, Ньютона, простой итерации. Поиск корня уравнения методом простой итерации с помощью электронных таблиц.
контрольная работа [2,4 M], добавлен 16.12.2011Численные методы решения задач. Решение алгебраических и трансцендентных уравнений. Уточнение корня по методу половинного деления. Решение систем линейных уравнений методом итераций. Методы решения дифференциальных уравнений. Решение транспортной задачи.
курсовая работа [149,7 K], добавлен 16.11.2008Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Сущность матричного метода. Разработка программы решения системы уравнений линейных алгебраических уравнений методом решения через обратную матрицу на языке программирования Delphi. Представление блок-схемы и графического интерфейса программного продукта.
курсовая работа [1,0 M], добавлен 27.09.2014Метод Гаусса-Зейделя как модификация метода Якоби, его сущность и применение. Разработка программы решения системы линейных алгебраических уравнений на языке VB, проверка правильности работы программы в MS Excel и математических пакетах MathCad и MatLab.
курсовая работа [325,5 K], добавлен 27.10.2013Описание алгоритма создания программы для решения алгебраических или трансцендентных уравнений с помощью численного метода Бернулли. Нахождение значений корней алгебраического уравнения с заданными параметрами точности. Листинг программы на языке java.
контрольная работа [206,0 K], добавлен 19.06.2015Сущность и особенности языка программирования Си. Основные этапы алгоритма решения системы линейных алгебраических уравнений методом Гаусса, реализация программы для их расчета. Инструкции пользователя и программиста. Тестирование функции решения.
курсовая работа [153,9 K], добавлен 18.02.2013Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.
курсовая работа [435,8 K], добавлен 15.06.2013