Контрольная работа - Решение системы нелинейных уравнений
.docМинистерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Уфимский государственный нефтяной технический университет»
Кафедра «Вычислительная техника и инженерная кибернетика»
ОТЧЁТ
по лабораторной работе № 8
«Решение системы нелинейных уравнений»
(Вариант № 100)
Выполнил студент гр. ПО-04-01 _____________ А.А. Бусов
(подпись, дата)
Проверил доцент каф. ВТИК _____________ И.Г. Мухамадеев
(подпись, дата)
Уфа, 2006
1. Постановка задачи.
Дана система нелинейных уравнений F(X) = 0.
Требуется найти решения системы методом простых итераций с улучшением Зейделя с точностью = 0.001, 0.0001.
2. Анализ задачи.
Запишем систему в стандартном виде
Область определения функций системы:
Df1 = {-∞ < x1 < ∞; -∞ < x2 < ∞};
Df2 = {-1 ≤ x1 ≤ 1; -1,195 ≤ x2 ≤ 1,195};
Область существования решений системы:
Do = {-1 ≤ x1 ≤ 1; -1,195 ≤ x2 ≤ 1,195};
В MathCADе построим графики функций:
По графику видно, что данная система имеет 4 решения:
DI = {0 < x1 < 0,1; -1,3 < x2 < -1,1};
DII = {0,7 < x1 < 0,9; -0,6 < x2 < -0,8};
DIII = {-0,1 < x1 < 0; 1,1 < x2 < 1,3};
DVI = {-0,9 < x1 < -0,7; 0,6 < x2 < 0,8};
Получим формулы сходящегося итерационного процесса для всех решений системы.
Для решения I:
Определим частные производные:
Проверим условия сходимости в окрестности первого решения, взяв точку из области существования этого решения х1=0,1; х2=-1,2.
Условия сходимости соблюдаются, следовательно полученную эквивалентную систему можно использовать для уточнения первого решения.
Для решения II:
Определим частные производные:
Проверим условия сходимости в окрестности второго решения, взяв точку из области существования этого решения х1=0,7; х2=-0,7.
Условия сходимости соблюдаются, следовательно полученную эквивалентную систему можно использовать для уточнения второго решения.
Для решения III:
Определим частные производные:
Проверим условия сходимости в окрестности первого решения, взяв точку из области существования этого решения х1=-0,1; х2=1,2.
Условия сходимости соблюдаются, следовательно полученную эквивалентную систему можно использовать для уточнения третьего решения.
Для решения VI:
Определим частные производные:
Проверим условия сходимости в окрестности первого решения, взяв точку из области существования этого решения х1=-0,7; х2=0,7.
Условия сходимости соблюдаются, следовательно полученную эквивалентную систему можно использовать для уточнения четвертого решения.
3. Решение системы с помощью пакета MathCAD
4. Текст программы.
//----------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------
float x1(float x[2]){
return sqrt(1-0.7*x[1]*x[1]);}
float x2(float x[2]){
return (x[1]+tan(x[0]*x[1]+1)-x[1]*x[1]);}
//----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float x[2],y[2],E,q; int n=2,kmax,k;
x[0]=StrToFloat(Edit1->Text);
x[1]=StrToFloat(Edit2->Text);
E=StrToFloat(Edit3->Text);
kmax=StrToInt(Edit4->Text);
k=0;
do{
k=k+1;
for (int i=0;i<2;i++) y[i]=x[i];
if(x[1]<=-1) {
x[0]=x[0]+2.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);
x[1]=-sqrt(tan(x[0]*x[1]+1)); }
if(x[1]>-1 && x[1]<=0) {
x[0]=sqrt(1-0.7*x[1]*x[1]);
x[1]=-sqrt(tan(x[0]*x[1]+1)); }
if(x[1]>=0 && x[1]<1) {
x[0]=x[0]+1.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);
x[1]=sqrt(tan(x[0]*x[1]+1)); }
if(x[1]>=1) {
x[0]=x[0]-1.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);
x[1]=sqrt(tan(x[0]*x[1]+1)); }
q=1.0/n*(fabs(x[0]-y[0])+fabs(x[1]-y[1])); }
while(q>E && k<kmax);
AnsiString f;
Memo1->Lines->Add("x1 = "+f.sprintf(" %5.10f", x[0]));
Memo1->Lines->Add("x2 = "+f.sprintf(" %5.10f", x[1]));
Memo1->Lines->Add("Достигнутая точность = "+f.sprintf(" %5.10f", q));
Memo1->Lines->Add("Количество итераций: "+IntToStr(k));
}
//----------------------------------------------------------------
5. Результаты расчётов, выполненные с помощью
подготовленной программы на Си.
6. Выводы
Анализ результатов показывает, что программа работает правильно и верно находит корни системы нелинейных уравнений. При увелечении точности увеличивается количество итераций, а при более близком к точному начальном приближении сходимость происходит быстрее и, следовательно, количество итераций уменьшается.