МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
кафедра „КОМП’ЮТЕРИЗОВАНІ СИСТЕМИ, АВТОМАТИКА І УПРАВЛІННЯ”
ЗВІТ
до лабораторної роботи № 3
З КУРСУ “Комп’ютерні методи дослідження систем керування”
на тему: „ МЕТОДИ УТОЧНЕННЯ КОРЕНІВ НЕЛІНІЙНИХ РІВНЯНЬ ”
Варіант № 3
Мета роботи: вивчити основні методи уточнення коренів нелінійних рівнянь з одним невідомим.
№
п/п
Завдання
(метод та проміжок локалізації кореня)
3
Метод хорд
№3
Метод хорд
У літературі цей метод також зустрічається під назвами методу помилкового положення, методу лінійного інтерполювання та методу пропорційних частин.
Нехай нам дано відрізок на якому є локалізовано корінь , при цьому . Ідея методу хорд полягає в тому, що на достатньо малому проміжку дуга кривої замінюється стягуючою хордою. В якості наближеного значення кореня приймається крапка перетину хорди з віссю (рис. 5).
Запишемо рівняння хорди
(3.1)
У крапці перетину з віссю , а . Перепишемо рівняння (3.1)
(3.2)
Далі обчислюємо значення функції . Якщо , тоді ділянку відкидаємо з розгляду, в іншому випадку відкидаємо ділянку . Це реалізовується шляхом присвоєння координаті чи значення . Після цього будуємо нову пряму та шукаємо її перетин з віссю згідно такого рівняння
(3.3)
Ітераційний процес завершується згідно умови близькості двох послідовних наближень (3.4)
або згідно умови (2.6).
Загальний алгоритм методу хорд
;
якщо {}
інакше {}
Умова збіжності
Опис алгоритму
На початку алгоритму задаємо значення величин , та відносну похибку у відсотках. При цьому приймаємо як найперше наближення для , наприклад, значення координати .
Обчислюємо значення функції у координатах , , уточнене значення і значення функції для нього та згідно умови виконуємо наступне звуження робочого відрізку.
Здійснюємо перевірку умови збіжності. Якщо вона не виконується, то процес уточнення повторюємо (п.2).
Для перевірки вірності роботи алгоритму підставляємо наше уточнене значення кореня у функцію . Значення функції має бути близьким нулю, у залежності від вибраного значення .
Якщо ж нам замість значень відрізку дано лише одну з його координат, наприклад , та поставлено завдання самому віднайти відрізок локалізації кореня , то підхід буде ідентичним тому, що описаний у попередньому методі поділу проміжку навпіл.
Загальний алгоритм методу хорд з пошуком ділянки локалізації
;
якщо ( та ) {}
поки
;
;
Пошук ділянки
локалізації:
;
якщо {}
інакше {}
Умова збіжності
Ітераційний
процес:
Опис алгоритму
На початку алгоритму задаємо значення величин , та відносну похибку у відсотках.
Визначаємо напрямок пошуку ділянки локалізації кореня . Обчислюємо координату . У циклі виконуємо пошук ділянки локалізації кореня . Приймаємо як найперше наближення для , наприклад, значення координати .
Ітераційний процес методу: обчислюємо значення функції у координатах , , уточнене значення і значення функції для нього та згідно умови виконуємо наступне звуження робочого відрізку.
Здійснюємо перевірку умови збіжності. Якщо вона не виконується, то процес уточнення повторюємо (п.3).
Для перевірки вірності роботи алгоритму підставляємо наше уточнене значення кореня у функцію . Значення функції має бути близьким нулю, у залежності від вибраного значення .
Блок-схема розробленої програми:
Список змінних, які використовуються в коді програми, та їх пояснення:
A[n][n] – матриця розмірністю 4*4;
P[n], inx[n], V[n][n], X[n], Y[n], C[n][n], max, value, z ,p, k, s, b – змінні типу double;
B[n] – стовпець вільних членів;
l, f, h, w, i, j – змінні типу int;
Остаточна версія програми
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x, b, xold, h=0.01 , a=0.1, ee=0.000001;
double fa, fb, fx;
b = a + h;
fa = sin(a/4)-log(a);
fb = sin(b/4)-log(b);
if((fabs(fb))>(fabs(fa))&& fa*fb > 0)
h= -1 * h;
b=a+h;
fb=sin(b/4)-log(b);
while(fa*fb<0)
{
a=b;
b=a+h;
fa=sin(a/4)-log(a);
fb=sin(b/4)-log(b);
}
x=a;
do
{
xold=x;
fa=sin(a/4)-log(a);
fb=sin(b/4)-log(b);
x= a-fa*(b-a)/(fb-fa);
fx=sin(x/4)-log(x);
if(fx*fa>0)
a=x;
else
b=x;
}
while(fabs((x-xold)/x)*100 < 0.05);
Memo1->Lines->Add(x);
Memo1->Lines->Add(sin(x/4)-log(x));
}
//---------------------------------------------------------------------------
Результат роботи програми
Висновок
На цій лабораторні роботі я вивчив основні методи уточнення коренів нелінійних рівнянь з одним невідомим.